Não foi possível encontrar testhost.dll. Publique seu projeto de teste e tente novamente

113

Eu tenho uma biblioteca de classes simples dotnet com um único método de teste 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);
        }
    }
}

Se eu entrar no projeto na CLI e digitar dotnet buildas compilações do projeto. Se eu digitar dotnet test, recebo o seguinte:

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.

O que preciso mudar para que o teste seja executado?

Se ajudar, o VS Code também não está exibindo os testes em seu explorador de teste.

Matt W
fonte
No meu caso, você não pode realmente executar testes em netstandard2.0, já que é uma definição de API, não um runtime. Se você mudar o TFM para net472, as coisas funcionam bem. Alternativamente, você pode multi-alvo para netcore + net472 por exemplo e executar em ambos.
kzu de

Respostas:

25

No meu caso, o problema era que eu estava visando o .NET Core 2.0 e mudar para o .NET Core 2.1 resolveu o problema. No entanto, eu estava usando o Microsoft.NET.Test.SDK v16.4.0 em vez do 15.9.0.

Andreas
fonte
178

Instalando Microsoft.NET.Test.Sdk pacote do gerenciador de pacotes nuget resolveu meu problema.

R15
fonte
Isso já foi incluído no meu post - mas você está certo: haverá grandes problemas na execução de testes de unidade com dotnet core sem ele.
Matt W
2
"Microsoft.NET.Test.Sdk" era a peça que faltava quando você adiciona um projeto de biblioteca de classes e o transforma em um projeto de teste. Provavelmente, a melhor coisa a fazer seria adicionar um novo projeto de teste e depois adicionar os pacotes nuget necessários como Rhino ou Moq, etc ...
Yawar Murtaza
3
Criado .NET Standard 2.0 lib, adicionado xunit, xunit.runner.visualstudioe Microsoft.NET.Test.Sdkao projeto, ainda o mesmo resultado. Acho que ainda há outro fator em jogo ...
Manfred
12
O problema no meu caso foi causado pela criação de um netstandard2.0projeto em vez de um netcoreapp2.2projeto. Assim que mudei para o último, funcionou. Os únicos pacotes nuget que eu precisava eram xunit, xunit.runner.visualstudioe Microsoft.NET.Test.Sdk.
Manfred
1
A instalação de Microsoft.NET.Test.Sdk também não funcionou para mim, ATÉ que eu dotnet clean
IGx89
26

Eu criei uma biblioteca de classes e tentei usar o pacote XUnit NuGet nela.

O que eu deveria ter feito era criar um projeto XUnit usando este comando: dotnet new xunit -n TestProject

Eu achei esta página útil .

Matt W
fonte
3
Depois de executar este comando, você pode atualizar os pacotes nuget aos quais o novo projeto faz referência.
Manfred
Ou instale nuget xunit.runner.visualstudion no projeto existente;)
Lukáš Kmoch
Isso é um erro de digitação? Eu não consigo encontrar esse.
Matt W
Se você tiver um projeto existente, pode passar o nome dele com --forcepara forçá-lo a reconstruir o projeto como um projeto de teste xUnit. De acordo com o comentário de @Manfred, você precisará atualizar / adicionar novamente quaisquer referências de projeto que você tinha nesse projeto.
Myles
1
@MattW Sim, parece um erro de digitação. Acho que @Lukas quis dizer xunit.runner.visualstudioque você pode encontrar em nuget.org/packages/xunit.runner.visualstudio
Manfred
14

No meu caso, o problema é que tenho um projeto de extensão para o xunit. Também existe um projeto de teste para testar as extensões. Quando executei dotnet testminha solução, meu projeto de extensão também foi escolhido como um projeto de teste de unidade (levei algum tempo para perceber isso). A razão para isso é que ele faz referência a alguns pacotes xunit. Um desses pacotes xunit define automaticamente a <IsTestProject>true</IsTestProject>propriedade em seu arquivo csprj. Na verdade, isso é bom, pois 99,99% dos projetos que fazem referência ao xunit são, na verdade, testes de unidade. Eu poderia finalmente resolver isso definindo explicitamente

     <PropertyGroup>
