自从安装 VS 2017 以来,我一直在苦苦挣扎。现在看来单元测试只能从命令行“dotnet test”运行。
我的项目是 .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 帖子)
对于 NUnit 确保已安装适配器并且版本 (3) 与 NUnit 包相同
测试 -> 测试设置 -> 默认处理器架构设置为 x86
问题任何人都可以在VS2017(.csproj项目文件)中提供.Net Core 1.1.0解决方案的工作示例,其中VS测试资源管理器成功找到单元测试或向我展示给出的示例中的问题。
app.config
文件:stackoverflow.com/a/47497668/67824。
就我而言,结果证明我只需要升级我的测试适配器和测试框架。完毕。
使用 NuGet 包管理器的示例:
https://i.stack.imgur.com/zbYwq.png
这对我有用(不知道这是否是更改工作区导致损坏的结果):
删除 %TEMP%\VisualStudioTestExplorerExtensions 中的 VS 测试缓存文件并重新启动 VS2017。
%TEMP%
在哪里的人 - 带上命令窗口并输入 echo %TEMP%
.NET Core 测试适配器的 API 随着 Visual Studio 2017 的发布以及从 project.json
格式到 csproj
格式的转变而发生变化。这使得现有的 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 中似乎存在未检测到项目更改的错误。
有关详细信息,请参阅 Testing .NET Core with NUnit in Visual Studio 2017。
忘记公开测试类会阻止内部的测试方法被发现。
我有一个默认的 xUnit 项目并删除了示例 UnitTest1.cs,将其替换为控制器测试类,进行了几次测试,但没有找到。
长话短说,在更新 xUnit、Test.Sdk、xUnit.runner 包并重新构建项目后,我遇到了构建错误:
错误 xUnit1000 测试类必须是公共的
值得庆幸的是,更新的版本抛出了这个异常,以免我遇到一些麻烦。
将测试类修改为公开解决了我的问题。
public
类,而只是生成该类,因此在添加 public
之前它不会发现它标识符。
我遇到了同样的问题,并通过执行以下操作使其工作:
首先,关闭所有打开的 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 来检测我的测试。
Microsoft.NET.Test.Sdk
似乎对我有用.. 谢谢 StackOverflow。 (.NET Framework WebApi 2 解决方案)
在我的例子中,我将测试项目定位为 x64
架构,并将测试设置架构(测试 > 默认处理器架构)更改为 x86
。他们不匹配。
将测试设置 Architecture 设置回 x64
并重建后,再次发现所有测试。
对我来说,问题是我错误地将测试用例放在了内部类中
[TestClass]
internal class TestLib {
}
这导致无法识别测试用例。
我在 VS 2017 中也无法找到我的 UnitTest。这不是约翰要问的确切问题 - 但这是我在谷歌寻找的第一个结果,所以我想分享我的问题。
我有一个从 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 确实发现了这些单元测试。
不要在 MSDN 下阅读过时的文章。 .NET Core 相关资料在 docs.microsoft.com 下
https://docs.microsoft.com/en-us/dotnet/articles/core/testing/
一般来说,您需要一个 .NET Core 控制台应用程序来包含单元测试用例。
确保您使用的是正确的 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>
但我不认为这是必要的。
我知道 OP 已经在他的清单上列出了这一点,但是在干净安装 Visual Studio 2017 和设置新项目时很容易忽略这一点。除了 NUnit project template 和 NUnit Framework 之外,还需要单独安装 NUnit 适配器,例如使用 NuGet 命令 Install-Package NUnit3TestAdapter -Version 3.9.0
。之后,Visual Studio Community 2017 开始发现没有任何问题的单元测试。
就我而言,在我将项目移至新解决方案后,测试资源管理器找不到我的测试。
答案很简单,因为我在项目中引用了旧的 MS 测试适配器。
我的 cs.proj 文件中的 MS 测试适配器 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')" />
要解决问题,
右键单击项目并选择“卸载项目”。右键单击项目并选择“编辑”删除导入旧版本适配器的行。右键单击项目并选择“重新加载项目”。重建解决方案/项目
刚刚遇到这个问题,Visual Studio 无法找到我的测试,除了方法之外看不到运行它们的按钮,并且没有通过运行项目中的所有测试来获取它们。
原来我的测试课没有公开!将其公开允许 VS 发现测试。
对我来说,创建一个与 Visual Studio 2017 完美配合的新测试项目更容易......并且只需根据需要复制测试文件、添加引用和 NuGet 包。
https://i.stack.imgur.com/9Ti2J.png
解决方案是从我的单元测试项目中删除我的 app.config
文件。测试将重新出现!
该文件在 bindingredirects 中引用了一些在项目引用中实际上并不存在的 dll。重新添加项目所必需的程序集绑定。
我遇到了同样的问题,在我的情况下,为了解决
我打开了 Windows 控制台(Windows 键 + cmd)。导航到创建项目的文件夹。执行命令“dotnet test”,它与 Visual Studio 执行的测试基本相同,但是当您通过控制台运行它时,它可以让您看到完整的跟踪。我收到此错误消息“在非公共类 MSTest.TestController.BaseTest 上定义的 TestClass 属性”所以我去测试用例并将其标记为公共,再次构建并且我的测试正在正确显示
就我而言,这是一个我从早期 .NET 版本升级测试项目的项目。在 app.config 中,我对依赖程序集的早期版本进行了程序集绑定。
在 app.config 中修复了 assembnlybindings 之后,我的测试被发现了。
发现
上面的最佳答案对我不起作用(重新启动、更新到版本 1.1.18 ...我已经更新、删除临时文件、清除 NuGet 缓存等)。
我发现我在不同的测试项目中对 MSTest.TestAdapter 和 MSTest.Framework 有不同的引用(我的解决方案有两个)。一个指向 1.1.18 就像...
包.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 更新,希望能解决这个问题,但我两个都有)
就我而言,是解决方案中存在的 UWP 项目导致了问题。
当我卸载 UWP 项目时,发现了测试。当我重新加载它时,测试再次消失了。
尝试卸载所有项目并仅保留测试项目。十个重建解决方案和测试应该出现在 Test Runner 中。一个一个地加载项目,每次都重新构建解决方案,找出是什么项目导致了问题
问题
问题是 Visual Studio 对机器上的 dotnet 核心版本感到“困惑”。当我进入控制面板 -> 卸载程序时,我安装了 8 个不同的 dotnet core SDK 和运行时。这在某种程度上导致 VS 在尝试查找测试时默默地出现错误。
验证问题
您可以通过转到命令行并在 $ dotnet --version
上获取 dotnet 的版本来验证问题。如果您看到除已安装的最新版本之外的任何内容,则说明您的计算机存在一些不匹配并且未使用正确的版本。示例...如果您安装了 dotnet core 1.0.1
,但是当您在命令提示符处获取版本时,它显示 1.0.0
,那就是一个问题。
解决方案
删除所有旧的东西。我只从我需要删除的内容(最旧的 dotnet rc 版本)开始,但在测试问题时它仍然给出了错误的版本。最终我承认做了一个完整的清洁。我...
卸载所有 Visual Studio 应用程序(在我的机器 VS2015 和 VS2017 上)
卸载了所有版本的 dotnet core(甚至是最新的)
在我的机器完全没有所有 VS 和 donet 后,我只安装了 VS2017(它与最新的 dotnet 一起打包)。我创建了一个 xUnit 测试项目,测试资源管理器立即找到了测试 SOLVED
这可能看起来有点矫枉过正,但我花了两周时间试图以其他方式解决这个问题。如果您遇到问题,请执行此操作,即使卸载/重新安装项目可能需要数小时,它也可能会节省您的时间。
参考
请参阅@epestic 博客文章,其中他提供了有关解决问题的更多详细信息。
对于 C++:
由于没有针对 C++ 测试的特殊问题,但主题非常相似,所以当我遇到测试发现问题时,这对我有帮助。
如果您只安装了使用 C++ 的桌面开发,那么解决方案是使用可选的 C++ 通用 Windows 平台工具安装通用 Windows 平台开发。您可以在 Visual Studio Web 安装程序中选择这些。
之后,重建您的测试项目,测试发现应该可以工作。
顺便说一句,我在 VS2017 中创建了单元测试项目。这可能很重要,因为一些用户提到,他们在从 VS2015 迁移到 VS2017 的项目中发现了问题。
删除旧的 .dll 应该会有所帮助。清除位于 C:\Users(yourusername)\AppData\Local\Temp 的 %TEMP% 目录中的临时文件
我遇到过同样的问题。我的解决方案还可以,但是当我打开解决方案时突然发现测试已经消失了。
最后,我将 Microsoft.VisualStudio.TestPlatform.TestFramework
和 Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions
包降级为非常旧的版本(使用 NuGet 管理器)并出现了测试方法。然后我升级到最新版本,仍然存在。
所以只需降级和升级软件包。
就我而言,以上都对我没有帮助。但是,我将 NUUnit3TestAdapter 降级到 3.8.0 版,然后升级到最新版(3.10.0)
有时更改测试的命名空间会起作用。我的文件夹结构如下:
A |___B | |___D |___C___E
命名空间像 Tests.
不要忘记构建您的项目!
对于 .NET Framework,在测试项目中以前引用了以下 DLL:
Microsoft.VisualStudio.TestPlatform.TestFramework
Microsoft.VisualStudio.TestPlatform.TestFramework.Extentions
我删除了它们并添加了对:
Microsoft.VisualStudio.QualityTools.UnitTestFramework
然后所有的测试都出现了,并开始以与以前相同的方式工作。
我之前尝试了几乎所有其他建议,但只需重新引用测试 DLL 就可以了。我为我的情况下的人发布了这个答案。
我已经尝试了一切,但没有任何帮助。就我而言,我有一个包含多个测试项目的解决方案,其中一些使用旧的 ms-test 框架,所以 Visual Studio 只找到了那些。
我为所有测试项目安装了测试框架包,如 this answer 所示,然后删除对旧质量工具的引用,重新启动 Visual Studio,现在我可以看到所有测试。
对我来说,将测试项目的 .csproj
文件中的 TargetFramework 从
<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>
</PropertyGroup>
至
<PropertyGroup>
<TargetFramework>net46</TargetFramework>
</PropertyGroup>
工作。
起初,我尝试使用 MSTest。之后,我将其更改为 Nunit 测试。然后我想支持 MSTest。我删除了所有 nUnit 代码和引用,但测试资源管理器没有显示 MSTest 方法。解决方案:我删除了所有 mstest nuget 引用并重新安装。完毕。
有时,我发现如果您的单元测试代码中存在 stackoverflow 异常,Visual Studio 会将该单元测试用例标记为未运行,并且将停止运行该用例之后的其他测试用例。
在这种情况下,您必须找出导致stackoverflow异常的情况。