自从我安装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 重新启动和 关闭/打开测试资源管理器 为xUnit安装Microsoft.DotNet.InternalAbstractions(见SO post) 对于NUnit,确保适配器安装和NUnit包相同的版本(3) Test -> Test Settings ->默认处理器架构设置为x86

这个问题 谁能提供一个VS2017中。net Core 1.1.0解决方案的工作示例?csproj项目文件),其中VS测试资源管理器成功找到单元测试或在给出的例子中显示问题。


不要阅读MSDN. net下的过期文章,核心相关资料在learn.microsoft.com下

https://learn.microsoft.com/en-us/dotnet/articles/core/testing/

一般来说,你需要一个。net Core控制台应用程序来包含单元测试用例。


在我的案例中,是解决方案中的UWP项目导致了这个问题。

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

尝试卸载所有项目,只保留测试项目。十个重建方案和测试应该出现在测试运行器。逐个加载项目,并每次重新构建解决方案,以找出导致问题的项目

样本回购

VS bug报告


这个问题

问题是Visual Studio对机器上的dotnet核心版本感到“困惑”。当我进入控制面板->卸载程序时,我已经安装了8个不同的dotnet核心SDK和运行时。这在某种程度上导致VS在试图查找测试时无声地出现错误。

验证问题

您可以通过转到命令行并在$ dotnet——version上获取dotnet的版本来验证这个问题。如果你看到除了你安装的最新版本以外的任何东西,那么你的机器有一些不匹配,没有使用正确的版本。例子……如果你已经安装了dotnet核心1.0.1,但当你在命令提示符下看到版本时,它显示为1.0.0,这是一个问题。

解决方案

删除所有旧的东西。我开始只是我认为我需要删除(最古老的dotnet rc版本),但它仍然给出错误的版本时,测试的问题。最后,我承认要做一次彻底的清理。我…

卸载所有visual studio应用程序(在我的机器VS2015和VS2017上) 卸载所有版本的dotnet core(包括最新的)

在我的机器完全空了所有的VS和donet之后,我只安装了VS2017(它附带了最新的dotnet)。我创建了一个xUnit测试项目,测试资源管理器发现测试立即被解决了

这似乎有点过分,但我花了两周时间试图用其他方法解决这个问题。如果你有这个问题,尽管它可能需要你几个小时来卸载/重新安装,但它可能会节省你的时间。

参考文献

请参阅@epestic博客文章,在那里他提供了更多关于修复问题的细节。


请确保您正在使用正确的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>

但我认为没有必要。


我也遇到了同样的问题,并通过以下方法让它工作:

首先,关闭所有打开的VisualStudio实例并删除此文件夹:%TEMP%\VisualStudioTestExplorerExtensions(使用VisualStudio运行测试) 转到您的NuGet包管理器并首先安装Microsoft.NET.Test.Sdk (15.3.0-preview-20170425-07),然后安装xunit.runner.visualstudio (2.3.0- beta2 -build1309)。请参阅附带的NuGet截图,以查看我必须安装的所有包,以获得最新的VS 2017来检测我的测试。


. net Core测试适配器的API随着Visual Studio 2017的发布和项目的转移而改变。Json格式转换为csproj格式。这使得现有的dotnet-test-*适配器如dotnet-test-nunit过时了。

适配器已经更新,但是在Visual Studio中或在命令行上使用dotnet测试设置和运行测试的方式需要在测试项目中使用不同的引用。当心你发现的任何以dotnet-test-*格式引用包的文档,因为它们已经过时了。

首先,您的测试项目必须针对一个特定的平台,无论是。net Core还是。net Framework。它不能针对。net标准,即使你测试的代码是。net标准。这是因为测试的目标指示了在哪个平台下运行测试。. 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中似乎有bug没有检测到项目的更改。

有关更多信息,请参见在Visual Studio 2017中用NUnit测试. net Core。


在我的例子中,结果证明我只需要升级我的测试适配器和测试框架。完成了。

使用NuGet包管理器的示例:


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


对我来说,创建一个在Visual Studio 2017中完美运行的新测试项目更容易……只需要复制测试文件,添加引用,并根据需要添加NuGet包。


我什么都试过了,但都没用。以我为例,我有几个测试项目的解决方案,其中一些使用了旧的ms-test框架,所以Visual Studio只找到了那些。

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


首先,我尝试使用MSTest。之后,我把它改为Nunit测试。然后我想支持MSTest。我删除了所有的nUnit代码和引用,但是测试资源管理器没有显示MSTest方法。解决方案:我删除了所有mstest nuget引用并重新安装。完成了。


在我的案例中,当我将项目转移到新的解决方案后,测试资源管理器无法找到我的测试。

答案很简单,我在我的项目中引用了旧的MS测试适配器。

我在我的电脑中有一个MS测试适配器版本1.1.11的副本。项目文件:

<进口项目= " \ packages MSTest TestAdapter。1.1。18 \构建net45 \ MSTest TestAdapter。道具“雾=“Exists (TestAdapter \ packages MSTest。1。1 . 18构建\ net45 \ MSTest TestAdapter道具)”。/>

为了解决这个问题,

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


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

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

to

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

工作。


这对我来说很有效(不知道这是否是改变工作空间导致的损坏):

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


我也有同样的问题。我的解决方案还可以,但当我突然打开解决方案时,我发现测试不见了。

最后,我把Microsoft.VisualStudio.TestPlatform.TestFramework和Microsoft.VisualStudio.TestPlatform.TestFramework. extensions包降级为一个非常旧的版本(使用NuGet管理器),测试方法出现了。然后我升级到最新版本,仍然有那里。

