Visual Studio 2015或2017无法发现单元测试。

171

编辑 2016-10-19:

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

我还在自己的答案中包含了一个脚本,我仍然在使用这个脚本来解决类似的问题。

许多其他答案也证明有助于更好地理解VS测试运行器的细节。我很感激人们仍然分享他们的解决方案!


原问题2015-04-10:

从昨天开始,我的Visual Studio Test Explorer不能为我的任何项目发现测试。构建后没有显示绿色的加载条。

当我转到Visual Studio Test Explorer并点击“运行全部”,或者右键单击任何测试方法并选择“运行测试”时,我的输出窗口会出现以下信息:

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.

我在Windows 10 Pro技术预览版build 10041上运行Visual Studio 2015 CTP 6。.NET Framework版本似乎并不重要——它会在4.04.5.24.6上发生。

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

  • Microsoft.VisualStudio.QualityTools.UnitTestFramework v14.0.22609.0
  • xunit v2.1.0-beta1-build2945xunit.runner.visualstudio v2.1.0-beta1-build1051
  • NUnit v2.6.4NUnitTestAdapter v2.0.0
我在 GitHub 上发现了一个问题 (xunit),看起来很相似:无法找到测试 #295,xunit 团队留下了以下评论:

请注意,许多人报告 Visual Studio 2015 CTP 5 在单位测试方面出现问题(不仅是 xUnit.net),因此不要指望它能正常工作。

此外,请确保您已清空了 Visual Studio 的运行程序缓存。如果它被破坏了,Visual Studio 将会一直表现不良,直到删除为止。要清除缓存,请关闭所有 Visual Studio 实例,然后删除文件夹 %TEMP%\VisualStudioTestExplorerExtensions (实际上,可能要删除 %TEMP% 中可以删除的所有内容)。

我尝试了他们建议的删除文件夹 %TEMP%\VisualStudioTestExplorerExtensions。不幸的是,这没有解决问题。
我注意到 ReSharper 实际上可以发现一些测试。 它只适用于VS和NUnit测试,而不适用于xunit。
必须有某种临时或缓存文件夹需要清除,但我知道 Visual Studio 有很多这样的文件夹,并且不是所有文件夹都可以删除而不会产生不良副作用。

3
我很高兴偶然发现这个,它让我想起了我为什么在使用第三方测试运行器(在我这里是 NCrunch)。很久以前我因为类似的原因放弃了MSTest。当然,如果你被迫使用MSTest,那并不是解决办法... - Abel
请将 Visual Studio 2015/2017 测试运行器无法发现 XUnit V2 测试的原因告诉我。这篇文章可能能帮到你。 - Ruben Bartelink
使用VS 2017,令人惊讶的是,清理我的临时文件夹和本地应用程序数据VS2017相关文件夹,关闭+重新加载+清理解决方案以及Windows重启都没有帮助。然而,出乎意料的是,在我的一个测试项目中简单地“卸载-重新加载”项目确实有助于停止测试发现挂起。我不使用第三方单元测试包。 - Pac0
对于一些人来说,这可能是有趣或更相关的(我认为我不应该将其添加为答案):Test Explorer中没有源可用 - https://github.com/Microsoft/testfx/issues/274 - hB0
这可能是某人的解决方案。 - Rady
显示剩余2条评论
46个回答

158

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

注意:此路径通常位于C:\Users\(你的用户名)\AppData\Local\Temp

如@Warren-P所提到的,您可以通过在开始菜单中输入%temp%或启动“文件资源管理器”并在地址栏中输入%temp%来导航到临时文件夹。


32
或者你只需在开始菜单的“运行”中键入“%TEMP%”,它就会为你找到临时文件夹,而无需猜测“temp”的值。 - Warren P
66
任何把重要数据存储在"%TEMP%"目录下的应用程序都应该停止工作。 - Mark Pattison
25
这不是你的尴尬,而是微软糟糕的失败,让你必须采取荒谬的步骤来保持一款价值1000美元的集成开发环境运行。 - MushyPeas
8
在我使用VS2017时也有效! - Lorentz Vedeler
7
如果你担心清除整个temp目录,那么只清除Temp\VisualStudioTestExplorerExtensions子目录似乎可以解决问题。 - Mike Walsh
显示剩余8条评论

92

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

