Configuração do SDK MSTest

Este artigo aborda opções avançadas de configuração para MSTest.Sdk. Para configuração básica e introdução, veja Introdução ao MSTest.

Importante

Por defeito, o MSTest.Sdk usa o runner MSTest com MTP, incluindo dotnet test. Isto requer modificar o seu CI e as chamadas CLI locais, e também afeta as entradas disponíveis nos ficheiros .runsettings. Podes manter as integrações e ferramentas antigas mudando para VSTest.

MSTest.Sdk define EnableMSTestRunner e TestingPlatformDotnetTestSupport para true por defeito. Para mais informações sobre o teste dotnet e os seus diferentes modos, veja Testing with dotnet test.

Bibliotecas auxiliares do utilitário de teste

Se o project que usa o MSTest.Sdk for concebido para ser uma biblioteca auxiliar de utilidade de teste, e por si só não contém testes executáveis, o project deve ter <IsTestApplication>false</IsTestApplication>.

Selecione o corredor

Por defeito, o MSTest SDK depende do MTP, mas podes mudar para VSTest adicionando a propriedade <UseVSTest>true</UseVSTest>.

Testar modelos de aplicações Windows

A partir do MSTest.Sdk 4.5, o runner MTP padrão suporta os seguintes modelos de aplicações Windows:

  • Projetos clássicos UWP que têm como alvo uap10.0.
  • Projetos UWP modernos que utilizam .NET 10 e definem UseUwp como true.
  • Projetos WinUI 3 empacotados e de confiança total.
  • Projetos WinUI 3 não empacotados.
  • Projetos do WinUI 3 packagedClassicApp que definem TrustLevel="appContainer".

O MSTest.Sdk fornece componentes MTP 2.5 compatíveis e inicia um sidecar de modelo de aplicação de confiança total para hosts de teste empacotados e AppContainer. O sidecar regista o pacote, ativa a aplicação selecionada pelo AUMID, autoriza o SID exato do pacote para comunicação AppContainer e recupera artefactos resultantes do armazenamento do pacote.

Os projetos UWP continuam a exigir o workload do UWP do Visual Studio e o MSBuild para ambiente de trabalho para suporte durante a compilação. Eles não exigem Microsoft.NET.Test.Sdk, vstest.console, nem o fornecedor de runtime de teste Visual Studio UWP.

Para configuração de projetos, comandos de execução e exemplos, consulte Testar aplicações UWP e WinUI 3 com MSTest e MTP.

A partir da pré-visualização do MSTest.Sdk 4.5, defina EnableWindowsUIAutomation como true para adicionar o pacote MSTest.Windows.UIAutomation correspondente a um projeto direcionado ao Windows. Esta funcionalidade lança e automatiza uma aplicação externa não empacotada no Win32, Windows Forms ou WPF, em vez de alojar testes dentro de uma aplicação UWP ou WinUI. Para mais detalhes, consulte Testar aplicações de ambiente de trabalho Windows com MSTest Automatização da Interface de Utilizador.

Estender o MTP

Pode personalizar a experiência MTP através de um conjunto de extensões de pacotes NuGet. Para simplificar e melhorar essa experiência, o MSTest SDK apresenta dois recursos:

A partir do MSTest 4.4, o adaptador MSTest utiliza a sua integração nativa MTP e já não depende de Microsoft.Testing.Extensions.VSTestBridge. Fazer referência explícita à ponte apenas quando a aplicação de teste MTP tiver de executar uma estrutura através do adaptador VSTest respetivo.

Perfil Microsoft.Testing.Platform

O conceito de c0 permite-lhe selecionar o conjunto padrão de configurações e extensões que serão aplicadas ao seu project de teste.

Você pode definir o perfil usando a propriedade TestingExtensionsProfile com um dos três perfis a seguir:

  • None - Nenhuma extensão está ativada.

  • Default - Habilita as extensões recomendadas para esta versão do MSTest.SDK. Este é o padrão quando a propriedade não é definida explicitamente.

    Permite as seguintes extensões:

  • AllMicrosoft - Permite as extensões da Microsoft selecionadas para uma utilização alargada e imediata, incluindo extensões com uma licença restritiva. As extensões experimentais e exclusivas da API podem ainda exigir adesão explícita.

    Permite todas as extensões do Default perfil, mais as seguintes extensões:

    No MSTest.Sdk versões 3.11.0 a 4.2.x, a extensão Azure DevOps Report está incluída apenas em AllMicrosoft.

Nota

Os perfis referenciam os pacotes Azure DevOps Report e GitHub Actions Report, mas os relatórios permanecem desativados em tempo de execução. Passe --report-azdo para ativar os relatórios do Azure DevOps. Para ativar o GitHub Actions Reporting, execute os testes no GitHub Actions e passe --report-gh.

