无法找到 testhost.dll。请发布您的测试项目并重试

Unable to find testhost.dll. Please publish your test project and retry

我有一个简单的 dotnet 核心 class 库,只有一个 XUnit 测试方法:

TestLib.csproj:
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.NET.Test.SDK" Version="15.9.0" />
    <PackageReference Include="xunit" Version="2.4.1" />
    <PackageReference Include="xunit.runner.console" Version="2.4.1">
      <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
      <PrivateAssets>all</PrivateAssets>
    </PackageReference>
    <PackageReference Include="xunit.runner.visualstudio" Version="2.4.1">
      <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
      <PrivateAssets>all</PrivateAssets>
    </PackageReference>
    <PackageReference Include="xunit.runners" Version="2.0.0" />
  </ItemGroup>

</Project>

BasicTest.cs:
using Xunit;

namespace TestLib
{
    public class BasicTest
    {
        [Fact(DisplayName = "Basic unit test")]
        [Trait("Category", "unit")]
        public void TestStringHelper()
        {
            var sut = "sut";
            var verify = "sut";

            Assert.Equal(sut, verify);
        }
    }
}

如果我在 CLI 上输入项目并键入 dotnet build,项目就会生成。如果我输入 dotnet test 我会得到这个:

C:\git\Testing\TestLib> dotnet test
C:\git\Testing\TestLib\TestLib.csproj : warning NU1701: Package 'xunit.runner.visualstudio 2.4.1' was restored using '.NETFramework,Version=v4.6.1' instead of the project target framework '.NETStandard,Version=v2.0'. This package may not be fully compatible with your project.
Build started, please wait...
C:\git\Testing\TestLib\TestLib.csproj : warning NU1701: Package 'xunit.runner.visualstudio 2.4.1' was restored using '.NETFramework,Version=v4.6.1' instead of the project target framework '.NETStandard,Version=v2.0'. This package may not be fully compatible with your project.
Build completed.

Test run for C:\git\Testing\TestLib\bin\Debug\netstandard2.0\TestLib.dll(.NETStandard,Version=v2.0)
Microsoft (R) Test Execution Command Line Tool Version 16.0.0-preview-20181205-02
Copyright (c) Microsoft Corporation.  All rights reserved.

Starting test execution, please wait...
Unable to find C:\git\Testing\TestLib\bin\Debug\netstandard2.0\testhost.dll. Please publish your test project and retry.

Test Run Aborted.

我需要更改什么才能使测试达到 运行?

如果有帮助,VS Code 也不会在其测试资源管理器中显示测试。

我创建了一个 class 库并尝试在其中使用 XUnit NuGet 包。

我应该做的是使用以下命令创建一个 XUnit 项目:dotnet new xunit -n TestProject

我找到了 this helpful page

从 nuget 包管理器安装 Microsoft.NET.Test.Sdk 包解决了我的问题。

通过安装 xunit.runner.visualstudio 修复了它。

在我的例子中,问题是我有一个 xunit 的扩展项目。还有一个测试项目来测试扩展。当我 运行 dotnet test 在我的解决方案上时,我的扩展项目也被选为单元测试项目(我花了一些时间才意识到这一点)。这样做的原因是它引用了一些 xunit 包。这些 xunit 包之一会自动在您的 csprj 文件中设置 <IsTestProject>true</IsTestProject> 属性。这实际上是一件好事,因为 99.99% 的引用 xunit 的项目实际上都是单元测试。我终于可以通过显式设置

来解决这个问题
     <PropertyGroup>
...
        <IsTestProject>false</IsTestProject>
...
      </PropertyGroup>

手动在我的 csproj 文件中。然后问题就解决了。

运行 进入此错误,根本原因是测试达到了 Windows 路径 (MAX_PATH) 的最大长度,定义为 260 个字符。

在使用 <TargetFramework>netcoreapp2.0</TargetFramework> 将 Microsoft.NET.Test.Sdk 从 v16.2.0 更新到 v16.4.0 后,这发生在我身上。更新到 <TargetFramework>netcoreapp3.0</TargetFramework> 解决了我的问题。

在我的例子中,问题是我以 .NET Core 2.0 为目标并切换到 .NET Core 2.1 解决了这个问题。但是我使用的是 Microsoft.NET.Test.SDK v16.4.0 而不是 15.9.0.

如果您使用的是 xUnit,请确保您的项目类型不是 netstanderd。 As xUnit doesn't support netstanderd,改成coreapp2.0或其他

我正在构建一个 netcoreapp2.2 测试项目,然后尝试从 bin 文件夹中 运行 dotnet vstest。我注意到 Microsoft 测试 DLL 来自:

<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.0.1" />

没有输出到我的 bin 文件夹。我不只是构建,而是 运行 发布,它确实在输出文件夹中包含必要的 DLL,然后我可以从那里 运行 dotnet vstest

