Visual Studio 2015 或 2017 没有发现单元测试

Visual Studio 2015 or 2017 does not discover unit tests

编辑 2016-10-19:

最初的问题是关于 XUnit 测试运行器的 VS2015 CTP6 的特定问题。从答案中可以清楚地看出,Visual Studio 中的单元测试发现存在更广泛的问题,这可能会在许多不同的情况下发生。我已经清理了我的问题以反映这一点。

我还在自己的答案中包含了一个脚本,直到今天我仍然使用它来解决出现的类似问题。

许多其他答案也被证明有助于更好地理解 VS 测试运行器的复杂性。我感谢人们仍在分享他们的解决方案!


原题2015-04-10:

从昨天开始,我的 Visual Studio 测试资源管理器将不会为我的任何项目发现测试。构建后也不显示绿色加载条。

当我转到 Visual Studio 测试资源管理器并单击 "Run All" 时,或者当我右键单击任何测试方法并 select "Run Tests" 时,我得到以下信息在我的输出中 window:

Could not load file or assembly 'Microsoft.VisualStudio.Web.ProjectSystem, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.

我是 运行 Visual Studio 2015 CTP 6 Windows 10 Pro Technical Preview,build 10041。.NET Framework 版本似乎并不重要 - 它发生在 4.04.5.24.6.

我尝试了以下测试框架,它们都给出了相同的行为:


我在 GitHub (xunit) 上发现了一个看起来类似的问题:Cannot get tests discovered #295,xunit 团队的评论是:

Be aware that Visual Studio 2015 CTP 5 has been reported to be broken by many people with unit testing in general (not just xUnit.net), so don't expect that to work.

Also, please make sure you've cleaned out Visual Studio's runner cache. If it gets corrupted, Visual Studio will permanently misbehave until it's deleted. To clear the cache, shut down all instances of Visual Studio, then delete the folder %TEMP%\VisualStudioTestExplorerExtensions (honestly, it probably wouldn't hurt to delete everything in %TEMP% that can be deleted).

我尝试了他们删除文件夹 %TEMP%\VisualStudioTestExplorerExtensions 的建议。不幸的是,这并没有解决问题。

我注意到 ReSharper 实际上 能够发现一些测试。它仅适用于 VS 和 NUnit 测试,不适用于 xunit。

必须要清除某种临时文件夹或缓存文件夹,但我知道 Visual Studio 有很多文件夹,但并非所有文件夹都可以删除而不会产生不必要的副作用。

编辑 2016-10-19(PowerShell 脚本)

这个问题仍然 returns 不时出现。我写了一个小的 PowerShell 片段来为我自动清除相关的 cache/temp folder/files。我在这里分享给未来的读者:

@(
"$env:TEMP"
"$env:LOCALAPPDATA\Microsoft\UnitTest"
"$env:LOCALAPPDATA\Microsoft\VisualStudio.033\SpecificFolderCache.xml"
"$env:LOCALAPPDATA\Microsoft\VisualStudio.033\ProjectTemplateMRU.xml"
"$env:LOCALAPPDATA\Microsoft\VisualStudio.0\ComponentModelCache"
"$env:LOCALAPPDATA\Microsoft\VisualStudio.0\Designer\ShadowCache"
"$env:LOCALAPPDATA\Microsoft\VisualStudio.0\ImageLibrary\cache"
"$env:LOCALAPPDATA\Microsoft\VisualStudio Services.0\Cache"
"$env:LOCALAPPDATA\Microsoft\WebsiteCache"
"$env:LOCALAPPDATA\NuGet\Cache"
) |% { Remove-Item -Path $_ -Recurse -Force }

确保事先关闭 Visual Studio,之后重新启动可能是个好主意。

删除 TEMP 文件夹可能没有必要,在某些情况下甚至可能是不可取的,因此我建议先尝试先不清除 TEMP 文件夹。只需省略 "$env:TEMP".

原回答2015-04-12

在彻底清理 Visual Studio 相关的 temp/cache 文件夹后,问题是 "solved"。

由于我没有时间逐一检查所有内容然后在中间进行测试,很遗憾,我不知道到底是哪一个导致了问题。

