在Visual Studio 2017中未发现单元测试


213

自从安装VS 2017以来,我一直在努力。现在看来,单元测试只能从命令行“ dotnet测试”运行。

我的项目是.NET Core 1.1.1。我安装了1.1.1的SDK和框架更新。

我已经在MSDN(https://msdn.microsoft.com/en-us/library/ms182532.aspx)上尝试了该示例,该示例也以完全相同的方式失败。

用于测试和主项目的所有NuGet软件包都是最新的。测试项目和主项目都可以正确构建。可以从命令行成功运行测试。

有没有人获得过在VS 2017中运行的单元测试,如果可以的话如何?

谢谢,约翰


更新-扩展

这是一个无法在GitHub上运行的简单测试项目的示例。这是xUnit的示例,但我尝试了NUnit和内置于MS测试中的visual studio。无论我进行什么测试或进行什么更改,我都无法让VS测试跑步者找到任何测试。

我尝试过的

  • 删除VS测试缓存文件 DEL %TEMP%\VisualStudioTestExplorerExtensions
  • 重新启动VS
  • 关闭/打开测试浏览器
  • 对于已安装的xUnit Microsoft.DotNet.InternalAbstractions请参见SO post
  • 对于NUnit,请确保已安装适配器,并且与NUnit软件包具有相同的版本(3)
  • test -> test settings -> default processor architecture 设置为x86

问题
任何人都可以在VS2017(.csproj项目文件)中提供.Net Core 1.1.0解决方案的工作示例,在该示例中VS测试浏览器成功找到了单元测试,或者在给出的示例中向我展示了问题。


我发现VS2017不会安装所有必需的软件包。当我尝试将MonoGame从旧PC迁移到具有新安装的Windows 10和VS 2017的新PC时,它开始引发有关缺少软件包的奇怪错误。与VS2017一起安装VS2015后,所有问题都消失了。也许尝试安装VS2015另外。
Mateusz

2
尝试使用Visual Studio安装程序安装Tests软件包
Markiian Benovskyi

我正在调查VS 2017是否正确设置了所有环境变量。
John Pezzanite

1
对于NUnit,您必须为适配器使用NuGet软件包,并且它必须为3.8.0-alpha1或更高版本。
罗伯·普劳斯

2
就我而言,这只是app.config我的测试项目中存在一个文件:stackoverflow.com/a/47497668/67824
Ohad Schneider

Answers:


189

以我为例,事实证明,我只需要升级测试适配器和测试框架。做完了

使用NuGet包管理器的示例:

在此处输入图片说明


4
这也对我有帮助!请注意,您可以在解决方案级别“管理Nuget程序包”,并在需要此操作的所有项目中执行此操作。然后,您可能会收到“模糊引用”错误-对于这些错误,只需从引用中删除旧的DLL(Microsoft.VisualStudio.QualityTools.UnitTestFramework)
Prashanth Subramanian

48
这些东西应该是Visual Studio的扩展,而不是NuGet包。
贾德

1
我们有许多旧的MSTest项目,但我不知道它已移至NuGet程序包。这也为我解决了这个问题,最初我认为这是ReSharper的较新版本中的一个错误,直到我意识到VS Test Explorer也无法发现我的测试。
大卫·安德森

1
我做了和这个答案完全一样的事情。在我的VS2017解决方案中,我添加了一个MSTest项目,添加了一些测试,但是构建该解决方案将导致:发现测试完成:找到0。因此,对于测试项目,在NuGet软件包管理器中(您也可以在解决方案级别执行),我将MSTest.TestAdapter和MSTest.TestFramework都从v1.1.18更新到了v1.2.0。然后,在完成构建后,我的测试现在显示在“测试资源管理器”中。
克肖

1
对我来说很棒,我不得不进入VS2017中用于特定测试项目的nuget程序包管理器,并简单地更新了我拥有的类似nunit等各种程序包,然后进行build> rebuild一切都很好。
塔希尔·哈立德

126

这只是为我工作(不知道这是否是更改损坏某些内容的工作区的结果):

在%TEMP%\ VisualStudioTestExplorerExtensions中删除VS测试缓存文件,然后重新启动VS2017。


4
这个工作一次,而不是后来。(这次)为我解决的问题是删除TestResults文件夹和bin / obj(以及此临时目录清除)
icesar

24
任何人%TEMP%echo %TEMP%
都想

21
临时文件夹不存在:/
Douglas Gaskell

那么,这种行为的原因是什么呢?
Mykhailo Seniutovych

1
访问%TEMP%的最简单方法是win + R,然后键入%TEMP%
PontiusTheBarbarian

58

随着Visual Studio 2017的发布以及从project.json格式到csproj格式的更改,用于.NET Core的测试适配器的API进行了更改。这使现有dotnet-test-*适配器dotnet-test-nunit过时了。

适配器已更新,但是在Visual Studio中或在命令行上设置和运行测试的方式dotnet test需要在测试项目中使用不同的引用。当心任何文档,您会发现该参考软件包采用了dotnet-test-*过时的格式,因为它们已经过时。

首先,您的测试项目必须针对特定的平台,即.NET Core或.NET Framework。即使您正在测试的代码是.NET Standard,它也不能定位 .NET Standard。这是因为测试的目标指示在哪个平台上运行测试。.NET Standard就像PCL(便携式类库)一样,它可以在许多平台上运行。

接下来,您需要添加对的引用Microsoft.NET.Test.Sdk,您选择的测试框架和兼容的测试适配器。对于NUnit,您的引用将如下所示,

<itemgroup>
    <packagereference Include="Microsoft.NET.Test.Sdk" Version="15.0.0"></packagereference>
    <packagereference Include="NUnit" Version="3.7.1"></packagereference>
    <packagereference Include="NUnit3TestAdapter" Version="3.8.0"></packagereference>
</itemgroup>

上面的评论提到添加,

<ItemGroup>
    <Service Include="{82a7f48d-3b50-4b1e-b82e-3ada8210c358}" />
</ItemGroup>

这不是严格要求的,但可以提供帮助。它会由Visual Studio自动添加到所有单元测试项目中,以帮助其快速找到带有测试的项目。

如果您的测试未出现在Visual Studio中,则首先要尝试的是关闭解决方案,然后重新打开它们。当您编辑项目时,Visual Studio中似乎存在无法检测到项目更改的错误。

有关更多信息,请参见在Visual Studio 2017中使用NUnit测试.NET Core


2
定位.NET Framework而不是.NET Standard对我有用。谢谢。
Ben Griswold

7
我的项目中缺少Microsoft.NET.Test.SDK参考,并且在任何地方都没有迹象表明需要依靠它来显示。通过nuget控制台添加了它,一切开始工作。感谢您的参考清单!
GWhite

我必须将此文件夹从同事那里复制到我的temp目录中,然后重新启动VS:%TEMP%\ VisualStudioTestExplorerExtensions \ MSTest.TestAdapter.1.1.18
Heiner

如果更改目标框架,如何测试netstandard 2.0项目?我无法再编译,因为标记net46的项目无法引用项目netstandard2.0
Jerome2606

1
这对我有用。感谢您提供详细的解决方案。
Talha Ashfaque

42

我有同样的问题,并通过执行以下操作使其起作用:

  • 首先关闭所有打开的Visual Studio实例,然后删除以下文件夹:%TEMP%\ VisualStudioTestExplorerExtensions。(使用Visual Studio运行测试
  • 转到您的Nuget软件包管理器,然后首先安装Microsoft.NET.Test.Sdk(15.3.0-preview-20170425-07),然后再安装xunit.runner.visualstudio(2.3.0-beta1-build1309)。请查看附件的Nuget屏幕截图,以查看我必须安装的所有软件包才能获得最新的VS 2017来检测我的测试。Nuget截图

35
对我来说,删除%Temp%\ VisualStudioTestExplorerExtensions就足够了。
Juan Pablo Gomez

是的 只需删除并重新启动VS即可修复它。
胡安·卡洛斯

有谁首先知道是什么原因造成的?我已经两次发生过,但是删除该文件夹并重新启动VS可以正常工作。真奇怪
RubyHaus

@PmanAce-实际上,我做到了。我正在使用两个不同的TFS实例(每个项目一个),因此切换项目时工作空间会自动更改。
RubyHaus

删除文件夹,并添加nuget Microsoft.NET.Test.Sdk似乎对我有用。.谢谢StackOverflow。(.NET Framework WebApi 2解决方案)
bkwdesign

40

忘记公开测试类来防止内部的测试方法被发现

我有一个默认的xUnit项目,并删除了示例UnitTest1.cs,将其替换为带有几个测试的控制器测试类,但均未找到

长话短说,更新xUnit,Test.Sdk,xUnit.runner程序包并重建项目后,我遇到了构建错误:

错误xUnit1000测试类必须是公共的

值得庆幸的是,更新版本引发了此异常,以免给我带来麻烦

修改测试类以公开解决我的问题


6
不知道为什么不赞成,但是在我100%早上喝咖啡之前,这件事被我忽略了。
Andrei

1
对这个问题/问题尝试了所有其他答案,这才是最终解决的方法!
FastTrack '18年

3
那令人难以置信的尴尬,但是。有趣的是,如果您在VS2017中创建一个测试套件用例,它将不会生成public该类,而只会生成该类,因此只有添加public标识符后它才会发现。
briosheje

当然。我的错-mstest应该具有此功能。
犯罪记录'18 -10-12

10

在我的情况下,我将测试项目定位为x64Architecture,并且将测试设置Architecture(test-> Default Processor Architecture)更改为x86。他们不匹配。

将测试设置x64重新设置为并重新构建所有测试后,再次发现所有测试。


在vs2017中,从菜单“测试”->“测试设置”->“默认处理器体系结构”中的设置
IcyBrk '19

8

我在VS 2017上也找不到我的UnitTest。这不是约翰要问的确切问题-但这是我在google中寻找的第一个结果,所以我想分享我的问题。

我有一个从VS2010到VS2013,VS2015的遗留解决方案。现在在VS2017中,似乎[TestMethod]属性的名称空间已更改。

在使用之前

Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.0.0.0

我在项目中创建了一个新的Test.dll,默认情况下使用了该文件

Microsoft.VisualStudio.TestPlatform.TestFramework, Version=14.0.0.0

所以我的解决方案是从VS2017内部创建一个新的UnitTest项目。也许为旧测试项目更改程序集引用也可以。VS2017借助新参考文献发现了这些单元测试。


可悲的是,甚至没有一个新的单元测试项目也没有为我显示测试:/
Douglas Gaskell

7

不要阅读MSDN下的过时文章。.NET Core相关材料位于docs.microsoft.com下

https://docs.microsoft.com/zh-cn/dotnet/articles/core/testing/

一般来说,您需要一个.NET Core控制台应用程序来包含单元测试用例。


非常感谢,Lex。如果本文是正确的,则测试.NET Core的唯一方法是从命令行开始-这样就失去了我们在VS 2015中运行测试所拥有的所有VS集成。我对此是否正确?
John Pezzanite

您使用xUnit.net还是MSTest?
Lex Li

@JohnPezzanite,您必须展示更多您所做的事情(如果可能,可能是GitHub存储库)。我在GitHub上确实有可以完美工作的项目,还有许多其他项目。
Lex Li

按照我提供的行中的示例进行操作。我已经使用.NET标准和.NET Core,示例中的Microsoft单元测试以及xUnit进行了尝试。.NET标准与VS 2017集成,而.NET Core仅从命令行运行。但是,我要重复上面的内容。这听起来像微软已经删除了所有.NET核心单元测试的集成形式VS 2017年
约翰Pezzanite

@JohnPezzanite测试GitHub.com/lextm/sharpsnmplib及其NetStandard解决方案。
Lex Li

6

对我来说,问题是我错误地将测试用例放置在内部类中

[TestClass]
  internal class TestLib {
}

导致无法确定测试用例。


5

请确保您使用正确的Microsoft.NET.Test.Sdk:

<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0" />

不要使用预发行版本之一。或者,您必须更改为控制台应用程序(而不是库)。我有类似的问题,但是在最新版本(15.0.0)中,它再次开始工作。

另外,您可能必须添加:

  <ItemGroup>
    <Service Include="{82a7f48d-3b50-4b1e-b82e-3ada8210c358}" />
  </ItemGroup>

但我认为这不是必需的。


该文件位于什么文件中?我可以在项目(* .csproj)文件中找到“ Service Include”部分,但在PackageReference中找不到。
克里斯·本内特

@ test.csproj文件中的@ChrisBennet。
叶夫根尼·纳博科夫

1
@ evgeni-nabokov是正确的。所有这些更改都在[project] .test.csproj文件中。在解决方案上的项目上单击右键,并选择“编辑[项目] .test.csproj”见例如:github.com/RenetConsulting/angularcore.net/blob/master/Business/...
亚历Altotsky

5

我知道OP已在他的清单中列出了这一点,但是在全新安装Visual Studio 2017并设置新项目时,很容易忽略这一点。除了NUnit项目模板NUnit Framework外,还需要单独安装NUnit适配器,例如,使用NuGet命令Install-Package NUnit3TestAdapter -Version 3.9.0。之后,Visual Studio Community 2017开始没有任何问题地发现单元测试。


1
这对我有帮助!
YvesR

天哪,这是为我做的。如果我能用赏金给你淋湿,我会的。
灰烬

这是唯一对我有用的解决方案,谢谢!
Vadim Tofan

5

就我而言,将项目移至新解决方案后,测试浏览器找不到我的测试。

答案很简单,就是我在项目中引用了旧的MS测试适配器。

我的cs.proj文件中的MS Test Adapter版本1.1.11与下面的行重复:

<Import Project="..\packages\MSTest.TestAdapter.1.1.18\build\net45\MSTest.TestAdapter.props" Condition="Exists('..\packages\MSTest.TestAdapter.1.1.18\build\net45\MSTest.TestAdapter.props')" />

为了解决这个问题,

  1. 右键单击项目,然后选择“卸载项目”。
  2. 右键单击项目,然后选择“编辑”
  3. 删除导入旧版本适配器的行。
  4. 右键单击项目,然后选择“重新加载项目”。
  5. 重建解决方案/项目

有同样的问题。删除和重建解决方案无效。重新启动VS,并发现测试!
Mike Ward

4

只是因为Visual Studio无法找到我的测试而出现了这个问题,除了方法之外,看不到运行它们的按钮,并且没有通过运行项目中的所有测试来获取它们。

原来我的测试课不是公开的!将其公开允许VS发现测试。


2

对我来说,创建一个可以与Visual Studio 2017完美配合的新测试项目更加容易。。。只需复制测试文件,添加引用和NuGet包即可。

在此处输入图片说明


创建新项目可能节省了数小时的头痛!
M.kazem Akhgary

2

就我而言,这是一个项目,我从较早的.Net版本升级了测试项目。在app.config中,我具有到以前版本的从属程序集的程序集绑定。

修复了app.config中的assembnlybindings之后,发现了我的测试。


2

发现

上面的最佳答案对我不起作用(重新启动,更新到1.1.18版...我已经更新,删除临时文件,清除NuGet缓存等)。

我发现在不同的测试项目中我对MSTest.TestAdapterMSTest.Framework的引用不同(我的解决方案有两个)。一个指向1.1.18,就像...

packages.config

<package id="MSTest.TestAdapter" version="1.1.18" targetFramework="net461" />
<package id="MSTest.TestFramework" version="1.1.18" targetFramework="net461" />

...但是另一个引用了1.1.11。重新启动Visual Studio后,当我的临时目录(%TEMP%\ VisualStudioTestExplorerExtensions \)中出现两个版本的库时,上述某些答案将导致此发现。

只需将我的packages.config更新到1.1.18版本,即可恢复VS中的单元测试功能。似乎有些错误不允许MSTest库的并行引用。希望这对您有所帮助。

更多信息:

  • Visual Studio 2017 Ent:15.5.6(我已从15.0.1更新,希望能解决此问题,但我俩都有)

2

解决方案是app.config从单元测试项目中删除文件。测试将重新出现!

该文件在bindingredirects中引用了一些dll,而这些DLL在项目引用中实际上并不存在。重新添加您的项目严格必需的assemblybindings。


1

就我而言,解决方案中存在UWP项目导致了问题。

当我卸载UWP项目时,发现了测试。当我装回它时,测试又消失了。

尝试卸载所有项目并仅保留测试项目。十个重建解决方案和测试记录出现在Test Runner中。逐一加载项目并每次重新生成解决方案,以找出导致问题的项目

样品回购

VS错误报告


感谢您的答复,但这不是我的问题。如果您查看我在问题中链接到的示例存储库,则解决方案中只有一个项目。没有其他要删除的项目。该解决方案虽然是一个测试,所以我确实尝试了您所说的在我的实际解决方案上卸载项目,但是没有用。
rayepps

1

问题

问题在于,Visual Studio对计算机上的dotnet核心版本感到“困惑”。当我转到控制面板->卸载程序时,我安装了8个不同的dotnet core SDK和Runtime。这以某种方式导致VS在尝试查找测试时无提示地出现错误。

验证问题

您可以通过转到命令行并启用dotnet的版本来验证问题$ dotnet --version。如果您看到的除了安装的最新版本以外的任何内容,则表明您的机器存在某些不匹配,并且未使用正确的版本。示例...如果您已经1.0.1安装了dotnet core,但是当您在命令提示符下获得该版本时,则表示1.0.0存在问题。

解决方案

删除所有旧内容。我仅从我需要删除的内容(最旧的dotnet rc版本)开始,但是在测试问题时它仍然给出了错误的版本。最终,我承认要彻底清洗。一世...

  • 卸载所有Visual Studio应用程序(在我的机器VS2015和VS2017上)
  • 卸载所有版本的dotnet core(即使是最新版本)

当我的机器上的所有VS和donet 完全耗尽后,我安装 VS2017(随附于最新的dotnet)。我创建了一个测试的xUnit项目和探险家发现测试立即测试解决

这似乎有些矫kill过正,但我​​花了两个星期的时间以其他方式解决此问题。如果您只是遇到问题,即使卸载/重新安装项目可能要花几个小时,也可能会节省您的时间。

参考资料

  • 请参阅@epestic 博客文章,他在其中提供了解决此问题的更多详细信息。

1

我已经尝试了一切,但没有任何帮助。就我而言,我有一个包含多个测试项目的解决方案,其中一些正在使用旧的ms-test框架,因此Visual Studio仅找到那些。

接受的答案所示,我为所有测试项目安装了测试框架软件包。然后删除对旧质量工具的引用,重新启动Visual Studio,现在我可以看到所有测试。


1

对于C ++:

由于C ++测试没有特别的问题,但是主题几乎相同,这是当我遇到测试发现方面的问题时对我有所帮助的内容。

如果仅使用C ++安装了桌面开发,则解决方案是同时使用可选的C ++通用Windows平台工具安装通用Windows平台开发。您可以在Visual Studio Web安装程序中选择它们。

之后,重建您的测试项目,测试发现应该起作用。

顺便说一句,我在VS2017中创建了单元测试项目。可能很重要,因为有些用户提到,他们在从VS2015迁移到VS2017的项目中遇到发现问题。



1

我遇到过同样的问题。我的解决方案还可以,但是突然我打开解决方案时发现测试已经消失了。

最终,我降级Microsoft.VisualStudio.TestPlatform.TestFramework并将其Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions打包到一个非常旧的版本(使用NuGet管理器),并显示了测试方法。然后我升级到最新版本,但仍然在那里。

因此,只需降级和升级软件包。


1

就我而言,以上这些都对我没有帮助。但是,我将NUNit3TestAdapter降级到3.8.0版,然后升级到最新版本(3.10.0)


1

有时更改测试的名称空间是可行的。我的文件夹结构如下:

A |___B | |___D |___C___E

命名空间像Tests。<name>一样平坦,它们没有显示在测试窗口中。当我将名称空间更改为目录的结构时,所有测试都显示出来。现在,我可以恢复到我想要的任何其他名称空间结构。

不要忘记构建您的项目!


1

对于.NET Framework,在测试项目中,以前曾引用以下DLL:

Microsoft.VisualStudio.TestPlatform.TestFramework
Microsoft.VisualStudio.TestPlatform.TestFramework.Extentions

我删除了它们并添加了对以下内容的引用:

Microsoft.VisualStudio.QualityTools.UnitTestFramework

然后出现了所有测试,并以与以前相同的方式开始工作。

之前,我几乎尝试了所有其他建议,但是只是重新引用测试DLL即可正常工作。我将这个答案发布给了我的人。


1

为了解决这个问题,我遇到了同样的问题

  1. 我打开了Windows控制台(Windows键+ cmd)。
  2. 导航到创建项目的文件夹。
  3. 执行命令“ dotnet测试”,基本上与Visual Studio执行相同的测试,但是当您通过控制台运行它时,它使您可以查看完整的跟踪。
  4. 我收到此错误消息“在非公共类MSTest.TestController.BaseTest上定义的TestClass属性”
  5. 因此,我转到了测试用例并将其标记为公共,然后再次构建,并且测试可以正确显示

0

首先,我尝试使用MSTest。之后,我将其更改为Nunit测试。然后我想支持MSTest。我删除了所有nUnit代码和引用,但是Test Explorer没有显示MSTest方法。解决方案:我删除了所有mstest nuget引用并重新安装。做完了


0

对我来说,将测试项目.csproj文件中的TargetFramework更改为

  <PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>
  </PropertyGroup>

  <PropertyGroup>
    <TargetFramework>net46</TargetFramework>
  </PropertyGroup>

工作了。


0

在我的情况下,问题是项目类型设置为静态库(lib),而它应该是动态库(dll)

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.