...
        <IsTestProject>false</IsTestProject>
...
      </PropertyGroup>

Manualmente no meu arquivo csproj. Então o problema foi embora.

Willy Van den Driessche
fonte
12

Isso aconteceu comigo depois de atualizar o Microsoft.NET.Test.Sdk de v16.2.0 para v16.4.0 com <TargetFramework>netcoreapp2.0</TargetFramework>. Atualizar para <TargetFramework>netcoreapp3.0</TargetFramework>resolver o problema para mim.

SteveHansen
fonte
10

Corrigido com a instalação xunit.runner.visualstudio.

Eugene Ihnatsyeu
fonte
10

Se você estiver usando o xUnit, certifique-se de que seu tipo de projeto não seja tão netstanderd. Como o xUnit não oferece suporte ao netstanderd , altere-o para coreapp2.0 ou outros.

Raj kumar
fonte
Esse era o meu problema em particular. Doh! Eu deveria ter percebido isso antes. Obrigado pela sua resposta, pois me colocou no caminho certo :)
Dev Leader
Alterar o projeto de teste para um aplicativo .Net Core permitiu que o pacote xunit.runner.visualstudio fosse instalado corretamente. Observe que você provavelmente precisará fechar sua solução e recarregá-la para que o VisualStudio resolva as alterações.
Sheldon
9

Já encontrei isso algumas vezes e sempre esqueço o que está acontecendo. Mais recentemente, tive:

  • Biblioteca de classes -> direcionado ao .NET Core 3.0
  • Projeto de Teste -> Direcionado ao .NET Core 3.1

Pacotes para meu projeto de teste:

  • Moq -> 4.14.1
  • xUnit -> 2.4.1
  • xUnit.Runner.VisualStudio -> 2.4.2

Eu estava vendo:

Não foi possível localizar C: \ PATH \ bin \ Debug \ netstandard2.0 \ testhost.dll. Publique seu projeto de teste e tente novamente.

E tudo que eu precisava fazer era adicionar ao meu projeto de teste o pacote nuget ausente: "Microsoft.NET.Test.SDK"

Tudo estava de volta ao normal neste momento.

Dev Leader
fonte
8

Achei um problema de compatibilidade muito interessante com uma versão. Atualizei meu código como prática normal e mudei para xUnit.runner.visualstudio 2.4.2. Ele parou de funcionar para .Net Core 3.1. Tive que fazer o downgrade para 2.4.1 e começou a funcionar novamente.

Informações adicionais após um dos meus comentários.

O pacote xunit.runner.visualstudio versões <= 2.4.1 inclui uma referência a Microsoft.NET.Test.Sdk. As versões posteriores não, então você precisa adicionar a referência ao seu projeto.

Consulte stackoverflow.com/a/63786758/3248302

Maximiliano Rios
fonte
1
Eu tive o mesmo problema - para alguns dos projetos de teste em minha solução. O fator comum para a falha dos projetos de teste após a atualização para 2.4.2 era que esses projetos não tinham o Microsoft.Net.Test.Sdk (nunca foi um problema antes). Adicionou o nuget 16.6.1 e voltou a funcionar.
bit0001
Legal, eu não sabia disso. Fiz downgrade para fazer funcionar
Maximiliano Rios
1
Eu consertei da mesma maneira. O downgrade do pacote xUnit.runner.visualstudio para 2.4.1 resolveu o problema.
Jacek Labuda
1
Posso confirmar que ainda é um problema com a versão 2.4.3 de xunit.runner.visualstudio. O downgrade para 2.4.1 resolve o problema.
bN_
1
xunit.runner.visualstudioas versões <= 2.4.1 incluem uma referência a Microsoft.NET.Test.Sdk. As versões posteriores não, então você precisa adicionar a referência ao seu projeto. Consulte stackoverflow.com/a/63786758/3248302 .
Blisco
5

Eu estava construindo um projeto de teste netcoreapp2.2 e, em seguida, tentando executar a dotnet vstestpartir da pasta bin. Percebi que as DLLs de teste da Microsoft de:

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