Aqui está um exemplo completo, usando o perfil None.

<Project Sdk="MSTest.Sdk/4.1.0">

    <PropertyGroup>
        <TargetFramework>net10.0</TargetFramework>
        <TestingExtensionsProfile>None</TestingExtensionsProfile>
    </PropertyGroup>

</Project>
Extensão/Perfil Nenhum Padrão AllMicrosoft
Cobertura de código ✔️ ✔️
Despejo de Erro ✔️
Falsificações ✔️¹
Depósito de Hang ✔️
Hot Reload ✔️
Relatório HTML ✔️
Relatório GitHub Actions ✔️³ ✔️³
Repetir ✔️
Trx ✔️ ✔️
Azure DevOps Report ✔️³ ✔️²

¹ MSTest.Sdk 3.7.0+ ² MSTest.Sdk 3.11.0+ ³ MSTest.Sdk 4.3.0+

Ativar ou desativar extensões

As extensões podem ser habilitadas e desabilitadas pelas propriedades do MSBuild com o padrão Enable[NugetPackageNameWithoutDots].

Por exemplo, para ativar a extensão de crash dump (pacote NuGet Microsoft. Testing.Extensions.CrashDump), pode usar a seguinte propriedade EnableMicrosoftTestingExtensionsCrashDump definida para true:

<Project Sdk="MSTest.Sdk/4.1.0">

<PropertyGroup>
    <TargetFramework>net10.0</TargetFramework>
    <EnableMicrosoftTestingExtensionsCrashDump>true</EnableMicrosoftTestingExtensionsCrashDump>
</PropertyGroup>

</Project>

Para uma lista de todas as extensões disponíveis, veja as funcionalidades do MTP.

Algumas extensões MTP continuam a ser opcionais e não estão incluídas nos perfis Default ou AllMicrosoft:

  • Começando com MSTest.Sdk 4.3, define <EnableMicrosoftTestingExtensionsJUnitReport>true</EnableMicrosoftTestingExtensionsJUnitReport>, depois passa --report-junit.
  • Começando com MSTest.Sdk 4.4, defino <EnableMicrosoftTestingExtensionsCtrfReport>true</EnableMicrosoftTestingExtensionsCtrfReport>, depois passa --report-ctrf.
  • Para referenciar a extensão OpenTelemetry, defina <EnableMicrosoftTestingExtensionsOpenTelemetry>true</EnableMicrosoftTestingExtensionsOpenTelemetry>. Como a extensão requer configuração da API, regista-a no seu ponto de entrada personalizado conforme descrito no OpenTelemetry.

Estas extensões estão disponíveis apenas com MTP.

Aviso

É importante rever os termos de licenciamento para cada extensão, pois eles podem variar.

As extensões ativadas e desativadas são combinadas com as extensões fornecidas pelo perfil de extensão selecionado.

Esse padrão de propriedade pode ser usado para habilitar uma extensão adicional sobre o perfil implícito Default (como visto no exemplo CrashDumpExtension anterior).

Você também pode desativar uma extensão proveniente do perfil selecionado. Por exemplo, desative a MS Code Coverage extensão definindo <EnableMicrosoftTestingExtensionsCodeCoverage>false</EnableMicrosoftTestingExtensionsCodeCoverage>:

<Project Sdk="MSTest.Sdk/4.1.0">

    <PropertyGroup>
        <TargetFramework>net10.0</TargetFramework>
        <EnableMicrosoftTestingExtensionsCodeCoverage>false</EnableMicrosoftTestingExtensionsCodeCoverage>
    </PropertyGroup>

</Project>

No MSTest.Sdk 4.3.0 e posteriores, o Default perfil faz referência aos pacotes Azure DevOps Report e GitHub Actions Report. Para remover qualquer referência de pacote, defina <EnableMicrosoftTestingExtensionsAzureDevOpsReport>false</EnableMicrosoftTestingExtensionsAzureDevOpsReport> ou <EnableMicrosoftTestingExtensionsGitHubActionsReport>false</EnableMicrosoftTestingExtensionsGitHubActionsReport>. Se mantiveres as referências de pacotes, os relatórios do Azure DevOps só começam quando passares --report-azdo. A criação de relatórios do GitHub Actions só começa quando executas os testes no GitHub Actions e passas --report-gh.

Funcionalidades

Para além da seleção do runner e das extensões específicas para runner, MSTest.Sdk também fornece recursos adicionais para simplificar e melhorar a sua experiência de teste.

Teste com Aspire

Aspire é uma stack opinativa e pronta para a cloud para construir aplicações distribuídas observáveis, prontas para produção. Aspire é entregue através de uma coleção de pacotes NuGet que lidam com questões específicas nativas da nuvem. Para mais informações, consulte a Aspire documentação.

