ChatGPT解决这个技术问题 Extra ChatGPT

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

自从安装 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测试资源管理器成功找到单元测试或向我展示给出的示例中的问题。

我发现 VS2017 没有安装所有需要的包。当我尝试将我的 MonoGame 从旧 PC 移动到新安装的 Windows 10 和 VS 2017 的新 PC 时,它开始抛出关于缺少软件包的奇怪错误。在将 VS2015 与 VS2017 一起安装后,所有问题都消失了。也许尝试额外安装VS2015。
尝试使用 Visual Studio 安装程序安装测试包
我正在调查 VS 2017 是否正确设置了所有环境变量。
对于 NUnit,您必须为适配器使用 NuGet 包,并且它必须是 3.8.0-alpha1 或更高版本。
在我的情况下,它只是在我的测试项目中存在一个 app.config 文件:stackoverflow.com/a/47497668/67824

Q
Quality Catalyst

就我而言,结果证明我只需要升级我的测试适配器和测试框架。完毕。

使用 NuGet 包管理器的示例:

https://i.stack.imgur.com/zbYwq.png


这对我也有帮助!请注意,您可以在解决方案级别“管理 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 等,然后构建 > 重建,一切都好。
P
PmanAce

这对我有用(不知道这是否是更改工作区导致损坏的结果):

删除 %TEMP%\VisualStudioTestExplorerExtensions 中的 VS 测试缓存文件并重新启动 VS2017。


这工作了一次,而不是之后。 (这一次)为我修复的是删除 TestResults 文件夹和 bin/obj (连同这个临时目录清理)
任何想知道 %TEMP% 在哪里的人 - 带上命令窗口并输入 echo %TEMP%
temp 中不存在文件夹:/
那么这种行为的原因是什么?
访问 %TEMP% 的最简单方法是 win+R 并输入 %TEMP%
P
Pang

.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


以 .NET Framework 而不是 .NET Standard 为目标对我有用。谢谢。
我的项目中缺少该 Microsoft.NET.Test.SDK 引用,并且没有任何迹象表明任何地方都依赖它来显示。通过 nuget 控制台添加它,一切都开始工作了。感谢您的参考清单!
我不得不将此文件夹从同事复制到我的临时目录并重新启动 VS:%TEMP%\VisualStudioTestExplorerExtensions\MSTest.TestAdapter.1.1.18
如果我更改了目标框架,如何测试 netstandard 2.0 项目?我不能再编译了,因为一个项目 netstandard2.0 不能被一个 tagets net46 的项目引用
这对我有用。感谢您的详细解决方案。
P
Pang

忘记公开测试类会阻止内部的测试方法被发现。

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

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

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

值得庆幸的是,更新的版本抛出了这个异常,以免我遇到一些麻烦。

将测试类修改为公开解决了我的问题。


不知道为什么投了反对票,但在我早上喝咖啡 100% 之前,这被我忽略了。
尝试了这个问题/问题的所有其他答案,这是最终奏效的答案!
那是令人难以置信的尴尬,但是……无论如何。有趣的是,如果您在 VS2017 中创建一个测试套件用例,它将生成 public 类,而只是生成该类,因此在添加 public 之前它不会发现它标识符。
当然。我的坏 - mstest 应该有这个功能。
P
Pang

我遇到了同样的问题,并通过执行以下操作使其工作:

首先,关闭所有打开的 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 来检测我的测试。


删除 %Temp%\VisualStudioTestExplorerExtensions 对我来说就足够了。
是的。只需删除它并重新启动VS即可修复它。
有谁知道首先是什么原因造成的?我现在已经发生过两次了,但是删除该文件夹并重新启动 VS 是可行的。这很奇怪。
@PmanAce - 实际上我做到了。我正在使用两个不同的 TFS 实例(每个项目一个),因此当我切换项目时工作区会自动更改。
删除文件夹,并添加 nuget Microsoft.NET.Test.Sdk 似乎对我有用.. 谢谢 StackOverflow。 (.NET Framework WebApi 2 解决方案)
P
Pang

在我的例子中,我将测试项目定位为 x64 架构,并将测试设置架构(测试 > 默认处理器架构)更改为 x86。他们不匹配。

将测试设置 Architecture 设置回 x64 并重建后,再次发现所有测试。


