在 Visual Studio 2017 中未发现单元测试
Posted
技术标签:
【中文标题】在 Visual Studio 2017 中未发现单元测试【英文标题】:Unit Tests not discovered in Visual Studio 2017 【发布时间】:2017-08-09 06:30:51 【问题描述】:自从安装 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
(see SO post)
对于 NUnit,请确保已安装适配器并且版本 (3) 与 NUnit 包相同
test -> test settings -> default processor architecture
设置为 x86
问题 谁能在VS2017(.csproj项目文件)中提供一个.Net Core 1.1.0解决方案的工作示例,其中VS测试资源管理器成功找到单元测试或向我展示给定示例中的问题.
【问题讨论】:
我发现VS2017没有安装所有需要的包。当我尝试将我的 MonoGame 从旧 PC 移动到新安装的 Windows 10 和 VS 2017 的新 PC 时,它开始抛出关于缺少软件包的奇怪错误。在将 VS2015 与 VS2017 一起安装后,所有问题都消失了。也许尝试额外安装 VS2015。 尝试使用 Visual Studio 安装程序安装测试包 我正在调查 VS 2017 是否正确设置了所有环境变量。 对于 NUnit,您必须为适配器使用 NuGet 包,并且它必须是 3.8.0-alpha1 或更新版本。 在我的情况下,我的测试项目中仅存在app.config
文件:***.com/a/47497668/67824。
【参考方案1】:
不要阅读 MSDN 下过时的文章。 .NET Core 相关资料在 docs.microsoft.com 下
https://docs.microsoft.com/en-us/dotnet/articles/core/testing/
一般来说,您需要一个 .NET Core 控制台应用程序来包含单元测试用例。
【讨论】:
非常感谢,莱克斯。如果这篇文章是正确的,那么测试 .NET Core 的唯一方法是从命令行——因此失去了我们在 VS 2015 中运行测试时所拥有的所有 VS 集成。我在这方面是否正确? 你使用 xUnit.net 还是 MSTest? @JohnPezzanite 你必须展示更多你所做的事情(如果可能的话,可能是一个 GitHub 存储库)。我在 GitHub 上确实有完美运行的项目,还有许多其他项目。 按照我提供的行中的示例进行操作。我已经使用 .NET 标准和 .NET Core 以及示例中的 Microsoft 单元测试和 xUnit 进行了尝试。 .NET 标准与 VS 2017 集成,而 .NET Core 只能从命令行运行。但我在重复我上面所说的。听起来微软已经从 VS 2017 中删除了所有 .NET Core 单元测试集成。 @JohnPezzanite 测试 GitHub.com/lextm/sharpsnmplib 及其 NetStandard 解决方案。【参考方案2】:就我而言,是解决方案中存在的 UWP 项目导致了问题。
当我卸载 UWP 项目时,发现了测试。当我重新加载它时,测试又消失了。
尝试卸载所有项目并仅保留测试项目。十个重建解决方案和测试应该出现在 Test Runner 中。一个一个地加载项目,每次都重新构建解决方案,找出是什么项目导致了问题
sample repo
VS bug report
【讨论】:
感谢您的回复,但这不是我的问题。如果您查看我在问题中链接到的示例存储库,则解决方案中只有一个项目。没有其他项目要删除。该解决方案虽然是一个测试,但我确实尝试了您所说的在我的实际解决方案上卸载项目,但它没有用。【参考方案3】:问题
问题在于 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 测试项目,测试资源管理器立即找到了测试已解决
这可能看起来有点矫枉过正,但我花了两周时间尝试以其他方式解决这个问题。如果您遇到问题,请执行此操作,即使卸载/重新安装项目可能需要数小时,它也可能会节省您的时间。
参考文献
请参阅 @epestic blog post,他会在其中提供有关解决问题的更多详细信息。【讨论】:
【参考方案4】:确保您使用的是正确的 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) 文件中找到“服务包含”部分,但在 PackageReference 中找不到。 @ChrisBennet 在您的 *test.csproj 文件中。 @evgeni-nabokov 是对的。所有这些更改都在 [project].test.csproj 文件中。右键单击解决方案中的项目并选择“编辑 [项目].test.csproj” 参见示例:github.com/RenetConsulting/angularcore.net/blob/master/Business/…【参考方案5】:我遇到了同样的问题,并通过执行以下操作使其正常工作:
首先,关闭所有打开的 Visual Studio 实例并删除此文件夹:%TEMP%\VisualStudioTestExplorerExtensions (Running tests with Visual Studio) 转到您的 NuGet 包管理器并首先安装 Microsoft.NET.Test.Sdk (15.3.0-preview-20170425-07),然后安装 xunit.runner.visualstudio (2.3.0-beta1-build1309)。请参阅随附的 NuGet 屏幕截图,以查看我必须安装的所有包以获取最新的 VS 2017 以检测我的测试。【讨论】:
删除 %Temp%\VisualStudioTestExplorerExtensions 对我来说已经足够了。 是的。只需删除它并重新启动 VS 即可修复它。 有谁知道这首先是什么原因造成的?我现在已经发生过两次了,但是删除该文件夹并重新启动 VS 是可行的。这很奇怪。 @PmanAce - 实际上我做到了。我正在使用两个不同的 TFS 实例(每个项目一个),因此当我切换项目时工作区会自动更改。 删除文件夹并添加 nugetMicrosoft.NET.Test.Sdk
似乎对我有用.. 谢谢 ***。 (.NET Framework WebApi 2 解决方案)【参考方案6】:
随着 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 中似乎存在错误,在您编辑项目时未检测到对项目的更改。
有关详细信息,请参阅Testing .NET Core with NUnit in Visual Studio 2017。
【讨论】:
定位 .NET Framework 而不是 .NET Standard 对我有用。谢谢。 我的项目中缺少 Microsoft.NET.Test.SDK 引用,并且没有任何迹象表明任何地方都依赖它来显示。通过 nuget 控制台添加它,一切都开始工作了。感谢您的参考清单! 我不得不将此文件夹从同事复制到我的临时目录并重新启动 VS: %TEMP%\VisualStudioTestExplorerExtensions\MSTest.TestAdapter.1.1.18 如果我更改了我的目标框架,如何测试 netstandard 2.0 项目?我不能再编译了,因为一个项目 netstandard2.0 不能被一个 tagets net46 的项目引用 这对我有用。感谢您的详细解决方案。【参考方案7】:就我而言,结果证明我只需要升级我的测试适配器和测试框架。完成。
使用 NuGet 包管理器的示例:
【讨论】:
这对我也有帮助!请注意,您可以在解决方案级别“管理 Nuget 包”,并对所有需要此操作的项目执行此操作。然后,您可能会收到“模糊参考”错误 - 对于这些,只需从参考中删除旧 DLL (Microsoft.VisualStudio.QualityTools.UnitTestFramework) 这些东西应该是 Visual Studio 的扩展,而不是 NuGet 包。 我们有很多旧的 MSTest 项目,我不知道它已移至 NuGet 包。这也为我解决了这个问题,最初认为这是 ReSharper 较新版本的错误,直到我意识到 VS 测试资源管理器也无法发现我的测试。 我做了与此答案所述完全相同的事情。在我的 VS2017 解决方案中,我添加了一个 MSTest 项目,添加了一些测试,但是构建解决方案会导致:发现测试完成:0 找到。因此,对于测试项目,在 NuGet 包管理器(您也可以在解决方案级别执行)中,我将 MSTest.TestAdapter 和 MSTest.TestFramework 从 v1.1.18 更新到 v1.2.0。然后,在构建之后,我的测试现在出现在测试资源管理器中。 对我来说工作得很好我不得不进入 VS2017 中的 nuget 包管理器来进行特定的测试项目,并简单地更新我拥有的各种包,比如 nunit 等,然后构建 > 重建,一切正常。【参考方案8】: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 确实发现了那些单元测试。
【讨论】:
可悲的是,即使是一个新的单元测试项目也没有为我展示它的测试:/【参考方案9】:对我来说,创建一个与 Visual Studio 2017 完美配合的新测试项目更容易...并且只需根据需要复制测试文件、添加引用和 NuGet 包。
【讨论】:
创建新项目可能会节省数小时的头痛!【参考方案10】:我已经尝试了一切,但没有任何帮助。就我而言,我有一个包含多个测试项目的解决方案,其中一些使用旧的 ms-test 框架,因此 Visual Studio 只找到了那些。
我为所有测试项目安装了测试框架包,如this answer 所示,然后删除了对旧质量工具的引用,重新启动了 Visual Studio,现在我可以看到所有测试。
【讨论】:
【参考方案11】:起初,我尝试使用 MSTest。之后,我将其更改为 Nunit 测试。然后我想支持 MSTest。我删除了所有 nUnit 代码和引用,但测试资源管理器没有显示 MSTest 方法。解决方案:我删除了所有 mstest nuget 引用并重新安装。完成。
【讨论】:
【参考方案12】:在我将项目移至新解决方案后,测试资源管理器无法找到我的测试。
答案很简单,因为我在项目中引用了旧的 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')" />
要解决问题,
-
右键单击项目并选择“卸载项目”。
右键单击项目并选择“编辑”
删除导入旧版本适配器的行。
右键单击项目并选择“重新加载项目”。
重建解决方案/项目
【讨论】:
遇到了同样的问题。删除和重建解决方案不起作用。重启VS,发现测试!【参考方案13】:对我来说,将测试项目的 .csproj
文件中的 TargetFramework 从
<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>
</PropertyGroup>
到
<PropertyGroup>
<TargetFramework>net46</TargetFramework>
</PropertyGroup>
工作。
【讨论】:
【参考方案14】:这对我有用(不知道是否是由于更改工作区而损坏了某些东西):
删除 %TEMP%\VisualStudioTestExplorerExtensions 中的 VS 测试缓存文件并重启 VS2017。
【讨论】:
这一次有效,而不是之后。 (这一次)为我修复的是删除 TestResults 文件夹和 bin/obj (连同这个临时目录清理) 任何想知道%TEMP%
在哪里的人-打开命令窗口并输入echo %TEMP%
临时文件夹不存在:/
那么这种行为的原因是什么?
访问 %TEMP% 的最简单方法是 win+R 并输入 %TEMP%【参考方案15】:
我有同样的问题。我的解决方案还可以,但是当我打开解决方案时突然发现测试已经消失了。
最后我将Microsoft.VisualStudio.TestPlatform.TestFramework
和Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions
包降级到了一个非常旧的版本(使用NuGet 管理器)并且测试方法出现了。然后我升级到最新版本,仍然存在。
所以只需降级和升级软件包。
【讨论】:
【参考方案16】:在我的例子中,我将测试项目定位到 x64
架构,并将测试设置架构(测试 > 默认处理器架构)更改为 x86
。他们不匹配。
将测试设置 Architecture 设置回x64
并重新构建后,再次发现所有测试。
【讨论】:
在 vs2017 中从菜单测试 -> 测试设置 -> 默认处理器架构中的设置【参考方案17】:忘记将测试类设为public会阻止内部的测试方法被发现。
我有一个默认的 xUnit 项目并删除了示例 UnitTest1.cs,将其替换为控制器测试类,进行了几次测试,但没有找到。
长话短说,在更新xUnit、Test.Sdk、xUnit.runner 包并重新构建项目后,我遇到了构建错误:
错误 xUnit1000 测试类必须公开
谢天谢地,更新版本抛出了这个异常,让我免于麻烦。
将测试类修改为公开解决了我的问题。
【讨论】:
不知道为什么投了反对票,但在我早上喝咖啡 100% 之前,这被我忽略了。 尝试了这个问题/问题的所有其他答案,这是最终奏效的答案! 那是令人难以置信的尴尬,但.. 无论如何。有趣的是,如果你在 VS2017 中创建一个测试套件用例,它不会生成public
类,而只是生成类,所以在你添加 public
之前它不会发现它标识符。
当然。我的错 - mstest 应该有这个功能。【参考方案18】:
就我而言,这是一个我从早期 .NET 版本升级测试项目的项目。在 app.config 中,我将程序集绑定到依赖程序集的早期版本。
在 app.config 中修复了 assembnlybindings 后,我的测试被发现了。
【讨论】:
【参考方案19】:我知道 OP 已在他的清单中列出了这一点,但在全新安装 Visual Studio 2017 和设置新项目时很容易忽略这一点。除了NUnit project template 和NUnit Framework 之外,还需要单独安装 NUnit 适配器,例如使用 NuGet 命令Install-Package NUnit3TestAdapter -Version 3.9.0
。之后,Visual Studio Community 2017 开始发现没有任何问题的单元测试。
【讨论】:
这对我有帮助! 天啊,这个是为我做的。如果我能用赏金淹没你,我会的。 这是唯一对我有用的解决方案,谢谢!【参考方案20】:发现
上面的最佳答案对我不起作用(重新启动、更新到版本 1.1.18 ...我已经更新、删除临时文件、清除 NuGet 缓存等)。
我发现我在不同的测试项目中对 MSTest.TestAdapter 和 MSTest.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 更新,希望能解决此问题,但我在这两个版本中都有)【讨论】:
【参考方案21】:对于 C++:
由于没有针对 C++ 测试的特殊问题,但主题非常相似,因此当我遇到测试发现问题时,以下是对我的帮助。
如果您只安装了使用 C++ 进行桌面开发,那么解决方案是同时安装带有可选 C++ 通用 Windows 平台工具通用 Windows 平台开发 /强>。您可以在 Visual Studio Web 安装程序中选择这些。
之后,重建您的测试项目,测试发现应该可以工作了。
顺便说一句,我在 VS2017 中创建了单元测试项目。这可能很重要,因为一些用户提到,他们在从 VS2015 迁移到 VS2017 的项目中发现问题。
【讨论】:
【参考方案22】:删除旧的 .dll 应该会有所帮助。清除位于 C:\Users(yourusername)\AppData\Local\Temp
的 %TEMP% 目录中的临时文件【讨论】:
【参考方案23】:解决方案是从我的单元测试项目中删除我的 app.config
文件。测试将重新出现!
该文件在绑定重定向中引用了一些 dll,而这些 dll 在项目引用中实际上并不存在。重新添加项目所必需的程序集绑定。
【讨论】:
【参考方案24】:在我的情况下,以上都对我没有帮助。 但是,我将 NUUnit3TestAdapter 降级到 3.8.0 版本,然后升级到最新的 (3.10.0)
【讨论】:
【参考方案25】:刚刚遇到这个问题,Visual Studio 无法找到我的测试,除了方法之外看不到运行它们的按钮,并且运行项目中的所有测试都没有拾取它们。
原来我的测试课没有公开!将其公开允许 VS 发现测试。
【讨论】:
【参考方案26】:对我来说,问题是我错误地将测试用例放在了内部类中
[TestClass]
internal class TestLib
这导致无法识别测试用例。
【讨论】:
【参考方案27】:就我而言,问题在于项目类型设置为静态库(lib),它应该是动态库(dll)。
【讨论】:
【参考方案28】:有时,我发现如果您的单元测试代码中存在 *** 异常,Visual Studio 会将该单元测试用例标记为未运行,并停止运行此案例之后的其他测试用例。
在这种情况下,您必须找出导致***异常的情况。
【讨论】:
【参考方案29】:有时更改测试的命名空间会起作用。我的文件夹结构如下:
A
|___B
| |___D
|___C___E
命名空间像 Tests.
不要忘记构建您的项目!
【讨论】:
【参考方案30】:检查 NUnit 3 测试适配器是否启用。就我而言,我很久以前就已经安装了它,但突然它以某种方式被禁用了。我花了很长时间才决定检查那部分......
【讨论】:
以上是关于在 Visual Studio 2017 中未发现单元测试的主要内容,如果未能解决你的问题,请参考以下文章
在 Visual Studio 中未定义 UNITY_EDITOR
在Xamarin+Prism开发详解三:Visual studio 2017 RC初体验中分享了Visual studio 2017RC的大致情况,同时也发现大家对新的Visual Studio很
错误 LNK2019:Visual Studio 中未解析的外部符号 [重复]