Nota

Este recurso está disponível no MSTest.Sdk 3.4.0.

Ao definir a propriedade EnableAspireTesting como true, você pode trazer todas as dependências e diretivas padrão using necessárias para testar com Aspire e MSTest.

<Project Sdk="MSTest.Sdk/4.1.0">

    <PropertyGroup>
        <TargetFramework>net10.0</TargetFramework>
        <EnableAspireTesting>true</EnableAspireTesting>
    </PropertyGroup>

</Project>

Teste com Dramaturgo

Playwright permite testes fiáveis de ponta a ponta para web apps modernas. Para mais informações, consulte os documentos oficiais do Dramaturgo.

Nota

Este recurso está disponível no MSTest.Sdk 3.4.0.

Ao definir a propriedade EnablePlaywright como true você pode trazer todas as dependências e diretivas padrão using necessárias para testar com Playwright e MSTest.

<Project Sdk="MSTest.Sdk/4.1.0">

    <PropertyGroup>
        <TargetFramework>net10.0</TargetFramework>
        <EnablePlaywright>true</EnablePlaywright>
    </PropertyGroup>

</Project>

Migrar para o SDK do MSTest

Considere as etapas a seguir necessárias para migrar para o SDK do MSTest.

Atualize o seu projecto

Ao migrar um projeto de teste MSTest existente para o MSTest SDK, comece por substituir a entrada Sdk="Microsoft.NET.Sdk" no topo do seu projeto de teste por Sdk="MSTest.Sdk"

- Sdk="Microsoft.NET.Sdk"
+ Sdk="MSTest.Sdk"

Adicione a versão ao seu global.json:

{
    "msbuild-sdks": {
        "MSTest.Sdk": "4.1.0"
    }
}

Depois podes começar a simplificar o teu projecto.

Remova as propriedades padrão:

- <EnableMSTestRunner>true</EnableMSTestRunner>
- <OutputType>Exe</OutputType>
- <IsPackable>false</IsPackable>
- <IsTestProject>true</IsTestProject>

Remova as referências de pacote padrão:

- <PackageReference Include="MSTest"
- <PackageReference Include="MSTest.TestFramework"
- <PackageReference Include="MSTest.TestAdapter"
- <PackageReference Include="MSTest.Analyzers"
- <PackageReference Include="Microsoft.NET.Test.Sdk"

Finalmente, com base no perfil de extensões que está a usar, também pode remover alguns dos pacotes Microsoft.Testing.Extensions.*.

Atualize o seu CI

Depois de atualizar os seus projetos, se estiver usando MTP (por defeito) e se depender de dotnet test para executar os seus testes, é necessário atualizar a configuração do CI. Para obter mais informações e orientar a sua compreensão de todas as alterações necessárias, consulte dotnet test integration.

Se estiveres a usar o modo VSTest de dotnet test, aqui está um exemplo de atualização ao usar a tarefa DotNetCoreCLI em Azure DevOps:

O perfil de extensões predefinido do MSTest.Sdk fornece os pacotes Microsoft.Testing.Extensions.TrxReport e Microsoft.Testing.Extensions.CodeCoverage necessários para as opções adicionadas. Se selecionares o perfil None, ativa ou consulta ambas as extensões antes de usares as opções.

\- task: DotNetCoreCLI@2
  inputs:
    command: 'test'
    projects: '**/**.sln'
-    arguments: '--configuration Release'
+    arguments: '--configuration Release -- --report-trx --results-directory $(Agent.TempDirectory) --coverage'

Gerador de fonte de reflexão

O MSTest 4.3 introduziu o gerador de fonte de reflexão no pacote experimental MSTest.SourceGeneration de versão independente. A partir do MSTest 4.4, o pacote passa do estado experimental e utiliza a versão MSTest.

Os projetos nativos AOT incluem automaticamente o gerador de código-fonte. Para um projeto sem NativeAOT que utiliza MSTest.Sdk, ative-o com <EnableMSTestSourceGeneration>true</EnableMSTestSourceGeneration>. MSTest.Sdk alinha as versões MSTest.SourceGeneration, MSTest.TestFramework e MSTest.TestAdapter por meio de MSTestVersion.

O SDK também suporta a geração de código-fonte em bibliotecas de teste reutilizáveis e projetos que utilizam a Gestão Central de Pacotes. Fornece ganchos de execução correspondentes MSTest.TestAdapter e gera os itens necessários PackageVersion .

O .NET Standard não suporta estes ganchos de runtime. Quando ativa a geração de origem para um alvo .NET Standard, o SDK reporta este erro:

A geração de fonte MSTest não é suportada para frameworks de alvo .NET Standard porque os ganchos de runtime do MSTest.TestAdapter necessários não estão disponíveis.