这些是我采取的确切步骤:

  1. 关闭Visual Studio
  2. 使用 CCleaner 清理系统和浏览器 temp files/folders
  3. 手动cleared/deleted以下files/folders:

    • %USERPROFILE%\AppData\Local\assembly
    • %USERPROFILE%\AppData\Local\Microsoft\UnitTest
    • %USERPROFILE%\AppData\Local\Microsoft\VisualStudio.033\SpecificFolderCache.xml
    • %USERPROFILE%\AppData\Local\Microsoft\VisualStudio.033\ProjectTemplateMRU.xml
    • %USERPROFILE%\AppData\Local\Microsoft\VisualStudio.0\ComponentModelCache
    • %USERPROFILE%\AppData\Local\Microsoft\VisualStudio.0\Designer\ShadowCache
    • %USERPROFILE%\AppData\Local\Microsoft\VisualStudio.0\ImageLibrary\cache
    • %USERPROFILE%\AppData\Local\Microsoft\VisualStudio Services.0\Cache
    • %USERPROFILE%\AppData\Local\Microsoft\WebsiteCache
    • %USERPROFILE%\AppData\Local\NuGet\Cache
    • %USERPROFILE%\AppData\Local\Temp

我对此没有完整的答案,但我通过测试项目确定了一些事情:

  1. 似乎是官方 beta4 aspnet5 版本的一部分的 xunit.runner.aspnet : 2.0.0-aspnet-beta4 在 Visual Studio 中不起作用。
  2. 相反,使用 "xunit": "2.1.0-*""xunit-runner.dnx": "2.1.0-*" 包在 Visual Studio 中确实有效。
  3. 为了让 VS 发现测试,您的项目必须有一个名为 "test" 的单一命令运行 "xunit.runner.dnx"。添加额外的命令可能会破坏它。
  4. 如果您的测试资源管理器 window 仍然是空的,请从您的项目中删除 "test" 命令,然后重新构建解决方案,然后将 "test" 命令添加回project.json.
  5. 按照@Fred-Kleuver 的建议清除所有缓存可能会有所帮助,但我没有单独完成所有步骤,所以我不确定。

这是最新的 VS 2015 CTP 6,使用的是 beta4 版本,而不是样片。

令我惊讶的是,清除 %TEMP% 目录中的临时文件解决了我的问题。

注:此路径一般在C:\Users\(yourusername)\AppData\Local\Temp

正如@Warren-P 所包含的,您可以通过在“开始”菜单中输入 %temp% 来导航到临时文件夹,或者启动 "File Explorer" 并在地址栏中输入 %temp%

就我而言,问题是 "between the chair and keyboard"。我已经切换到配置管理器中的配置,该配置不包括我的构建单元测试项目。切换回包含所有项目的配置(例如调试)解决了这个问题。

可能是您的代码是使用 x64 编译的,因此必须将默认处理器架构启用为 X64。

Test > Test Settings > Default Processor Architecture > X64
  • 检查一下,VisualStudio中是否安装了NUnit Test Adapter 2/3
    (Tools>Extensions and Updates )

  • 确保选择了正确的处理器架构:
    (Test>Test Settings>Default Processor Architecture)

我有同样的问题,但我的机器上不存在文件夹“%TEMP%\VisualStudioTestExplorerExtensions”,所以当我阅读帖子时,我有了创建它的想法并且它有效。测试资源管理器现在能够显示我的所有测试。 谢谢。

我遇到了同样的问题。我刚刚清理并重建了项目,我能够看到缺少的测试。

就我而言(Visual Studio Enterprise 2015 14.0.25425.01 Update 3,Resharper 2016.2)我只需要从“构建”菜单中执行清理解决方案。重建解决方案然后使测试资源管理器 "wake up" 并再次找到所有测试。

就我而言,VS 2015 下的 MSTest 忽略了测试(即方法)名称超过 174 个字符的测试。缩短名称允许测试可见。这是通过操纵测试名称通过猜测和检查确定的。

我在 VSTest 框架和我的本机单元测试中遇到了同样的问题。

因此,在完成您之前提到的所有这些操作后,我删除了解决方案目录路径中所有出现的“#”符号。它确实有效。

我把它留在这里留给将来会发现这个问题的 google 员工。

我有一个实例,其中一些测试不会被拾取,因为我将它们 async 设置为如下所示:

public async void This_IsMy_UnitTest()

问题是我忘了让它们 return 变成 Task 而不是 void 当我进行切换时。人们会认为这会导致错误或测试失败,但不会。 class 中的单元测试被完全忽略,就像它们不存在一样。

在大约 3 次清理和构建 + 重新启动 VS.NET 之后,我看到了测试 运行 并且失败表明我忘记添加 Task return类型:

public async Task This_IsMy_UnitTest()

更新后,找到单元测试并正常运行。这可能是一个边缘案例,但是在内部使用 await 进行 async 测试但签名不正确可能会导致同样的问题,这不是我第一次这样做。

这可能对大多数人没有帮助,但是没有单元测试经验的人写了一个测试方法 returned bool 而不是 void:

