66

我有一个 xUnit.net 测试如下:

static class MyTestClass
{
    [Fact]
    static void MyTestMethod() 
    {
    }
}

VS 2012 的 xUnit 插件说:

没有发现要运行的测试。

TestDriven.net 运行良好,但提到了一些关于 Ad hoc 的内容

1 次通过,0 次失败,0 次跳过(参见“任务列表”),耗时 0.47 秒(临时)

TeamCityxunit.gui.exexunit.console.exeVisual Studio 也找不到TestMethod

(我已经xunit.runner.visualstudio安装并且 VS 正在查看一些测试。)

是什么赋予了?

4

8 回答 8

101

TL;DR 你的测试类必须public(但你的测试方法可以是private和/或static


出于效率的原因,xUnit 作者选择BindingFlags.NonPublic在运行器中搜索测试类时不使用(MSIL 元数据表不会以相同程度索引private(/ internal) 类,因此相对效率存在显着的性能差异,即因此可以实现反射)。

由于上述原因,您的classisprivate意味着它不会被拾取。

private测试方法很好而且很好的事实static- 自 1.0 以来的 xUnit 设计支持这两个方面。

请注意,Visual Studio xUnit Runner 扩展xunit.console.exe(和 GUI)、xunitMSBuild 任务、Resharper 和 CodeRush 在遵守这一点方面都是一致的(尽管可以说它们 [尤其是后两者] 可以在测试类(即类[可能间接地]包含Fact-派生的注释)是private)。

TestDriven.net 运行您的测试的原因是 TestDriven.net 的作者已经付出了巨大的努力来使其正常工作。它在内部使用一个特殊的 Test Runner 包装器/垫片(称为 Adhoc Runner)来运行您的测试。请注意,该方法实际上并未通过 xUnit.net 运行程序运行,因此您在测试中放置的任何具有副作用的属性都不会被触发。

值得注意的是,NUnit(我很确定 MSTest)确实使用了私有反射 [因此在private课堂上进行测试],这可能就是为什么它似乎从来没有让你担心过重要的事情。

注意:由此启用的副作用/技巧是,您可以创建一个测试类private作为Skipping 测试类 [和任何嵌套类] 中所有测试的快速方法。(可悲的是,在这个星球上,无意中使用这个的案例远远超过了有意使用的案例!)

于 2013-04-25T12:24:28.310 回答
43

此答案适用于 VS 2013,但步骤与 VS 2012 基本相同。这适用于通过ReSharper 的单元测试功能运行

  1. 为 Visual Studio 2013 安装 xUnit.net 运行程序(小心以管理员身份运行 Visual Studio,否则在以非管理员身份运行 IDE 时测试可能无法运行):

    一种。在 Visual Studio 2013 中,转到工具 -> 扩展和更新 -> 在线

    湾。为 Visual Studio 2012 和 2013 搜索 xUnit.net 运行器

    C。然后下载(安装)它。如果从 VS 2012 升级到 VS 2013,建议先卸载这个,然后重新安装。

    d。重新启动 Visual Studio。

  2. 如果安装了 ReSharper,请安装 xUnit.net 测试运行器插件:

    (注意:自 ReSharper 2016.1 起,ReSharper内置了 xunit 支持,这意味着不再需要 xunit 插件。)

    一种。在 Visual Studio 2013 中,导航:Resharper -> 扩展管理器。

    湾。在左侧,选择在线。

    C。搜索“xunit.net”。选择“xUnit.net 测试支持”。单击安装。

    d。重新启动 Visual Studio 2013。

  3. “清洁”解决方案

    一种。在 IDE 的解决方案资源管理器中,右键单击解决方案,然后选择“清理”。

    湾。重新编译。

    C。现在,当右键单击[Fact]属性时,选择 Resharper 的“运行单元测试”(而不是默认的“运行测试”)

使用 XUnit 运行故障排除:

  • 如果使用 XUnit 运行 [Fact] 测试仍然存在问题,则可能需要从以下任何/所有文件夹中手动删除 xUnit 包(查看 xunit DLL 的内容,如果找到,则删除 xUnit 文件夹):

    • C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\Extensions\

    • C:\Users\<username>\AppData\Local\Microsoft\VisualStudio\12.0\Extensions\

  • 至于 ReSharper,请尝试卸载并重新安装 xunitcontrib 库(xUnit.net 测试支持)。我注意到卸载时有一次,一些错误消息闪烁过去。我有一次抓了一张屏幕截图,上面列出了:

    • 访问路径 C:\Users\<username>\AppData\Local\JetBrains\ReSharper\vAny\packages\xunitcontrib.1.3.0\ReSharper\v8.1\plugins\xunit.dll 被拒绝。
    • ...对于该目录中的其他 DLL 也是如此

要解决此问题,请C:\Users\<username>\AppData\Local\JetBrains\ReSharper\vAny\packages\xunitcontrib.1.3.0\在从 Visual Studio 卸载后删除该目录,然后以非管理员身份运行 Visual Studio,然后通过 ReSharper(Resharper -> Extension Manager)重新安装

于 2014-01-09T23:15:18.180 回答
18

来自http://xunit.github.io/docs/getting-started-desktop.html#run-tests-visualstudio

如果您在发现或运行测试时遇到问题,您可能是 Visual Studio 中损坏的运行程序缓存的受害者。要清除此缓存,请关闭 Visual Studio 的所有实例,然后删除文件夹 %TEMP%\VisualStudioTestExplorerExtensions。还要确保您的项目仅链接到单个版本的 Visual Studio 运行程序 NuGet 包 (xunit.runner.visualstudio)。

于 2016-10-19T08:09:51.403 回答
14

我在 VS2017 RC,.NET core 1.1 项目中遇到了同样的问题。更新 xunit.runner 对我有用,

Install-Package xunit.runner.visualstudio
于 2017-03-06T00:49:23.747 回答
6

(正如@Kyle 在另一个答案的评论中所提到的)No tests found to run使用 NuGet 获取 xUnit.dll 并最终获得版本 2.0.0 (当前标记为预发布作为一些核心功能,如发现v1 测试等尚未在该分支中实施)。

在这种情况下,解决方案是在 NuGet 包管理器中选择Stable Only版本(而不是Include Prerelease )。

于 2013-11-26T02:31:57.143 回答
4

就我而言,为了查看任何测试,我必须完成以下步骤:

(全部通过 NuGet 包管理器安装)

  1. 安装xUnitv2.0.50727
  2. 安装xUnit.extensionsv2.0.50727
  3. 导航到以下链接并按照文档中概述的步骤操作:http: //xunit.github.io/docs/running-tests-in-vs.html

我正在使用 Visual Studio 2013 Premium。(未安装 Resharper)

于 2015-03-10T09:41:50.923 回答
4

对我来说,我的测试类和测试方法名称的组合太长了;xUnit 似乎对这种组合有一些限制。

缩短测试方法的名称允许 xUnit 发现单个测试。缩短整个的名称允许 xUnit 发现类中的所有测试。

类名 + 方法名的阈值似乎是 172 个字符。

于 2016-08-09T15:05:51.253 回答
4

一段时间以来,我一直在使用 .NET Core 遇到这个问题,其中没有发现测试类或测试方法。以下修复适用于我:

  1. 打开命令提示符窗口。
  2. 切换到项目目录。
  3. 运行以下命令构建项目:

    dotnet build
    

注意:从 Visual Studio.NET 构建将不起作用!<<<<<<<<<<<重要!

  1. 运行测试:测试 --> 运行 --> 全部测试 - CTRL+R +A (这将发现新的测试 - 但不运行新的测试。
  2. 再次运行测试。
于 2016-12-07T02:51:52.400 回答