Visual Studio 2013找不到单元测试


146

我在Visual Studio 2013中有一个简单的解决方案,它由一个Web项目,一个库项目和一个单元测试项目组成。当我打开解决方案并尝试运行单元测试时,Visual Studio不会发现它们。要运行测试,我尝试转到菜单并选择“测试”->“运行”->“运行所有测试”或打开“测试资源管理器”窗口。通过这些方法,Visual Studio不会在解决方案中发现任何测试。

首先创建一个简单的单元测试项目,然后尝试运行测试,Visual Studio知道发现该测试,然后我就可以运行它。然后,如果我打开以前的解决方案,Visual Studio现在会发现所有测试。我尝试保存我的解决方案,但先关闭并重新打开它,而无需先创建单元测试项目,Visual Studio不会再次找到测试。这是一个非常奇怪的行为,我不知道为什么会这样。

我曾经在这个项目中独自工作过,该项目使用的是与Visual Studio Team Foundation集成的源代码控制git。当一个新元素进入项目以及需要通过在线源代码控件重新创建解决方案时,Visual Studio的问题不会发现单元测试开始。在此之前,Visual Studio始终会发现所有测试。

为了创建单元测试,我使用了Microsoft.VisualStudio.QualityTools.UnitTestFramework dll。我的Visual Studio版本是:Microsoft Visual Studio Express 2013,用于Web版本12.0.30723.00更新3。我的.net Framework版本是4.5.50938。

我所有的测试都是这样的:

[TestClass] 
public class Service1Test 
{ 
    [TestMethod] 
    public void Test1() 
    {
        Assert.IsTrue(True); 
    } 
}

2
这些是基于异​​步的单元测试吗?
杰米·基林

不确定是什么问题,但是以管理员身份运行为我解决了该问题。
Sriram Sakthivel 2014年

所有基于同步的单元测试
miguelbgouveia 2014年

2
您是否尝试过外部测试运行程序(例如ReSharpers或NCrunch)?也许您的安装有错误(因此请重新安装VS)
Carsten

1
这些都没有为我解决问题:(真是一场灾难。我放弃了NUnit并依靠UnitTestFramework-奇怪的是与OP相反的问题
Adam

Answers:


210

我注意到我必须不时做一些事情才能使测试正确显示。

  1. 如果您的解决方案在受保护的驱动器中,则需要管理员访问权限才能进行读/写,有时仅会进行部分测试。在这种情况下,一定要以管理员身份运行VS。

  2. 如果您的解决方案是64位,请确保将“测试”>“测试设置”>“默认处理器体系结构”设置为x64。有时将其设置为x86。将其设置为x64,然后重新构建。

  3. 有时只是重新启动Visual Studio就能解决问题,因为测试资源管理器将再次启动。

  4. 不要忘了实际构建测试项目/解决方案。(如果您希望它与其余项目一起构建,请右键单击您的解决方案>属性>配置属性>配置>选中测试项目的“构建”框)

  5. 确保测试在public您的测试课程中


34
我知道这个答案有点晚了,但是我的Google搜索将我带到了这里,没有任何提及解决了我的问题。最终,我发现它在列表中排名第二,所以我想留下这些知识,以及随着时间的推移获得的其他技巧。
AndyG

7
#2和#3的组合为我做到了。Visual Studio抱怨我的解决方案中的许多(非测试)项目被排除在测试发现步骤之外,因为它们是为x86构建的,但这很好。
Nate Barbettini 2015年

4
我发现我的设置都是正确的,并且重新启动不起作用。为我解决问题的只是构建解决方案。我知道这可能看起来很愚蠢,但并不清楚是否有必要。我还没有看到任何官方文档提到这一步骤。
user1807768

6
我在VS2015中遇到了同样的问题。#2为我解决了这个问题。
mcolegro

2
我不知道为什么人们要为经常失败的产品支付这么多钱。我不得不将我的项目升级到2015年,并在发现我的测试之前进行了2次#3测试。
马修·霍根

81

如果您使用NUnit,请确保首先下载NUnit适配器。

转到工具→扩展和更新…→在线→搜索“ NUnit Test Adapter”。


2
我正在使用Microsoft的UnitTests。在这种情况下,我认为没有必要安装任何东西。
miguelbgouveia 2015年

1
这为我做到了-非常有义务。
Matas Vaitkevicius

这为我解决了。谢谢。
jjthebig1

可以解决问题,但必须安装NUnit适配器,否则Visual Stdio应该与NUnit一起使用。
OwainGlyndŵr17年

你是个上帝先生。
Nox

61

确保您的测试课程是public可以找到的。如果要引用另一个类,请确保相同。

另外,有时,如果您没有断言或未使用来装饰测试,则[TestMethod]可能无法识别测试。

还有2件事:1)异步单元测试充其量可以做到最好,而最坏的情况则完全没有。看一下Stephen Cleary的这篇文章,如果您感兴趣的话,不要去找。

