Unit Tests not discovered in Visual Studio 2017
自从我安装它以来,我一直在与VS 2017挣扎。现在似乎单元测试只能从命令行"dotnet test"运行。
我的项目是.NET Core 1.1.1。我安装了SDK和1.1.1的框架更新。
我在MSDN上尝试了这个示例(https://msdn.microsoft.com/en-us/library/ms182532.aspx),它也完全失败了。
测试和主项目的所有NuGet包都是最新的。测试项目和主项目都没有错误地构建。测试从命令行成功运行。
有没有人在VS 2017中进行单元测试,如果是这样的话怎么样?
谢谢,
约翰
更新 - 扩展
以下是一个不能在GitHub上运行的简单测试项目的示例。这是xUnit的一个例子,但我尝试过在MS测试中构建的NUnit和visual studio。无论我做什么测试或改变我都无法让VS测试运行器找到任何测试。
我试过的
-
删除VS测试缓存文件
DEL %TEMP%\VisualStudioTestExplorerExtensions - 重启VS.
- 关闭/打开测试资源管理器
-
for xUnit安装
Microsoft.DotNet.InternalAbstractions (参见SO帖子) - 对于NUnit,请确保已安装适配器,并且与NUnit软件包版本(3)相同
-
test -> test settings -> default processor architecture 设置为x86
问题
任何人都可以在VS2017(.csproj项目文件)中提供.Net Core 1.1.0解决方案的工作示例,其中VS测试资源管理器成功找到单元测试或在给出的示例中向我显示问题。
就我而言,事实证明我只需要升级我的测试适配器和测试框架。完成。
使用NuGet包管理器的示例:
这对我来说很有用(不知道是否是更改工作区损坏了某些内容的结果):
在%TEMP% VisualStudioTestExplorerExtensions中删除VS测试缓存文件并重新启动VS2017。
随着Visual Studio 2017的发布以及从
适配器已更新,但您在Visual Studio中或在命令行上使用
首先,您的测试项目必须针对特定平台,.NET Core或.NET Framework。即使您测试的代码是.NET Standard,它也无法以.NET Standard为目标。这是因为测试的目标指示了运行测试的平台。 .NET Standard就像PCL(可移植类库),因为它可以在许多平台上运行。
接下来,您需要添加对
1 2 3 4 5 | <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> |
上面的评论提到添加,
1 2 3 | <ItemGroup> <Service Include="{82a7f48d-3b50-4b1e-b82e-3ada8210c358}" /> </ItemGroup> |
这不是严格要求,但可以提供帮助。它由Visual Studio自动添加到所有单元测试项目中,以帮助它快速查找带有测试的项目。
如果您的测试没有出现在Visual Studio中,首先要尝试关闭解决方案,然后重新打开它们。在编辑项目时,Visual Studio中似乎没有检测到项目更改的错误。
有关更多信息,请参阅在Visual Studio 2017中使用NUnit测试.NET Core
我有同样的问题,并通过以下方式让它工作..:
- 首先关闭所有打开的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以检测我的测试。
忘记让测试类公开防止里面的测试方法被发现
我有一个默认的xUnit项目并删除了示例UnitTest1.cs,用控制器测试类替换它,并进行了几次测试,但没有找到
长话短说,在更新xUnit,Test.Sdk,xUnit.runner包并重建项目后,我遇到了构建错误:
Error xUnit1000 Test classes must be public
值得庆幸的是,更新后的版本抛出了这个异常,以免给我带来麻烦
修改测试类是公开修复我的问题
在我的情况下,我将测试项目定位到
将测试设置Architecture设置为
我在VS 2017找到我的UnitTest时遇到了麻烦。这不是约翰所问的确切问题 - 但这是谷歌中第一个我寻找的结果,所以我想分享我的问题。
我有一个传统的解决方案从VS2010回来VS2013,VS2015。现在在VS2017中,
在它使用之前
1 | Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.0.0.0 |
我在项目中创建了一个新的Test.dll,默认情况下使用了一个
1 | Microsoft.VisualStudio.TestPlatform.TestFramework, Version=14.0.0.0 |
所以我的解决方案是在VS2017中创建一个新的UnitTest项目。也许改变旧测试项目的程序集引用也会起作用。随着新的参考VS2017确实发现了那些单元测试。
不要阅读MSDN下的过时文章。 .NET Core相关材料位于docs.microsoft.com下
https://docs.microsoft.com/en-us/dotnet/articles/core/testing/
一般来说,您需要一个.NET Core控制台应用程序来包含单元测试用例。
我知道OP在他的清单上列出了这个,但是在干净安装Visual Studio 2017和设置新项目时很容易忽略这一点。除了NUnit项目模板和NUnit Framework之外,还需要单独安装NUnit适配器,例如:使用NuGet命令
确保您使用的是正确的Microsoft.NET.Test.Sdk:
1 | <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0" /> |
不要使用预发布的。或者您必须更改为控制台应用程序(而不是库)。
我有类似的问题,但随着最新版本(15.0.0)它再次开始工作。
此外,您可能需要添加:
1 2 3 | <ItemGroup> <Service Include="{82a7f48d-3b50-4b1e-b82e-3ada8210c358}" /> </ItemGroup> |
但我认为这不是必须的。
对我来说问题是我错误地将测试用例放在内部课程中
1 2 3 | [TestClass] internal class TestLib { } |
这导致测试用户无法识别。
只是有了这个问题,Visual Studio无法找到我的测试,除了方法之外无法看到按钮运行它们,并且他们没有通过运行项目中的所有测试来获取。
原来我的测试课不公开!公开让VS发现测试。
在我的情况下,在将项目移动到新解决方案后,测试资源管理器无法找到我的测试。
答案很简单,我在项目中引用了旧的MS Test Adapter。
我在cs.proj文件中的MS Test Adapter版本1.1.11下面有一行副本:
要解决这个问题,
解决方案是从我的单元测试项目中删除我的
此文件引用了bindingredirects中的一些dll,这些dll实际上不存在于项目引用中。重新添加项目严格必需的装配绑定。
对我来说,更容易创建一个与Visual Studio 2017完美配合的新测试项目......只需根据需要复制测试文件,添加引用和NuGet包。
发现
上面的顶部答案对我不起作用(重新启动,更新到版本1.1.18 ...我已经更新,删除临时文件,清除NuGet缓存等)。
我发现我在不同的测试项目中对MSTest.TestAdapter和MSTest.Framework有不同的引用(我的解决方案有两个)。有人指出1.1.18喜欢......
packages.config
1 2 | <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更新了希望解决这个问题,但我在两者中都有它)
就我而言,这是一个我从早期的.Net版本升级测试项目的项目。在app.config中,我将程序集绑定到以前版本的依赖程序集。
在app.config中修复了assembnlybindings之后,我的测试被发现了。
我已经尝试了一切,但没有任何帮助。在我的情况下,我有一个包含多个测试项目的解决方案,其中一些使用旧的ms-test框架,因此Visual Studio只找到了那些。
我为所有测试项目安装了测试框架包,如接受的答案所示。然后删除旧质量工具的引用,重新启动Visual Studio,现在我可以看到所有测试。
我遇到过同样的问题。我的解决方案没问题,但突然当我打开解决方案时,我发现测试已经消失了。
最后,我将
所以只需降级和升级包。
在我的例子中,UWP项目存在于导致问题的解决方案中。
当我卸载UWP项目时,发现了测试。当我把它装回去时,测试再次消失。
尝试卸载所有项目并仅保留测试项目。 Test Runner中出现了十个重建解决方案和测试。逐个加载项目并每次重建解决方案以找出导致问题的项目
样品回购
VS错误报告
对于C ++:
由于C ++测试没有特别的问题,但主题非常相似,当我遇到测试发现问题时,这就是帮助我的原因。
如果您只安装了使用C ++的Desktop开发,那么解决方案是使用可选的C ++ Universal Windows Platform工具安装通用Windows平台开发。您可以在visual studio Web安装程序中选择它们。
然后,重建您的测试项目,测试发现应该有效。
顺便说一下,我在VS2017中创建了单元测试项目。可能很重要,因为有些用户提到,他们在项目中有发现问题,从VS2015迁移到VS2017。
删除旧的.dll应该有所帮助。清除位于C: Users(yourusername) AppData Local Temp的%TEMP%目录中的临时文件
在我的情况下,以上都没有对我有所帮助。
但是,我将NUNit3TestAdapter降级到版本3.8.0,然后升级到最新版本(3.10.0)
检查是否启用了NUnit 3测试适配器。在我的情况下,我已经很久以前安装了它,但突然间它以某种方式被禁用了。在我决定检查那部分之前,我花了很长时间...
我删除了项目的BIN和OBJ文件夹。一旦我这样做,一切正常。
问题
问题是Visual Studio对机器上的dotnet核心版本感到"困惑"。当我去控制面板 - >卸载程序时,我安装了8个不同的dotnet核心SDK和Runtimes。这在某种程度上导致VS在尝试查找测试时默默地出错。
验证问题
您可以通过转到命令行并在
解决方案
删除所有旧的东西。我开始只使用我需要删除的内容(最旧的dotnet rc版本),但在测试问题时它仍然提供了错误的版本。最终我承认做了彻底清洁。一世...
- 卸载所有visual studio应用程序(在我的机器VS2015和VS2017上)
- 卸载所有版本的dotnet核心(甚至是最近的版本)
在我的机器完全没有所有VS和donet之后,我只安装了VS2017(它附带最新的dotnet)。我创建了一个xUnit测试项目,测试资源管理器立即找到了测试
这似乎有点矫枉过正,但我??花了两周的时间试图以其他方式解决这个问题。如果您遇到问题,即使卸载/重新安装项目可能需要数小时,也可能会节省您的时间。
参考
- 请参阅@epestic博客文章,其中提供了有关修复问题的更多详细信息。
有时更改测试的命名空间有效。我有如下文件夹结构:
|___B
| |___D
|___C___E
命名空间与测试。
别忘了建立你的项目!
起初,我试图使用MSTest。之后,我将其更改为Nunit测试。然后我想支持MSTest。我删除了所有nUnit代码和引用,但Test Explorer没有显示MSTest方法。解决方案:我删除了所有mstest nuget引用并重新安装。完成。
有时,我发现如果你的单元测试代码中有stackoverflow异常,visual studio会将该单元测试用例标记为未运行,并将停止运行其他跟随此情况的测试用例。
在这种情况下,您必须找出导致stackoverflow异常的情况。
在我的情况下,问题是项目类型设置为静态库(lib),它应该是一个动态库(DLL)
对于.NET Framework,在测试项目中,以前引用了以下DLL:
1 2 | Microsoft.VisualStudio.TestPlatform.TestFramework Microsoft.VisualStudio.TestPlatform.TestFramework.Extentions |
我删除了它们并添加了对:
1 | Microsoft.VisualStudio.QualityTools.UnitTestFramework |
然后所有测试都出现并开始以与以前相同的方式工作。
我之前尝试了几乎所有其他建议,但只是重新引用测试DLL工作正常。
我为那些在我案件中的人发布了这个答案。
对我来说,更改测试项目的
1 2 3 | <PropertyGroup> <TargetFramework>netcoreapp2.0</TargetFramework> </PropertyGroup> |
至
1 2 3 | <PropertyGroup> <TargetFramework>net46</TargetFramework> </PropertyGroup> |
工作。
我有同样的问题,我通过将应用程序输出类型更改为控制台应用程序来解决它,如下所示: