为什么xUnit Runner没有找到我的测试

时间:2013-04-25 12:23:31

标签: unit-testing visual-studio-2012 xunit.net testdriven.net

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

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

VS 2012的xUnit插件说:

  

没有发现任何测试。

TestDriven.net运行得很好but mentions something about Ad hoc

  

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

TeamCity,xunit.gui.exexunit.console.exe以及Visual Studio也找不到TestMethod

(我已安装xunit.runner.visualstudio,VS正在进行一些测试。)

是什么给出了?

8 个答案:

答案 0 :(得分:93)

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


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

由于上述原因,您classprivate的事实意味着它无法获取。

测试方法为privatestatic的事实很好 - xUnit是设计的,因为1.0支持这两个方面。

请注意,Visual Studio xUnit Runner扩展,xunit.console.exe(和GUI),xunit MSBuild任务,Resharper和CodeRush都符合这一点(尽管可以说是他们[特别是后两者]当测试类(即[可能间接地]包含Fact - 派生的annoations)类为private)时,可以做更多的事情来标记。

TestDriven.net运行测试的原因是TestDriven.net的作者已投入大量精力使其成为Just Work。它在内部使用一个特殊的Test Runner包装器/垫片(称为Adhoc Runner)来运行测试。请注意,该方法实际上并非通过xUnit.net运行器运行,因此您在测试中放置的任何具有副作用的属性都不会被触发。

值得注意的是NUnit(我非常肯定MSTest)使用私有反射[并因此在private类中选择测试]这可能是为什么它似乎永远不会是重要的你以前担心。

注意:由此启用的副作用/技巧是您可以将测试类private作为Skip ping测试类[和任何嵌套类]中所有测试的快捷方式。 (可悲的是,这个星球上的这种情况被无意中使用的数量远远超过了有意的情况!)

答案 1 :(得分:43)

此答案适用于VS 2013,但VS 2012的步骤基本相同。这适用于通过ReSharper's unit test functionality运行。

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

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

    湾搜索Visual Studio 2012和2013的xUnit.net runner

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

    d。重新启动Visual Studio。

  2. 如果安装了ReSharper,请安装xUnit.net test runner插件:

    一个。在Visual Studio 2013中,导航:Resharper - >扩展经理。

    湾在左侧,选择在线。

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

    d。重新启动Visual Studio 2013。

  3. “清理”解决方案

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

    湾重新编译。

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

  4. 使用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 - &gt; Extension Manager)重新安装

      < / LI>

答案 2 :(得分: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)。

答案 3 :(得分:13)

我在VS2017 RC,.NET核心1.1项目中遇到了同样的问题。更新xunit.runner为我工作,

Install-Package xunit.runner.visualstudio

答案 4 :(得分:6)

(正如@Kyle在其他答案的评论中所提到的)使用NuGet获取xUnit.dll并最终获得版本2.0.0(目前标记为2.0)可能导致No tests found to run消息相同预发布,因为发现v1测试等一些核心功能尚未在该分支中实现。)

在这种情况下,解决方法是在NuGet包管理器中选择仅稳定版本(而不是包含预先发布)。

答案 5 :(得分:4)

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

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

班级名称+方法名称的阈值似乎为172个字符。

答案 6 :(得分:3)

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

(全部通过NuGet Package Manager安装)

  1. 安装xUnit v2.0.50727
  2. 安装xUnit.extensions v2.0.50727
  3. 导航到以下链接,然后按照文档中列出的步骤进行操作:http://xunit.github.io/docs/running-tests-in-vs.html
  4. 我正在使用Visual Studio 2013 Premium。 (未安装Resharper)

答案 7 :(得分:2)

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

  1. 打开命令提示符窗口。
  2. 转到项目目录。
  3. 使用以下命令构建项目:

    dotnet build
    
  4. 注意:从Visual Studio.NET构建不起作用! &LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT; 重要!

    1. 运行测试:测试 - &gt;运行 - &gt;全部测试 - CTRL + R + A(这将发现新测试 - 但不运行新测试。
    2. 再次运行测试。