如果您的目标是 netstandard2.0,这将不起作用。如果正在使用 .NET Core。确保 .csproj 包含以下行:

<TargetFramework>netcoreapp3.0</TargetFramework>

并且还包含包 Microsoft.NET.Test.Sdk

我在 Nunit (.net core 3.1) 项目中遇到了同样的问题。 我使用的是 Microsoft.NET.Test.SDK v16.6.1,我将版本降级到 15.9.0。 它开始工作

我发现了一个非常有趣的版本兼容性问题。我确实按照正常做法升级了我的代码,然后切换到 xUnit.runner.visualstudio 2.4.2。它停止为 .Net Core 3.1 工作。我不得不降级到 2.4.1,它又开始工作了。

我的评论之一后的附加信息。

软件包 xunit.runner.visualstudio 版本 <= 2.4.1 包含对 Microsoft.NET.Test.Sdk 的引用。以后的版本没有,所以你需要添加对你项目的引用。

如果您是 运行 通过克隆的项目,解决方案是安装 Microsoft.NET.Test.Sdk。 如何 : 工具>Nuget 包管理器>管理解决方案的 Nuget 包...>搜索 Microsoft.NET.Test.Sdk 并为您的测试项目安装。

我遇到过几次这种情况,但我总是忘记发生了什么。最近我有:

  • Class 库 -> 面向 .NET Core 3.0
  • 测试项目 -> 面向 .NET Core 3.1

我的测试项目的包:

  • 起订量 -> 4.14.1
  • xUnit -> 2.4.1
  • xUnit.Runner.VisualStudio -> 2.4.2

我看到了:

Unable to find C:\PATH\bin\Debug\netstandard2.0\testhost.dll. Please publish your test project and retry.

我需要做的就是将缺少的 nuget 包添加到我的测试项目中: "Microsoft.NET.Test.SDK"

此时一切恢复正常。

这也可能是由于无意中尝试 运行 非测试项目造成的,这通常发生在您的测试文件过滤器太宽时。

尝试调试单元测试时出现此错误。以下是我尝试过的步骤。

  • 第 1 步:安装 Microsof.TestPlatform.TestHost 并尝试 运行 测试但没有成功。
  • 第 2 步:将 Target 框架从 .NET Core 2.0 更改为 2.1 并尝试 运行 测试但没有成功。
  • 第 3 步:关闭并打开 VS2017 并尝试 运行。

耶!!!有效 :-) 不要错过尝试最后一步 ;-) 希望这对像我这样的人有帮助。

如果将 xunit.runner.visualstudio 升级到高于 2.4.1 的版本,可能会发生此错误。 2.4.1 及之前的版本包含对 Microsoft.NET.Test.Sdk 的引用,但更高版本不包含,因此您需要在自己的项目中包含该引用。

有趣的是,我发现 NC运行ch 仍然 运行 我的测试没有额外的参考,即使我不能通过 CLI 运行 它们。

必须添加 Microsoft.TestPlatform.TestHost 才能得到 testhost.dll。 我发现在这个答案中 https://github.com/dotnet/sdk/issues/7171#issuecomment-261506546

在我的例子中,有必要使用 nuget 包含对 MsTest.TestAdapter 模块的引用。

MSTest.TestFramework 和 Microsoft.Net.Test.Sdk 的新项目不足以 运行 单个单元测试。

请注意,在我的案例中,我使用的是针对 .NET Framework 4.8 而不是 .NET Core 的测试项目。虽然,我坚信此修复程序也可能适用于该平台

我发现 5 个因素 至关重要。
(其中 3 人以混合形式分布在此处的其他答案中。)

1 到 4:
在适用于您的 .NET Core 版本的版本中添加这些 Nuget 包:

  • xunit
  • Microsoft.NET.Test.Sdk
  • xunit.runner.visualstudio
  • Microsoft.AspNetCore.Mvc.Testing

5:
现在确保 Microsoft.NET.Test.Sdk 设置为 NOT ExcludeAssets。为此,请使用以下方法之一:

  1. 在 Project Explorer 中转到 Dependencies –> NuGet 并找到 Sdk 包。右键单击它和 select“属性”。从字段 ExcludeAssets 中删除“All”。
  2. 或者编辑您的 .csproj 文件并从 Sdk 包条目中删除 ExcludeAssets="All",如果存在:
<!-- Bad: -->
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.11.0" ExcludeAssets="All" />
<!-- Good: -->
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.11.0" />

就我而言,这是一个愚蠢的错误。我也在我的源项目中引用了 xunit(不仅在我的测试项目中)

删除我的源项目中的 xunit 依赖关系解决了这个问题。

我使用的是 .NET Core Framework 6.0 我必须将 Microsoft.NET.Test.Sdk 从版本 17.1.0 降级到 16.5.0 才能解决问题。