O gerador de código-fonte descobre testes em tempo de compilação. Quando o gerador está ativo, as classes de teste devem declarar [TestClass] diretamente em vez de o herdar. O analisador MSTEST0069 sinaliza classes que dependem de um [TestClass] herdado.

A partir do MSTest 4.3.2, MSTestSourceGenMode tem como predefinição ReflectionFree nos projetos com trimming e Native AOT. Este modo utiliza metadados gerados e invocadores nos casos em que suporta a estrutura do teste. Em runtimes que suportam reflexão, o MSTest recorre à reflexão para entradas geradas não suportadas ou em falta.

A partir do MSTest 4.4, a geração sem reflexão materializa metadados completos de atributos herdados, incluindo AttributeUsage e AllowMultiple. Em MTP, pode ignorar a deteção e validação em tempo de execução para métodos síncronos simples [TestMethod] e [DataRow]. Testes assíncronos, atributos de métodos de teste personalizados, DynamicDataimplementações personalizadas ITestDataSource e formas de teste ambíguas usam o caminho de recurso. O VSTest também mantém o seu percurso existente.

O modo sem reflexão reporta estes diagnósticos:

ID Formato de teste não suportado
AOTSG0001 Classe de teste estático
AOTSG0002 Classe de teste genérica aberta, incluindo uma classe aninhada num tipo genérico
AOTSG0003 Classe à qual o código gerado não pode aceder, incluindo uma classe local ao ficheiro ou um aninhamento privado ou privado protegido
AOTSG0004 Método genérico de teste
AOTSG0005 Método de teste com um ref, in, ou out parâmetro

Características experimentais

As seguintes funcionalidades do MSTest 4.3 são experimentais. As suas APIs públicas estão sujeitas a alterações e são disponibilizadas através de funcionalidades de diagnóstico experimental. Para aderir, confirme o identificador de diagnóstico correspondente.

Filtragem programática de testes com ITestFilter

Nota

Introduzido no MSTest 4.3.0 (experimental).

O ponto de extensão experimental ITestFilter , registado através de [TestFilterProviderAttribute], permite-lhe decidir programaticamente se cada teste é executado, antes de qualquer classe de teste ser carregada. Isto é útil para lógica de seleção personalizada que não pode ser expressa com filtros de linha de comandos.

Implemente ITestFilter.Filter(TestFilterContext) para inspecionar metadados sem carregar a classe de teste:

public sealed class MyFilter : ITestFilter
{
    public TestFilterResult Filter(TestFilterContext context) =>
        context.DisplayName.Contains("Nightly", StringComparison.Ordinal)
            ? TestFilterResult.Run : TestFilterResult.Drop;
}

Prima TestFilterResult.Run para executar o teste, Drop para omiti-lo sem apresentar um resultado ou Skip(reason) para assinalar um resultado como ignorado. O MSTest pode chamar uma instância de filtro em simultâneo, pelo que as implementações devem ser seguras para threads. Os filtros da linha de comandos e do Explorador de Testes executam-se antes de ITestFilter, enquanto [Ignore] é avaliado posteriormente.

A partir do MSTest 4.4, os projetos .NET podem usar o formulário [assembly: TestFilterProvider<MyFilter>]genérico e seguro para tipos de registo. O compilador impõe então que MyFilter implementa ITestFilter e tem um construtor público sem parâmetros. O atributo genérico não está disponível para o .NET Framework. Para um projeto multi-direcionado, selecione a forma genérica ou não genérica com um símbolo de pré-processador do framework de destino.

#if NET
[assembly: TestFilterProvider<MyFilter>]
#else
[assembly: TestFilterProvider(typeof(MyFilter))]
#endif

A partir da versão 4.4 do MSTest, o analisador MSTEST0081 valida integralmente a forma de registo não genérica. Para o formulário genérico, continua a reportar tipos de filtro genéricos e assemblies que registam mais do que um fornecedor.

TestRun.Current e testes planeados

Nota

Introduzido no MSTest 4.3.0 (experimental).

A API experimental TestRun.Current (do RFC 014) expõe informações sobre a execução atual, incluindo o conjunto de testes planeados, para que extensões e fixtures possam inspecionar o que está programado para ser executado.

Limitações conhecidas

Os SDKs MSBuild fornecidos pelo NuGet (incluindo o MSTest.Sdk) têm limitado suporte a ferramentas no que toca à atualização da sua versão, o que significa que a atualização habitual do NuGet e a interface Visual Studio para gerir pacotes NuGet não funcionam como esperado. Terás de atualizar manualmente a versão no ficheiro global.json e no ficheiro project. (Isto aplica-se mesmo que uses o Dependabot devido a problemas dependabot-core#12824 e dependabot-core#8615.)

Consulte também