Test > Test Settings > Default Processor Architecture > X64

3
这个问题曾经困扰了我几次。即使这么多年过去了,我仍然无法想出一个好的理由,为什么默认情况下测试设置不会自动匹配项目当前的构建配置。对我来说,这似乎是毫无意义的重复配置。 - Neutrino
1
Windows 更新和/或 VS 更新会在不告知您的情况下更改默认架构... 呜呜 - rupweb
四年后,这仍然很有帮助。谢谢。 - Oscar O.

69
  • 检查 VisualStudio 中是否安装了 NUnit Test Adapter 2/3
    (工具>扩展和更新)

  • 确保选择正确的处理器架构:
    (测试>测试设置>默认处理器架构)


2
这就是最终对我起作用的东西。在尝试了其他一切之后。 - BradStell
当你甚至没有安装扩展程序时,先在临时文件夹中搜索让你感觉像个傻瓜。感谢您发布这篇文章。 - NightOwl888
2
还要检查您是否使用了正确的扩展名。 NUnit 2.x和NUnit 3.x有不同的扩展名。 - pmbanka
1
当您的目标是.NET Standard时,实际上需要安装NuGet包NUnit Test Adapter而不是VSIX扩展。https://github.com/nunit/docs/wiki/.NET-Core-and-.NET-Standard - m93a
尝试从NuGet获取NUnit3TestAdapter,而不是使用VSIX。这是更好的方法。 - ravella

36

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

这个问题时不时地出现。我编写了一个小的PowerShell代码片段来自动清除相关缓存/临时文件夹/文件。我在此分享给未来的读者:

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

确保先关闭Visual Studio并且重启后可能是个好主意。
删除TEMP文件夹可能不是必要的,在某些情况下甚至可能是不可取的,因此建议首先尝试不清除TEMP文件夹。只需省略"$env: TEMP"即可。
这个问题在对与Visual Studio相关的临时/缓存文件进行了彻底的清理后被“解决”。
由于我没有时间一个一个地查看并在测试之间进行操作,所以很遗憾我不知道哪一个实际上引起了问题。
以下是我采取的确切步骤:
1.关闭Visual Studio
2.使用CCleaner清除系统和浏览器temp文件/文件夹
3.手动清除/删除以下文件/文件夹:
%USERPROFILE%\AppData\Local\assembly
%USERPROFILE%\AppData\Local\Microsoft\UnitTest
%USERPROFILE%\AppData\Local\Microsoft\VisualStudio\14.0\1033\SpecificFolderCache.xml
%USERPROFILE%\AppData\Local\Microsoft\VisualStudio\14.0\1033\ProjectTemplateMRU.xml
%USERPROFILE%\AppData\Local\Microsoft\VisualStudio\14.0\ComponentModelCache    %USERPROFILE%\AppData\Local\Microsoft\VisualStudio\14.0\Designer\ShadowCache    %USERPROFILE%\AppData\Local\Microsoft\VisualStudio\14.0\ImageLibrary\cache    %USERPROFILE%\AppData\Local\Microsoft\VisualStudio Services\6.0\Cache    %USERPROFILE%\AppData\Local\Microsoft\WebsiteCache    %USERPROFILE%\AppData\Local\NuGet\Cache    %USERPROFILE%\AppData\Local\Temp

谢谢,按照您所描述的清除 Microsoft\VisualStudio\14.0\ 和 Microsoft\VisualStudio Services\6.0\Cache 文件夹后,问题已经解决。 - Niels van Reijmersdal
2
我已经清空了 %TEMP% 中的所有内容,但它并没有起作用,但是当我重新添加 'VisualStudioTestExplorerExtensions' 目录(为空)时,一切都完美地运行 :-)(在当前日期底部有带有该解决方案的答案) - nilphilus
1
我只删除了一个文件 \AppData\Local\Microsoft\VisualStudio\14.0\1033\SpecificFolderCache.xml它有帮助。 - Serhii Kuzmychov
我已经多次遇到这种情况,即VS无法找到/执行单元测试...在输出窗口中报告了类似“未找到要运行的测试”的信息。只需重新启动VS即可解决问题。 - IAbstract
这对我也起作用了,可重用代码的力量。感谢回答者的答案和努力。 - Sudhir
显示剩余3条评论

22

这个问题的一个原因是你的测试类不是公共类。MSTest只会从公共类中发现测试。