[TestMethod]
public bool TestSomething()

将 return 类型更改为 void 解决了问题。

进来分享我的解决方案。我在 Windows 10、Visual Studio 2015、NUnit 3.5、NUnit 测试适配器 3.6(通过 NuGet,而不是 VISX 扩展)和 none 我的测试被发现。我的问题是,在我的解决方案的测试项目中,以某种方式在项目文件夹中创建了我的 "Documents" 文件夹的快捷方式。我猜测试适配器看到了快捷方式并挂断了试图弄清楚如何处理它,导致无法显示单元测试。

删除文件 \AppData\Local\Microsoft\VisualStudio.033\SpecificFold‌ erCache.xml 解决了我的问题。

转到 Nuget 包管理器并下载 Nunit Adapter,如下所示。

这个话题有些过时,但是我对VS2015中缺少测试状态的解决方案:

task-status 仅显示在调试构建配置中。当然,这也使得无法通过 test-explorer.

调试您的测试

在 Visual Studio 2015(更新 3)中,如果您想在测试资源管理器中附加测试,则必须安装 NUnit 测试适配器。从以下位置下载适配器工具->扩展和更新->在线选项卡(您必须搜索适配器)->下载。 通过重新启动 Visual Studio 您可以看到测试框架的变化。

确保带有 [TestClass] 属性的 class 是 public 而不是 private .

只需 重新启动 Visual Studio 并在测试资源管理器中执行 "Run All" ... 然后发现我所有的测试。

我也被这个美妙的小功能所吸引,这里描述的任何东西都不适合我。直到我仔细检查构建输出并注意到没有构建相关项目。访问配置管理器证实了我的怀疑。

Visual Studio 2015 年很高兴允许我添加新项目,但决定不值得构建它们。一旦我将项目添加到构建中,它就开始播放得很好。

确保您的测试项目 xunit.runner.visualstudio 包 packages.config 并且已正确恢复。

我知道最初的问题不是这种情况,但是它可以为像我这样的人节省时间。

我错误地创建了异步方法但返回了 void。

已更改:public async void Test()

收件人:public async Task Test()

出现此问题的一个原因是您的测试 class 不是 public。 MSTest 仅发现来自 public classes.

的测试

确保您的测试方法没有参数。这是您的测试不会显示的另一种方式。

没有错误或警告。

我想补充一个可能找不到测试的进一步原因,在我的例子中,它与未找到的 C++ 单元测试有关。

在我的案例中,没有找到特定项目的测试,因为它的输出目录不包含在项目目录中,更改此设置可确保找到测试。

我通过将 X64 更改为: 右键单击项目 -> Properties -> Build -> Platform target -> Any CPU

我想补充一点,我发现了一个与上述解决方案完全不同的解决方案。

我已经声明我的测试 class 如下:

[TestClass]
class ClassificationTests
{
   //unit tests
}

我将 public 修饰符添加到 class 后,它就按预期工作了!

如果您正在处理多个应用程序或 Web.Config 个文件。例如:

很可能您使用的配置是 RELEASE MODE,它将从配置中删除调试模式设置:

  <system.web>
    <compilation xdt:Transform="RemoveAttributes(debug)" />

将配置更改为不删除调试模式的配置。

我遇到了同样的问题。 Visual Studio 2015(更新 3)的单元测试模板生成一个 class,其中 TestContext 属性 定义如下:

    private TestContext testContextInstance;

    /// <summary>
    ///Gets or sets the test context which provides
    ///information about and functionality for the current test run.
    ///</summary>
    public TestContext TestContext
    {
        get
        {
            return testContextInstance;
        }
        set
        {
            testContextInstance = value;
        }
    }

将其更改为 public 字段后(丑陋),测试运行程序可以发现测试。

public TestContext TestContext;

非常奇怪的行为,但这是我遇到问题的原因。

花了 2 天后...none 以上对我有用。唯一的 "solution" 是:转到项目属性 -> 构建选项卡。然后单击窗格右下角的高级按钮。将 "Debug Info:" 更改为 "full" 并单击确定。

以下是屏幕截图:

禁用Windows Defender 服务。立即关闭它会导致我所有的单元测试都显示在测试资源管理器中。

对我来说,升级到 NUnit 3.7 版成功了。

在 VS 输出窗格(切换到测试视图)中,出现此错误:

无法加载文件或程序集 'XXX.UnitTest, Version=9.4.0.0, Culture=neutral, PublicKeyToken=14345dd3754e3918' 或其依赖项之一。强名称验证失败。 (HRESULT 异常:0x8013141A)