2)如果您使用NUnit并遇到相同的问题,请记住这是[TestCase]针对Nunit的,而不是[TestMethod]

上面已经说了,这是我在代码项目上发布的文章,同时包含MSTestNUnit,以防您想旋转一下并确保您没有丢失任何内容。


1
我所有的测试都是这样的:[TestClass]公共类ServicesUtilsTest {[TestMethod]公共无效Test1(){Assert.IsTrue(True); }
miguelbgouveia 2014年

这不是很清楚。将其放在您的问题的代码块中,这样就可以理解:)
Noctis

我所有的测试都是针对同步代码的,我认为我的问题不在单元测试代码中,而在Visual Studio中,更多的问题有时是找不到测试的。
miguelbgouveia

尝试改用此方法:using Microsoft.VisualStudio.TestTools.UnitTesting;
Noctis

1
我已经在使用Microsoft.VisualStudio.TestTools.UnitTesting。此命名空间在dll Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll中定义
miguelbgouveia 2014年

28

我遇到了同样的问题,但其他解决方案均无效。原来,我正在将NUnit 3框架与2适配器一起使用。

如果您使用的是NUnit 3,请转到“扩展和更新”并安装NUnit3测试适配器。


它确实在Nuget软件包的说明中说了这一点。但是,如果您像我一样,不读书,希望对您有所帮助:“此软件包包含NUnit 3.0框架程序集,该程序集已由您的测试引用。您将需要安装nunit 3.0版本-控制台程序或支持NUnit 3.0以便执行测试的第三方运行程序。打算与NUnit 2.x一起使用的运行程序将无法正确运行3.0测试。”
弗兰克

以我为例,我知道它与NUnit3更新有关,但是我的一组测试通过了,而其他的则看不到。仔细检查后,即使测试全部通过,输出中仍有很多异常。
Rich Shealer

我也是这种情况。我运行了nuget“ update-package”,但没有意识到它已从NUnit 2.x更新到3.x。
詹斯(Jens)2015年

当前,无法通过NuGet找到NUnit 3.0测试适配器(请参阅NUnit 3.0 Wiki))。它仍然可以作为扩展安装。
vauhochzett

1
非常感谢弗兰克。它解决了我的问题。现在,我可以在控制台窗口中查看单元测试结果:)
santosh kumar patro

12

我时不时遇到这个问题。对我有用的是关闭Visual Studio并转到文件夹:

%LocalAppData%\Microsoft\VisualStudio\12.0\ComponentModelCache

并删除它的内容。

打开Visual Studio并再次加载项目后,测试资源管理器应包含测试内容


对我来说那是行不通的。我正在使用最近安装了Update 5的Visual Studio 2013 Express。仍然没有单元测试出现。
miguelbgouveia

这也是我的工作。甚至可以在不重新启动Visual Studio的情况下工作。数小时的努力终于结束了。
Stephan Ryer

该目录在VS2017中不再存在。
诺埃尔·威德默

它为我工作的任何与本文件夹的感谢能有不同势的版本取决于安装的Visual Studio一样对我来说是%LocalAppData%\Microsoft\VisualStudio\16.0_03b7a93c\ComponentModelCache
拉维·库马尔·米斯特里

12