1
虽然这并不是100%正确的,我曾经有一个非公共类正常工作,但在某个时候它的单元测试停止工作了。当我将单元测试类更改为public时,它又开始工作了。真是匪夷所思! - sasharz
这对我解决了问题。默认情况下,Visual Studio添加的测试类没有public关键字,直到我将它们设为public才能看到它们。 - Marc Fearby

15

在Visual Studio 2015(更新3)中,如果你想要在测试浏览器中附加测试,则需要安装NUnit Test Adapter。从工具->扩展和更新->在线选项卡(你需要搜索适配器)->下载下载适配器。 重新启动Visual Studio后,您可以看到测试框架的变化。


2
根据您的指示,我搜索了“nunit”,并找到了“NUnit 3测试适配器”,在“下载”(安装)后解决了我的问题。 在互联网上搜索此问题会发现其他SO文章,请参见[链接](https://dev59.com/Ul8e5IYBdhLWcg3w2NVR) - Adam Cox
在某些情况下,这比Nuget包管理器更好,因为它不会更改配置文件。 - GY_
1
@GY_ 但是如果你的目标是 .NET Core 或者 Standard,你实际上需要使用 NuGet 包。请查看我下面的回答:https://dev59.com/D10b5IYBdhLWcg3wJ-Qy#47460221 - m93a
你救了我的命!谢谢,我尝试了很多解决方案都不行。我的问题是Google测试适配器。 - Erman

9

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

  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. 如果您的Test Explorer窗口仍然为空,请从项目中删除“test”命令,然后重新构建解决方案,再将“test”命令添加回project.json。
  5. 根据@Fred-Kleuver的建议清除所有缓存可能有所帮助,但我没有单独执行所有步骤,因此不确定。

这是根据使用beta4版本而非每日版本的VS 2015 CTP 6的最新信息。


1
好的,我已经确认(通过让同事尝试)上述修复不需要清除缓存或临时文件。 - Avi Cherry
上面说:“相反,使用“xunit”:“2.1.0- *”和“xunit-runner.dnx”:“2.1.0- *”包在Visual Studio中确实可行。”这很有效,谢谢! - Gillardo
顺便说一句,作为后续,目前在VS 2015中的当前版本中似乎一切都正常工作。不需要费力使新测试显示出来或其他任何事情。 - Avi Cherry
1
最终,微软发布了一份详细的指南,准确说明了在哪些版本的DNX中使用哪些版本的xunit,链接在这里:https://xunit.github.io/docs/getting-started-dnx.html - Avi Cherry

9
我曾经遇到这样一种情况,其中一些测试用例没有被捕获,因为我将它们设置成了async,如下所示: public async void This_IsMy_UnitTest() 问题在于,当我进行切换时,我忘记了将其返回类型从void改为Task。你可能会认为这会导致错误或测试失败,但实际上不是这样的。该类中的单元测试完全被忽略,并且表现得好像它们不存在一样。
只有在大约三次清理和构建以及重新启动VS.NET后,我才看到测试运行并失败,提示我忘记添加Task返回类型: public async Task This_IsMy_UnitTest() 更新后,单元测试被找到并正常工作。这可能是个特殊情况,但如果使用await编写async测试用例时签名不正确,就会导致相同的问题,而我也不是第一次犯这种错误。

问题已经解决! - Aimal Khan

8

前往Nuget包管理器,按照以下步骤下载Nunit适配器。

enter image description here


谢谢,我的情况是我使用的是 NUnitTestAdapter 而不是 NUnit3TestAdapter。这解决了我的问题。 - pixel
将NUnit3TestAdapter nuget包添加到解决方案或项目中,通常情况下并不能为所有其他解决方案修复问题,而只能为已添加该包的解决方案修复。为了通用地为所有解决方案/项目执行此操作,请按照https://dev59.com/D10b5IYBdhLWcg3wJ-Qy#45748818中所述,在Visual Studio中添加NUnit 3测试适配器扩展程序。 - Umar T.

6

我曾经遇到同样的问题,但是在我的电脑上不存在文件夹 "%TEMP%\VisualStudioTestExplorerExtensions",所以当我阅读帖子时,我想到了创建它并且它成功了。现在测试资源管理器能够显示所有我的测试。 谢谢。


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