在测试项目的项目设置中,在签名选项卡下,有人检查了 'Sign the assembly'。取消选中并构建导致测试出现。

一位同事也通过将此 post 中的密钥添加到注册表来解决了同样的问题:

https://blogs.msdn.microsoft.com/keithmg/2012/03/20/strong-name-validation-failed-exception-from-hresult-0x8013141a/

我的解决方案只是将 NUnit 3 测试适配器 扩展安装到我的 Visual Studio 2015。

不知何故,我的项目被设置为编译为静态库 (.lib)。将其更改为 动态库 (.dll) 后,Visual Studio 2012 正确发现的测试。

My Unit Test Project ->
Properties ->
Configuration Properties ->
General ->
Configuration Type

如果您的目标是 .NET Standard 或 .NET Core,则需要使用 NuGet 包 用于 NUnit 测试适配器并且不是扩展.

It is recommended to install the adapter from NuGet if you are testing .NET Core or .NET Standard projects. The VSIX adapter does not, and will not, support .NET Core because VSIX packages cannot target multiple platforms.

来源:NUnit GitHub Wiki

.

另请查看那里的常见问题解答:

My tests aren't showing up in Visual Studio 2017?

  • Are you using the NuGet package?
  • Are you using version 3.8.0 or newer of the NuGet package?
  • Do your tests target .NET Core or the full .NET Framework? (see above)
  • Have you added a Package Reference to Microsoft.NET.Test.Sdk?
  • Have you restarted Visual Studio? It is still a bit tempermental.

来源:NUnit GitHub Wiki

这发生在我身上,因为我的测试项目包含一个 app.config。 它是由 NuGet 包自动添加的,用于程序集重定向,但没有它我的测试似乎 运行 没问题。

参见:https://developercommunity.visualstudio.com/comments/42858/view.html

我很容易解决这个问题:

  • Select 你的单元测试项目
  • 单击解决方案资源管理器中的 'Show All Files' 按钮,新的临时文件出现在解决方案资源管理器的文件树中 'obj\x86\Debug'。
  • 删除这些临时文件并重建项目。
  • 重试 运行 测试并成功!

唯一对我有用的是: 删除 C:\Users(你的用户名)\AppData\Local\Temp

其他建议通常是有效的。 但出于某种原因,如果 VS 没有接收到你的更改并在你的输出中不停地咆哮,它就无法发现测试,清理这个目录可以解决问题。 而且,是的,它可能只是 "some day" 你启动并且 none 你的解决方案将继续工作,而 "yesterday" 一切正常。

我们遇到了同样的问题。我们有一个大型 VS 2015 解决方案,其中包含多个 C# 项目以及更多测试项目。

Resharper 的测试发现工作得很好,但 VS Test Explorer 惨败。

事实证明,这些项目没有相同版本的 MsTest TestFramework 和 TestAdapter,有时他们使用 NuGets,有时使用很好的旧参考,显然不支持(对于如此昂贵的 IDE).

删除所有 Microsoft.VisualStudio.Test* 引用 然后 添加/更新两个 MSTest NuGet 解决了问题。

我意识到我的测试项目的 Target Framework 与被测项目不同,从而解决了这个问题。是的,我通过更改默认的目标框架(项目>属性>应用程序)引起了这个问题,但是对于几周后创建的测试项目却没有做到这一点。不匹配不会导致编译器错误,但会导致 错误列表 window 中出现警告。一旦我选择了显示警告的选项,解决方案就很明显了。

  1. 更新 nunit.framework 到最新版本。
  2. 从 nuget 下载 nunit 测试适配器
  3. 重启Visual studio

对我来说,解决方案是清理和重建测试项目

构建 > 清理

构建 > 构建

我没有在上面的答案中看到,这就是我添加它的原因:)

我相信您已经找到了问题所在,但就我而言,帮助简单地安装了 Microsoft.NET.Test.Sdk。确保将其添加到测试项目中。我花了几天时间尝试解决这个问题,就这么简单。

Microsoft.Net.Test.Sdk 无论您使用什么测试框架,都应该安装。

https://i.imgur.com/Ol6AoOm.png

请注意,我已经遍历了当前的答案,但没有找到与 loading/unloading 相关的测试项目(在我的案例中有效的技巧,我已经在 SO here 的另一个类似问题上回答了它).

开始吧:

I was also facing the same issue, as a workaround I Unloaded my test project and then Reloaded back; then ran the test again. This time it refreshed the Test explorer :)

My VS version: VS Professional 2019 Version 16.9.6.

Note: I had to do this to all my Test projects.