为什么xUnit Runner找不到我的测试

65

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

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

VS 2012的xUnit插件显示:

没有找到可运行的测试。

TestDriven.net正常运行但提到了Ad hoc

1个通过,0个失败,0个跳过(请参见“任务列表”),耗时0.47秒(Ad hoc)

TeamCity、xunit.gui.exexunit.console.exe以及Visual Studio也无法找到TestMethod

(我已经安装了xunit.runner.visualstudio,而且VS能看到一些测试。)

是什么问题呢?


相关链接:https://dev59.com/znLYa4cB1Zd3GeqPWFCx#NqMIoYgBc1ULPQZFaBf_ - Ruben Bartelink
相关(VS2015):https://dev59.com/qFsW5IYBdhLWcg3wVV_j#35103782 - Ruben Bartelink
10个回答

102

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


出于效率的考虑,xUnit的作者选择在搜索测试类时不使用BindingFlags.NonPublic(MSIL元数据表没有像索引private / internal类那样的索引,因此Reflection能够实现相对高效的性能差异)。

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

测试方法是privatestatic的事实是可以的-xUnit从1.0开始就支持这两个方面。

请注意,Visual Studio xUnit Runner扩展程序,xunit.console.exe(以及GUI),xunit MSBuild任务,Resharper和CodeRush在遵守此规则方面始终如一(尽管可以认为它们[特别是后两者]可以更多地标记当一个测试类(即包含Fact派生注释的类[可能间接])是private时)。

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

值得注意的是,NUnit(我非常确定MSTest也是如此)使用private reflection [因此在private类中选择测试],这可能就是为什么以前您从未关心过此类问题的原因。

注意:这种方式可以使得你将测试类private化,从而快速跳过测试类中的所有测试 [以及任何嵌套类],这是由此产生的副作用/技巧。但很遗憾,在这个星球上,无意中使用这种方法的情况远远超过了有意使用的情况!


2
我遇到了同样的问题,我的类是公共的,在尝试使用Visual Studio扩展xUnit Test Runner与VS 2012的MS Test运行器。 - Kyle Gobel
@Kyle,我不清楚你在做什么,或者看到了什么结果,也不知道任何人如何帮助你。我曾经有一个问题,你已经评论了我的解决方案。首先,请注意这个问题和答案都是关于xUnit.net的。你提到了MS Test,它依赖于内置运行器(我非常确定MSTest不允许测试方法为私有)。 - Ruben Bartelink
1
抱歉问一个随意的评论问题,我的问题是我安装了预发布的NuGet包,它不包括xunit.dll而是xunit2.dll,所以它无法捕捉到任何测试。 - Kyle Gobel
@Kyle 啊,现在有意义了 - 至少足够有意义,可以作为答案添加,这样我就可以点赞了(我个人知道这一点,但我可以保证会有人被它咬到,并会感谢你)。 - Ruben Bartelink
不确定为什么这个回答没有比其他回答更高。我不得不滚动一些...仍在努力弄清楚为什么Visual Studio默认情况下不会公开。 - andrewCanProgram
显示剩余6条评论

42

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

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

    a. 在Visual Studio 2013中,转到“工具”->“扩展和更新”->“在线”

    b. 搜索xUnit.net Runner for Visual Studio 2012 and 2013

    c. 然后下载(安装)它。如果从VS 2012升级到VS 2013,则建议将其卸载,然后重新安装。

    d. 重启Visual Studio。

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

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

    a. 在Visual Studio 2013中,导航:Resharper -> Extension Manager.

    b. 在左侧,选择在线。

    c. 搜索“xunit.net”。 选择“xUnit.net Test Support”。 点击安装。

    d. 重启Visual Studio 2013。

  3. “清理”解决方案

    a. 在IDE中,在Solution Explorer中,右键单击解决方案,然后选择“Clean”。

    b. 重新编译。

    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相同。

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


1
VS 2013 + ReSharper 8.2 的明确答案 - Ognyan Dimitrov
1
对于VS 2013 + R# 8.2,我发现重新启动VS对我有用。这是在使用R#的扩展管理器下载和安装xUnit支持之后。 - JasonCoder
1
@RubenBartelink 当我写这篇文章时,我遇到了一些问题,无法让ReSharper运行我的xUnit测试,而且我的输出“未找到要运行的测试”与您的问题描述相同。我没有TestDriven.net,因此无法进行验证。我的许多xUnit问题都与通过NuGet或ReSharper安装的更新有关,因此需要说明如何处理它们的说明。 - CJBS
就像我之前所说的,这对人们来说肯定是有用的,但是TeamCity、xunit.gui.exe和xunit.console.exe也找不到TestMethod是我问题的关键。不过,正如我所说的,情况已经变得很好了——显然人们从你的回答中得到了帮助。 - Ruben Bartelink
1
@CJBS 我想我可以用更简单的方式来表达,就是将标题改为“为什么xUnit运行程序没有找到(一些)我的测试”。不过,反思一下,有时候一个一站式问题确实是人们需要的,即使这违背了一些SO原则。 - Ruben Bartelink
显示剩余4条评论

18

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

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