所以只要降级和升级包就可以了。


在我的例子中,我将测试项目目标为x64体系结构,而测试设置体系结构(test >默认处理器体系结构)更改为x86。它们不匹配。

在将测试设置体系结构设置回x64并重新构建之后,所有测试都再次被发现。


忘记将测试类设为公共,可以防止其中的测试方法被发现。

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

长话短说,更新xUnit后,测试。Sdk, xUnit.runner包和重建项目,我遇到了一个构建错误:

测试类必须是公共的

值得庆幸的是,更新后的版本抛出了这个异常,为我省去了一些麻烦。

修改测试类为公共修复了我的问题。


在我的例子中,这是一个我从早期的. net版本升级测试项目的项目。在app.config中,我有到以前版本的依赖程序集的程序集绑定。

在app.config中修复程序集绑定后,我的测试被发现了。


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


发现

上面的答案对我不起作用(重新启动,更新到版本1.1.18…我已经更新,删除临时文件,清除NuGet缓存等)。

我发现我对MSTest有不同的引用。TestAdapter和MSTest。框架在不同的测试项目(我的解决方案有两个)。一个指向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。上面的一些答案导致了这个发现,当重新启动VisualStudio后,在我的临时目录(% temp %\VisualStudioTestExplorerExtensions\)中出现了两个版本的库。

解决方案

只是更新我的包。配置到1.1.18版本是恢复我的单元测试功能在VS.。似乎有一些错误,不允许并排引用MSTest库。希望这对你有所帮助。

更多信息:

Visual Studio 2017 Ent: 15.5.6(我已经从15.0.1更新,希望修复这个问题,但我在两个版本都有)


美国小妞C + +:

由于c++测试没有特别的问题,但主题是非常相同的,下面是当我在测试发现方面遇到麻烦时帮助我的方法。

如果您只安装了带有c++的桌面开发,那么解决方案是同时安装带有可选的c++通用Windows平台工具的通用Windows平台开发。您可以在visual studio web安装程序中选择这些。

之后,重新构建您的测试项目,测试发现就可以工作了。

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


删除旧的.dll应该会有所帮助。清除C:\Users(你的用户名)\AppData\Local\ temp目录下% temp %中的临时文件


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

该文件在bindingredirects中引用了一些在项目引用中没有实际出现的dll。重新添加项目严格需要的程序集绑定。


就我的情况而言,以上这些对我都没有帮助。 但是,我把NUNit3TestAdapter降级到3.8.0版本,然后升级到最新版(3.10.0)。


只是有这个问题,visual studio无法找到我的测试,除了方法之外,无法看到运行它们的按钮,并且它们没有在项目中运行所有测试。

结果我的测试类不是公共的!公开它可以让VS发现测试。


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

[TestClass]
internal class TestLib {
}

这导致测试用例没有被识别。


在我的案例中,问题是项目类型被设置为静态库(lib),而它应该是动态库(dll)。


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

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


有时更改测试的名称空间可以工作。我的文件夹结构如下:

一个 | ___B | | ___D | ___C___E

名称空间像Tests一样是扁平的。< name >并且它们没有显示在测试窗口中。当我将名称空间更改为目录的结构时,所有测试都显示出来了。现在我可以恢复到任何我想要的名称空间结构。

不要忘记构建您的项目!


检查NUnit 3测试适配器是否已启用。在我的情况下,我已经安装了很久以前,但突然它被禁用了。我花了好长时间才决定检查这部分……


我删除了项目的BIN和OBJ文件夹。一旦我这样做了,一切都正常工作了。


在.NET框架的情况下,在测试项目中以前有对以下dll的引用:

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

我删除了它们,并添加了参考:

Microsoft.VisualStudio.QualityTools.UnitTestFramework

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

我尝试了上面几乎所有的其他建议,但是简单地重新引用测试dll就可以了。 我把这个答案发给那些和我一样的人。


我也面临着同样的问题,在我的情况下才能解决

我打开windows控制台(windows键+ cmd)。 导航到创建项目的文件夹。 执行命令“dotnet test”,它基本上与visual studio执行的测试相同,但当你通过控制台运行它时,它可以让你看到完整的跟踪。 我得到了这个错误信息"TestClass属性定义在非公共类mstest。testcontroller。basetest " 所以我去到测试用例并将其标记为公共,重新构建,我的测试被正确显示


从Visual Studio 2017迁移到2019时,我也遇到了同样的问题。我不得不在我所有的测试项目中重新安装Microsoft.NET.Test.Sdk。


对我来说,我需要运行这个,它更新了单元测试项目的所有nunit适配器链接:

Install-Package Nunit3TestAdapter

我不得不禁用(旧的)运行设置文件。


在我的例子中,我的一个测试类不是公共的。这使得整个套件无法运行。

但这是我是如何计算出来的==>似乎“输出”控制台将向您显示测试日志。您只需要从构建切换到测试。

这简单得令人尴尬。我希望我的尴尬能帮助到其他人。


在我的例子中,测试资源管理器将排除公共异步无效(c#)或公共异步Sub X() (VB.NET)的测试方法。

更仔细地查看输出窗口中的消息,显示来自:测试的输出,我看到了以下消息:

如果你在测试方法中使用async-await,那么return-type必须是Task。示例:public async Task Test.Class1.Test2()

对于每个消息,确保所有此类方法都返回Task。


记住用<TestClass>或[TestClass]来装饰你的类,而不仅仅是你的方法。


确保你的测试类和方法不是静态的。