não estavam sendo enviados para minha pasta bin. Em vez de apenas construir, executei uma publicação que incluía as DLLs necessárias na pasta de saída e, então, consegui executar a dotnet vstestpartir daí.

Michael Armitage
fonte
3

Se você tiver como objetivo o netstandard2.0, isso não funcionará. Se estiver usando o .NET Core. certifique-se de que o .csproj contém as seguintes linhas:

<TargetFramework>netcoreapp3.0</TargetFramework>

e também contém o pacote Microsoft.NET.Test.Sdk

Hakakou
fonte
2

mesmo problema que enfrentei para o projeto Nunit (.net core 3.1). Eu estava usando o Microsoft.NET.Test.SDK v16.6.1, fiz o downgrade da versão para 15.9.0. E começou a funcionar

SaifAli Sanadi
fonte
1

Encontrou esse erro, a causa raiz foi que os testes estavam atingindo o comprimento máximo para um caminho do Windows (MAX_PATH), que é definido como 260 caracteres.

S1r-Lanzelot
fonte
1

Este erro pode ocorrer se você atualizar xunit.runner.visualstudiopara uma versão superior a 2.4.1. Versões até e incluindo 2.4.1 incluem uma referência aMicrosoft.NET.Test.Sdk mas as posteriores não, então você precisa incluir a referência em seu próprio projeto.

Curiosamente, descobri que o NCrunch ainda executou meus testes sem a referência adicional, embora eu não pudesse executá-los por meio da CLI.

Blisco
fonte
0

Se você estiver executando um projeto por clonagem, a solução é instalar o Microsoft.NET.Test.Sdk. Como: Ferramentas> Gerenciador de Pacotes Nuget> Gerenciar Pacotes Nuget para Solução ...> Pesquise Microsoft.NET.Test.Sdk e instale para seu projeto de teste.

Shawon Barua
fonte
0

Isso também pode ser causado por uma tentativa inadvertida de executar um projeto que não seja de teste. Isso geralmente acontece quando o filtro de arquivos de teste é muito largo.

Reim
fonte
0

Recebi este erro, ao tentar depurar um teste de unidade. Abaixo estão as etapas que tentei.

  • Etapa 1: Instale o Microsof.TestPlatform.TestHost e tente executar o teste, mas sem sucesso.
  • Etapa 2: Estrutura de destino alterada de .NET Core 2.0 para 2.1 e tente executar o teste, mas sem sorte.
  • Etapa 3: Fechou e abriu o VS2017 e tentou executar.

Yay!!! funcionou :-) Nunca deixe de tentar a última etapa ;-) Espero que isso ajude alguém como eu.

Venu
fonte
0

Tive que adicionar Microsoft.TestPlatform.TestHostpara conseguir testhost.dll. Descobri que nesta resposta https://github.com/dotnet/sdk/issues/7171#issuecomment-261506546

Äkwav
fonte
É bom que você esteja dando crédito a outras pessoas, mas aqui no stackoverflow, preferimos que você também inclua informações suficientes aqui. Apenas no caso de o link da web que você forneceu se tornar quebrado / inválido algum dia.
tgolisch
Ok, eu revi o link, não há informações para adicionar à minha resposta. Devo removê-lo melhor então?
Äkwav
1
Na verdade, sua resposta parece útil. Não estou sugerindo que você o exclua. Os padrões da comunidade recomendam que sua resposta contenha as informações em vez de um link (parafrasear, mas não plagiar), para que as informações estejam em S / O, sem a necessidade de clicar.
tgolisch
0

No meu caso, foi necessário incluir uma referência ao módulo MsTest.TestAdapter usando o nuget.

Um novo projeto com MSTest.TestFramework e Microsoft.Net.Test.Sdk não foi suficiente para executar um único teste de unidade.

Percebi, no meu caso, que estava usando um projeto de teste visando o .NET framework 4.8 e não o .NET core. Embora eu acredite fortemente que essa correção pode se aplicar a essa plataforma também

Aislan Gelatti Rocha
fonte