XUnit用户可能会注意到“测试资源管理器”窗口不再列出任何测试。要使测试再次可发现,请尝试以下重要的提示,突出显示。

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

键入TEMP查找目标文件夹


这对我不起作用。测试资源管理器只是找不到我的测试,据我所知我没有做错,我在这里尝试了一些解决方案,但没有成功。
Skychan

使用MsTestV2-这是解决问题的唯一方法
Nathan

5

对于未来的Google员工,我遇到了一种罕见的情况。

在基本测试类上,我有一个名为TestContext的属性。这干扰了MSTest的保留TestContext属性,导致我的所有测试都从VS / Resharper中隐藏,只有一个(它不是从基类继承的)。


1
也是我!我忘记了测试上下文属性public
escape-llc

4

对我来说,它正在将“解决方案配置”更改为Debug(而不是Release)。


4

我的问题是因为我的单元测试方法不是void,并且正在接收参数。


在所有事情中...。这是我的问题,参数位有意义。毕竟,测试系统知道会通过什么?解决方案是创建一个测试方法,您可以在其中手动调用要测试的方法。如果您正在测试WebAPI项目并具有Get with params,则仍然必须具有匹配的Get调用,但它不会显示在资源管理器中。
MetalPhoenix

4

我发现async voidVS Test Explorer没有发现标记为的单元测试方法。这似乎是因为VS没有任何方法可以等待测试完成并确定测试是否成功。如果您绝对需要一个测试方法来异步运行,则可以让它返回Task而不是async Task。我发现这为我解决了这个问题。


1
这不能回答上面的问题,但这恰恰是我要解决的问题。所以您发生了事故+1 :)非常感谢!
CF

3

尝试将所有项目构建为MSIL(任何CPU)而不是x86 / x64。奇怪地为我工作


我只需要使用Any CPU来构建Test项目,其他项目仍然是x64
Eduardo Brites 2015年

1
从技术上讲,C#/ VB.NET始终编译为MSIL。项目设置“ x86”,“ x64”或“任何CPU”(在较新的版本中为“首选32位”)只是EXE / DLL顶部的标志。点仍然站立;NUnit不会列出无法加载到执行引擎中的测试,因为它们被标记为需要运行特定的架构。
乔纳森·吉尔伯特

3

尽管AndyG的解决方案有效,但更持久的解决方案是通过以下方式将PreferredToolArchitecture环境变量设置为“ x64”:

如何使Visual Studio使用本机amd64工具链

或通过:

  • 控制面板 系统与安全| 系统| 高级系统设置|环境变量
  • PreferredToolArchitecture = x64
  • DefaultToolArchitecture = Native64Bit
  • PROCESSOR_ARCHITECTURE = x64
  • ProcessorArchitecture = x64

2

我遇到了同样的问题,我再次记得(这种情况以前发生过),在解决方案平台菜单上选择“混合平台”以及其他答案都可以。


但是解决方案平台菜单在哪里?那是在Visual Studio中吗?我正在使用Visual Studio Express 2013 Web版,但找不到该菜单。
miguelbgouveia



1

转到项目菜单>配置管理器,检查您的测试项目平台是否与项目的其余部分匹配,并检查要构建然后重新构建。


1
我的项目菜单中没有任何Configuration Manager选项。我只能找到项目属性选项。我非常喜欢单元测试项目的平台,与其他项目一样。因此,对我而言,此解决方案不起作用。
miguelbgouveia

定义“匹配项目的其余部分”
合并2015年

1

只是碰到了这一点,我也没有看到与我相似的类似案例。

.csproj我的测试项目文件中,NUnit参考隐私设置为False

<Reference Include="nunit.framework, Version=2.6.4.14350, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">
  <HintPath>..\packages\NUnit.2.6.4\lib\nunit.framework.dll</HintPath>
  <Private>False</Private>
</Reference>

之后,我设置<Private>True它的工作。


1

您只需要安装此软件包:

NUnit测试适配器 NUnit测试适配器


我知道使用另一个单元测试框架可以解决我的问题。但是,如果我想继续使用不是解决方案的Microsoft单元测试框架。
miguelbgouveia '16


1

