在 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 实例(每个项目一个),因此当我切换项目时工作区会自动更改。 删除文件夹并添加 nuget Microsoft.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 版有以下行的副本:

&lt;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')" /&gt;

要解决问题,

    右键单击项目并选择“卸载项目”。 右键单击项目并选择“编辑” 删除导入旧版本适配器的行。 右键单击项目并选择“重新加载项目”。 重建解决方案/项目

【讨论】:

遇到了同样的问题。删除和重建解决方案不起作用。重启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.TestFrameworkMicrosoft.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.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 更新,希望能解决此问题,但我在这两个版本中都有)

【讨论】:

【参考方案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很

Visual Studio 2008 中未显示属性页

错误 LNK2019:Visual Studio 中未解析的外部符号 [重复]

C++ Visual Studio 2008 中未声明的标识符

我可以让 Visual Studio 停止任务代码中未处理的异常吗?