在 vs2017 中,从菜单测试 -> 测试设置 -> 默认处理器架构中的设置
P
Pang

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

[TestClass]
internal class TestLib {
}

这导致无法识别测试用例。


h
hartmape

我在 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 确实发现了这些单元测试。


可悲的是,即使是一个新的单元测试项目也没有为我显示它的测试:/
L
Lex Li

不要在 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 只能从命令行运行。但我在重复我上面所说的。听起来微软已经删除了所有 .NET Core 单元测试集成表格 VS 2017。
@JohnPezzanite 测试 GitHub.com/lextm/sharpsnmplib 及其 NetStandard 解决方案。
P
Pang

确保您使用的是正确的 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/…
M
Marcin Tarsier

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


这对我有帮助!
OMG,这个是为我做的。如果我能用赏金淹没你,我会的。
这是唯一对我有用的解决方案,谢谢!
j
jnt

就我而言,在我将项目移至新解决方案后,测试资源管理器找不到我的测试。

答案很简单,因为我在项目中引用了旧的 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并发现测试!
d
dahui

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

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


J
Jaider

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

https://i.stack.imgur.com/9Ti2J.png


创建新项目可能会节省数小时的头痛!
d
domenu

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

该文件在 bindingredirects 中引用了一些在项目引用中实际上并不存在的 dll。重新添加项目所必需的程序集绑定。


a
axcha15

我遇到了同样的问题,在我的情况下,为了解决

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


P
Pang

就我而言,这是一个我从早期 .NET 版本升级测试项目的项目。在 app.config 中,我对依赖程序集的早期版本进行了程序集绑定。

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


P
Pang

发现

上面的最佳答案对我不起作用(重新启动、更新到版本 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 更新,希望能解决这个问题,但我两个都有)


L
Liero

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

当我卸载 UWP 项目时,发现了测试。当我重新加载它时,测试再次消失了。

尝试卸载所有项目并仅保留测试项目。十个重建解决方案和测试应该出现在 Test Runner 中。一个一个地加载项目,每次都重新构建解决方案,找出是什么项目导致了问题

sample repo

VS bug report


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

问题

问题是 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 博客文章,其中他提供了有关解决问题的更多详细信息。


f
feng

对于 C++:

由于没有针对 C++ 测试的特殊问题,但主题非常相似,所以当我遇到测试发现问题时,这对我有帮助。

如果您只安装了使用 C++ 的桌面开发,那么解决方案是使用可选的 C++ 通用 Windows 平台工具安装通用 Windows 平台开发。您可以在 Visual Studio Web 安装程序中选择这些。

之后,重建您的测试项目,测试发现应该可以工作。

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


T
Tanya Fomenko

删除旧的 .dll 应该会有所帮助。清除位于 C:\Users(yourusername)\AppData\Local\Temp 的 %TEMP% 目录中的临时文件


F
FLICKER

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

最后,我将 Microsoft.VisualStudio.TestPlatform.TestFrameworkMicrosoft.VisualStudio.TestPlatform.TestFramework.Extensions 包降级为非常旧的版本(使用 NuGet 管理器)并出现了测试方法。然后我升级到最新版本,仍然存在。

所以只需降级和升级软件包。


v
vlatko606

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


R
Rohan

有时更改测试的命名空间会起作用。我的文件夹结构如下:

A |___B | |___D |___C___E

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

不要忘记构建您的项目!


U
U.Savas

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

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

我删除了它们并添加了对:

Microsoft.VisualStudio.QualityTools.UnitTestFramework

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

我之前尝试了几乎所有其他建议,但只需重新引用测试 DLL 就可以了。我为我的情况下的人发布了这个答案。


P
Pang

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

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


P
Pang

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

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

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

工作。


O
Oguzhan Kircali

起初,我尝试使用 MSTest。之后,我将其更改为 Nunit 测试。然后我想支持 MSTest。我删除了所有 nUnit 代码和引用,但测试资源管理器没有显示 MSTest 方法。解决方案:我删除了所有 mstest nuget 引用并重新安装。完毕。


I
Ike

有时,我发现如果您的单元测试代码中存在 stackoverflow 异常,Visual Studio 会将该单元测试用例标记为未运行,并且将停止运行该用例之后的其他测试用例。

在这种情况下,您必须找出导致stackoverflow异常的情况。