嘿,丹,我在这个问题的相关链接中有一个链接:https://dev59.com/qFsW5IYBdhLWcg3wVV_j#35103782,它解决了这类问题。我真的希望能让这个问题集中在xUnit无法看到测试的原因上。我真的希望你同意将其链接到那里是最好的选择。我是否可以在问题或答案中更清楚地表达这一点?(例如,在这里删除了3个其他类似的尝试帮助但会混淆问题的答案) - Ruben Bartelink
我遇到了相同的错误“找不到要运行的测试。” 对于您来说可能是不同的问题,但两种情况最终都会导致相同的错误。备选答案并不意味着有第二个问题。如果有什么的话,这个答案可以与已接受的答案合并,以显示测试未显示的所有原因。 - Dan Friedman
我们必须同意各自的看法。语境不同——我明确提到了VS2012,而你需要在VS2015中遇到一个特定(罕见)的问题,该问题与xUnit v2有关,而不是V1。有两个已删除的答案比你的更相关。我应该要求他们恢复(例如:resharper、.NET core beta、安装xUnit.Runner.Console而不是桌面版)。难道你不希望有一个resharper版本和一个VS2015版本,并让它在5年后仍然有用,而不是你的答案与VS2019答案竞争时完全无关吗? - Ruben Bartelink

14

我在VS2017 RC中遇到了同样的问题,针对.NET Core 1.1项目。更新xunit.runner后问题得到解决。

Install-Package xunit.runner.visualstudio

你能澄清一下,你是否最初安装了这个软件包?也就是说,我认为上面的命令需要一个“-Reinstall”标志,才能执行任何你没有做过的操作吗? - Ruben Bartelink
是的,我已经安装了这个包,这将xunit运行程序从2.2.0-beta5-build1225版本更新到了2.2.0版本。 - Dhanuka777
xunit.runner.console 不够用,但是当我安装了它,它就可以工作了。 - Alexander

6
(在其他答案的评论中提到) 相同的"No tests found to run"消息可能是由于使用NuGet获取xUnit.dll并最终获得版本2.0.0 (该版本目前被标记为预发行版本,因为某些核心功能,如v1测试的发现等尚未在该分支中实现)。
在这种情况下的解决方法是在NuGet包管理器中选择“仅稳定版”(而不是“包括预发行版”)。

这是xUnit开发人员相当愚蠢的选择,如果他们打算让2.0目前如此不稳定,他们应该将整个项目重命名为xUnit2而不是这样做。 - Chris Marisic

5

我最近在使用.NET Core时发现一个问题,无法发现测试类或测试方法。以下解决方法对我有效:

  1. Open a command prompt window.
  2. Change to the project directory.
  3. Build the project running the following command:

    dotnet build
    

注意:无法使用Visual Studio.NET构建!<<<<<<<<<<< 重要提示!

  1. 运行测试:测试 --> 运行 --> 测试全部 - CTRL+R +A(这将发现新的测试,但不会运行新的测试)。
  2. 再次运行测试。

嗨,请注意这里的问题是为什么只有一个TestClass出了问题。请将其作为自问自答的问题,并说明它特别适用于.NET Core(预发布版)。如果您能回答,将会有两个赞给您,而我真的不认为这对这个特定问题有帮助。 - Ruben Bartelink
我已经更新了我的答案,因为它只适用于一个类或一个方法,所以它找不到。有趣的是你指出它只是.NET Core预发布特定的。我们还没有升级。接下来就是计划。 - mkaj
只是稍微偏离了一下。我想这里的点赞会告诉我们是否有其他人认为这是正确的地方(请记住,标题是为什么 xUnit runner 找不到我的测试 - 有很多与 VS2015 特定问题相关的问题(或者你是使用 VS2017?))。 - Ruben Bartelink
我并不在意点赞。我在这里发布是为了为其他赌徒提供额外的选项 - 如果他们有同样的问题。这就是我发现解决方法的方式。我正在使用带有VS2015的.NET Core预发布版。 - mkaj
关于点赞的观点是,它们衡量了答案与a)问题和b)可以产生问题的搜索标准的相关性。我认为即使a)不是情况,b)也可能是情况。我自信地同意您并没有基于对虚假互联网积分的狂热渴望给出如此详细的答案,并且是在最好的诚信下行事;然而,我尊重地继续争论这个问题,即这个答案不是其最相关的可能位置(注意这里有3个其他作者删除的答案:1xResharper,1xDnx,1x未安装“xunit.runner.visualstudio”)。 - Ruben Bartelink
我曾经遇到过与VS2019类似的问题,即测试通过/失败图标显示在被测试的方法上。按照这个答案中指示的选择“测试”-->“运行”-->“全部测试”-CTRL+R+A解决了我的问题。 - nbstrat

4

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

仅缩短测试方法的名称就可以让xUnit发现单个测试。缩短整个类的名称可以让xUnit发现类中的所有测试。

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


+1 在测试发现时输出窗口中是否有任何消息?如果有的话,将其添加到帖子中会很有价值。 - Ruben Bartelink
3
很遗憾,它只是说“找不到要运行的测试”。在我添加一个名称可疑地很长的类和测试方法之前,我没有遇到任何问题,然后我把这两件事联系在了一起。 - StoriKnow

4

在我的情况下,为了查看任何测试,我必须完成以下步骤:

(所有都是通过NuGet包管理器安装的)

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

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


链接已损坏:404 - 这里没有 GitHub Pages 网站。 - Matt

0
我发现问题是因为我的测试类文件名是MyTests而不是MyTests.cs。IDE将其识别为C#测试类,但运行程序没有编译。
使用dotnet test --verbosity detailed命令有所帮助。

0
我的问题是我将 xunit.runner.visualstudio 更新到版本 2.4.5。然而,我正在为 .NET Standard 2.0 工作的项目。因此,我不得不降级到支持“.NET 2.0 或更高版本”的版本 2.4.3xunit.runner.visualstudio。但自从版本 2.4.4 开始,支持“.NET Core 3.1 或更高版本”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接