【问题标题】:Unit Tests not discovered in Visual Studio 2017在 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 文件:stackoverflow.com/a/47497668/67824

标签: unit-testing visual-studio-2017


【解决方案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 似乎对我有用.. 谢谢 StackOverflow。 (.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;

        要解决问题,

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

        【讨论】:

        • 遇到了同样的问题。删除和重建解决方案不起作用。重启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 templateNUnit 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】:

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

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

                              【讨论】:

                                【解决方案29】:

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

                                A |___B | |___D |___C___E

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

                                不要忘记构建您的项目!

                                【讨论】:

                                  【解决方案30】:

                                  检查 NUnit 3 测试适配器是否启用。就我而言,我很久以前就已经安装了它,但突然它以某种方式被禁用了。我花了很长时间才决定检查那部分......

                                  【讨论】:

                                    猜你喜欢
                                    • 2015-06-16
                                    • 1970-01-01
                                    • 2014-10-07
                                    • 2017-10-30
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 2017-08-13
                                    • 2018-08-18
                                    • 1970-01-01
                                    相关资源
                                    最近更新 更多