我有同样的问题。

这是由于我添加到项目(3.2.0)和我已安装的测试适配器(2.0.0)的NUnit版本不兼容所致。

要修复,请使用“工具>扩展和更新”并搜索NUnit3测试适配器,此后它发现了我的测试。

干杯


我没有使用NUnit。
miguelbgouveia '16

1

只是出于论证的目的,您需要在测试项目上使用X64架构,以便正确构建依赖项(如我的情况)。您可能需要在“ 测试-测试设置”菜单下修改默认处理器体系结构。将此设置为X64可使我的测试浏览器使用Microsoft.VisualStudio.TestTools.UnitTesting查找我的测试。


1

很抱歉添加到长列表中,但是我遇到了一个完全不同的问题。首先,我想提到的是,我在测试资源管理器中单击“全部运行”,然后在Visual Studio中查看生成输出窗口时发现了我的问题。您必须积极观察它,因为随后消息消失。

至于问题,它看起来像在扫描测试期间,DLL被加载并且其测试类型被枚举。这将导致引用被加载,并且如果在此过程中发生任何故障,则资源管理器中不会显示测试。我遇到两个问题,无法成功加载测试DLL:

  • 配置文件中仍然存在绑定重定向(重定向到比测试项目中引用的版本低的NHiberate版本)。
  • 程序集引用冲突(第二级引用无法加载)。AsmSpy是寻找这些的绝佳工具。

我面临着同样的问题,很难找出哪些dll无法加载....
amarnath chatterjee

1

如果从网络共享作为共享一部分的“我的文档”目录中加载Visual Studio(在我的情况下为VS 2015社区)解决方案,则会遇到此麻烦。我通过将解决方案及其基础项目移动到本地文件夹来解决此问题。


1

花了2天之后...以上都不对我有用。唯一的“解决方案”是:转到项目属性->“构建”选项卡。然后,单击窗格右下角的“高级”按钮。将“调试信息:”更改为“完整”,然后单击“确定”。

以下是屏幕截图: 在此处输入图片说明

在此处输入图片说明在此处输入图片说明


0

我遇到了同样的问题。并调查发现该dll尚未生成,并放在正确的文件夹中。一旦更改配置,它们就会出现。-项目构建选项,应使用哪个文件夹?-构建菜单项构建配置,应进行​​检查。

帮我解决了


对我而言,由于Visual Studio找不到任何已定义的测试,因此未构建用于测试的dll。我正在使用Visual Studio Express,但没有“构建”菜单项。但是在我的配置管理器中,我检查了所有构建选项。因此,我认为这对我的案子没有问题。
miguelbgouveia 2015年

@miguelbgouveia,这是另一种方式-VS构建DLL,然后扫描它们以进行测试。因此,如果您没有测试项目DLL,那么您将肯定找不到任何测试。

0

对于Visual Studio 2013.5,清除解决方案中的\ TestResults目录有助于。Visual Studio破坏了存储发现的测试的mdf文件,从而阻止了单元测试的发现。


1
这是您项目的解决方案。在解决方案资源管理器->在文件资源管理器中打开文件夹中右键单击您的项目文件。从那里向上一个目录,然后删除/ TestResults目录。您可能必须关闭Visual Studio才能删除所有内容。下次打开项目时,它将重建目录。
MartijnK '16

0

确保所有项目都使用相同的配置运行。在项目的Properties => Debug => Platform下拉列表中,选择其他项目确定的适当平台(对我来说是“ Any CPU”)。


0
  • 我知道如果未构建解决方案,则找不到单元测试,因此可以尝试(构建解决方案),但是该解决方案就像帮助台询问您的计算机是否已插入...
  • 彻底重新构建无法解决我的问题后,运行完整的批处理构建确实可以解决问题。

0

有同样的问题;测试突然停止被发现。

Nunit测试适配器已被禁用。在扩展程序管理器中单击启用为我修复了它。


0

我遇到了同样的问题,直到我意识到我执行了剪切/粘贴错误并[Test Method]在测试之前就退出了。


这已经发生在我身上。但事实并非如此。
miguelbgouveia '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.