Configurar o MSTest

MSTest, Microsoft Testing Framework, é uma estrutura de teste para aplicativos .NET. Ele permite que você escreva e execute testes e forneça suítes de testes com integração ao Visual Studio e Visual Studio Code Test Explorers, à CLI do .NET e a muitos pipelines de CI.

MSTest é uma estrutura de teste de código aberto e de plataforma cruzada totalmente compatível que funciona com todos os destinos .NET suportados (.NET Framework, .NET Core, .NET, UWP, WinUI e assim por diante) hospedados no GitHub.

Configurações de Execução

O arquivo .runsettings pode ser usado para configurar como serão executados os testes de unidade. Para saber mais sobre as configurações de execução e as configurações relacionadas à plataforma, você pode conferir a documentação de configurações de execução do VSTest ou a documentação de configurações de execução do executor do MSTest.

Elemento MSTest

As seguintes entradas runsettings permitem configurar como o MSTest se comporta.

Configuração Padrão Valores
AssemblyCleanupTimeout Nenhum Especifique globalmente o tempo limite a ser aplicado em cada instância do método de limpeza do assembly. [Timeout] O atributo especificado no método de limpeza do assembly substitui o tempo limite global.
AssemblyInitializeTimeout Nenhum Especifique globalmente o tempo limite a ser aplicado a cada instância do método de inicialização do assembly. [Timeout] o atributo especificado no método de inicialização do assembly substitui o tempo limite global.
AssemblyResolution falso É possível especificar caminhos para assemblies extras ao localizar e executar testes de unidade. Por exemplo, use esses caminhos para assemblies de dependência que não estão no mesmo diretório do assembly de teste. Para especificar um caminho, use um elemento Caminho do Diretório. Os caminhos podem incluir variáveis de ambiente.

<AssemblyResolution> <Directory path="D:\myfolder\bin\" includeSubDirectories="false"/> </AssemblyResolution>

Esse recurso só é aplicado ao usar um destino .NET Framework.
CaptureTraceOutput Result Capture o texto das APIs e apis Console.Write*Trace.Write*e Debug.Write* associe-o ao teste atual. Começando com MSTest 4.4, use None, Resultou Live. Live também ecoa Console, Tracee a TestContext.Write* saída para o console enquanto o teste é executado. Os valores boolianos anteriores permanecem com suporte: true mapeia para Result, e false mapeia para None.
ClassCleanupLifecycle EndOfClass Se você deseja que a limpeza da classe ocorra ao final da montagem, defina-a como EndOfAssembly. (Não há mais suporte a partir do MSTest v4, pois EndOfClass é o comportamento padrão e o único comportamento de ClassCleanup)
ClassCleanupTimeout Nenhum Especifique globalmente o tempo limite a ser aplicado a cada instância do método de limpeza de classes. [Timeout] O atributo especificado no método de limpeza da classe substitui o tempo limite global.
ClassInitializeTimeout Nenhum Especifique globalmente o tempo limite a ser aplicado a cada instância do método de inicialização de classes. [Timeout] O atributo especificado no método de inicialização da classe substitui o tempo limite global.
ConsiderFixturesAsSpecialTests falso Para exibir AssemblyInitialize, AssemblyCleanup, ClassInitialize, ClassCleanup como entradas individuais no log do Visual Studio e do Visual Studio Code Test Explorer e .trx, defina esse valor como true
DeleteDeploymentDirectoryAfterTestRunIsComplete verdadeiro Para reter o diretório de implantação após uma execução de teste, defina esse valor como false.
DeploymentEnabled verdadeiro Se você definir o valor como false, os itens de implantação especificados em seu método de teste não serão copiados para o diretório de implantação.
DeployTestSourceDependencies verdadeiro Um valor que indica se as referências de origem de teste devem ser implantadas.
EnableBaseClassTestMethodsFromOtherAssemblies verdadeiro Um valor que indica se é necessário habilitar a descoberta de métodos de teste de classes base em um assembly diferente da classe de teste herdada.
ForcedLegacyMode falso Nas versões mais antigas do Visual Studio, o adaptador MSTest foi otimizado para torná-lo mais rápido e mais escalonável. Alguns comportamentos, como a ordem em que os testes são executados, não podem ser exatamente iguais aos de edições anteriores do Visual Studio. Defina o valor como true para usar o adaptador de teste mais antigo.

Por exemplo, você poderá usar essa configuração se tiver um arquivo app.config especificado para um teste de unidade.

Recomendamos que você considere refatorar seus testes para permitir o uso do adaptador mais recente.
GlobalTestCleanupTimeout TestCleanupTimeout A partir do MSTest 4.4, especifique o tempo limite para cada método de limpeza de teste global. Quando você omite essa entrada, o MSTest usa TestCleanupTimeout. Um [Timeout] atributo no método substitui os dois valores.
GlobalTestInitializeTimeout TestInitializeTimeout A partir do MSTest 4.4, especifique o tempo limite para cada método de inicialização de teste global. Quando você omite essa entrada, o MSTest usa TestInitializeTimeout. Um [Timeout] atributo no método substitui os dois valores.
LaunchDebuggerOnTestFailure falso A partir do MSTest 4.2, quando definido como true, o MSTest inicia o depurador quando um teste falha.
MapInconclusiveToFailed falso Se um teste for concluído com um status inconclusivo, ele será mapeado para o status Ignorado no Gerenciador de Testes. Caso deseje que os testes inconclusivos sejam mostrados como com falha, defina esse valor como true.
MapNotRunnableToFailed verdadeiro Um valor que indica se um resultado não executável será mapeado para o teste com falha.
OrderTestsByNameInClass falso Se você quiser executar testes por nomes de teste nos Exploradores de Teste e na linha de comando, defina esse valor como verdadeiro.
Parallelize Usado para definir as configurações de paralelização:

Workers: O número de threads/workers a serem usados na paralelização, que é, por padrão, o número de processadores na máquina atual.

Scope: o escopo da paralelização. Você pode defini-lo como MethodLevel. Por padrão, ele é ClassLevel.

<Parallelize><Workers>32</Workers><Scope>MethodLevel</Scope></Parallelize>
RandomizeTestOrder falso A partir do MSTest 4.3, defina esse valor como true para executar testes em uma ordem aleatória, o que ajuda a exibir dependências de ordenação ocultas entre testes. Essa configuração não pode ser combinada com OrderTestsByNameInClass.
RandomTestOrderSeed A partir do MSTest 4.3, quando RandomizeTestOrder for verdadeiro, defina uma semente inteira para tornar a ordem aleatória reproduzível entre as execuções. Quando não definido, uma nova semente é usada para cada execução.
SettingsFile Especifique um arquivo de configurações do teste para usar com o adaptador MSTest aqui. Você também pode especificar um arquivo de configurações do teste no menu de configurações.

Se você especificar esse valor, também deverá definir ForcedLegacyMode como true.

<ForcedLegacyMode>true</ForcedLegacyMode>
TestCleanupTimeout Nenhum Especifique globalmente o tempo limite a ser aplicado a cada instância do método de limpeza de testes. O atributo [Timeout] especificado no método de limpeza de testes substitui o tempo limite global.
TestInitializeTimeout Nenhum Especifique globalmente o tempo limite a ser aplicado a cada instância do método de inicialização de testes. O atributo [Timeout] especificado no método de inicialização de testes substitui o tempo limite global.
TestTimeout Nenhum Obtém o tempo limite de caso de teste global especificado.
TreatClassAndAssemblyCleanupWarningsAsErrors falso Para ver as falhas nas limpezas de classe como erros, defina esse valor como true.
TreatDiscoveryWarningsAsErrors falso Para relatar avisos de descoberta de teste como erros, defina este valor como true.

Os valores de tempo limite devem ser inteiros positivos em milissegundos. Para ser executado sem tempo limite, omita a entrada em vez de defini-la como 0. Os tempos limite de instalação de teste globais herdam o valor ou TestCleanupTimeout o valor correspondenteTestInitializeTimeout.

Elemento TestRunParameter

<TestRunParameters>
    <Parameter name="webAppUrl" value="http://localhost" />
</TestRunParameters>

Os parâmetros de execução de teste fornecem uma maneira de definir variáveis e valores que estão disponíveis para os testes em runtime. Acesse os parâmetros usando a propriedade TestContext.Properties do MSTest:

private string _appUrl;
public TestContext TestContext { get; set; }

[TestMethod]
public void HomePageTest()
{
    string _appUrl = TestContext.Properties["webAppUrl"];
}

Para usar parâmetros de execução de teste, adicione uma propriedade TestContext pública à classe de teste.

Arquivo .runsettings de exemplo

O XML a seguir mostra o conteúdo de um arquivo .runsettings típico. Copie esse código e edite-o para atender às suas necessidades.

Cada elemento do arquivo é opcional, porque tem um valor padrão.

<?xml version="1.0" encoding="utf-8"?>
<RunSettings>

  <!-- Parameters used by tests at runtime -->
  <TestRunParameters>
    <Parameter name="webAppUrl" value="http://localhost" />
    <Parameter name="webAppUserName" value="Admin" />
    <Parameter name="webAppPassword" value="Password" />
  </TestRunParameters>

  <!-- MSTest -->
  <MSTest>
    <MapInconclusiveToFailed>True</MapInconclusiveToFailed>
    <CaptureTraceOutput>false</CaptureTraceOutput>
    <DeleteDeploymentDirectoryAfterTestRunIsComplete>False</DeleteDeploymentDirectoryAfterTestRunIsComplete>
    <DeploymentEnabled>False</DeploymentEnabled>
    <ConsiderFixturesAsSpecialTests>False</ConsiderFixturesAsSpecialTests>
    <AssemblyResolution>
      <Directory path="D:\myfolder\bin\" includeSubDirectories="false"/>
    </AssemblyResolution>
  </MSTest>

</RunSettings>

testconfig.json

Ao executar seus testes com o MSTest, você pode usar um arquivo testconfig.json para configurar o comportamento do executor de teste. O arquivo testconfig.json é um arquivo JSON que contém as configurações do executor de teste. O arquivo é usado para configurar o executor de teste e o ambiente de execução de teste. Para obter mais informações, consulte a documentação do testconfig.json MTP.

A partir do MSTest 3.7, você também pode configurar as execuções do MSTest no mesmo arquivo de configuração. As seções a seguir descrevem as configurações que você pode usar no arquivo testconfig.json.

A partir do MSTest 4.3.3, as execuções do .NET Framework também aceitam comentários e vírgulas à direita em testconfig.json.

Elemento MSTest

As configurações do MSTest são agrupadas pela funcionalidade descrita nas seções a seguir.

Entry Padrão Descrição
enableBaseClassTestMethodsFromOtherAssemblies verdadeiro Um valor que indica se é necessário habilitar a descoberta de métodos de teste de classes base em um assembly diferente da classe de teste herdada.
classCleanupLifecycle FimDaMontagem Se você quiser que a limpeza de classe ocorra no final da classe, defina-a como EndOfClass.

Configurações doassemblyResolution

Todas as configurações nesta seção pertencem ao assemblyResolution elemento.

Entry Padrão Descrição
Caminhos Nenhum É possível especificar caminhos para assemblies extras ao localizar e executar testes de unidade. Por exemplo, use esses caminhos para assemblies de dependência que não estão no mesmo diretório do assembly de teste. Você pode especificar um caminho na forma { "path": "...", "includeSubDirectories": "true/false" }.

Exemplo:

{
  "mstest": {
    "assemblyResolution": {
        { "path": "...", "includeSubDirectories": "true/false" }
    }
  }
}

Configurações dodeployment

Todas as configurações nesta seção pertencem ao deployment elemento.

Entry Padrão Descrição
excluirDiretorioDeImplantacaoAposConclusaoDoTeste verdadeiro Para reter o diretório de implantação após uma execução de teste, defina esse valor como false.
deployTestSourceDependencies verdadeiro Indica se as referências de origem de teste devem ser implantadas.
Habilitado verdadeiro Se você definir o valor como false, os itens de implantação especificados em seu método de teste não serão copiados para o diretório de implantação.

Exemplo:

{
  "mstest": {
    "deployment": {
        "deleteDeploymentDirectoryAfterTestRunIsComplete": true,
        "deployTestSourceDependencies": true,
        "enabled": true
    }
  }
}

Configurações dooutput

Todas as configurações nesta seção pertencem ao output elemento.

Entry Padrão Descrição
captureTrace Result Capturar Console, Tracee gerar e Debug associá-lo ao teste atual. Começando com MSTest 4.4, use None, Resultou Live. Live também ecoa a saída, incluindo TestContext.Write* mensagens, enquanto o teste é executado. Os valores boolianos permanecem com suporte: true mapeia para Resulte false mapeia para None.

Exemplo:

{
  "mstest": {
    "output": {
        "captureTrace": false
    }
  }
}

Configurações doparallelism

Todas as configurações nesta seção pertencem ao parallelism elemento.

Entry Padrão Descrição
Habilitado falso Habilite a paralelização de teste.
escopo classe O escopo da paralelização. Você pode defini-lo como method. O padrão, class, corresponde à execução de todos os testes de uma determinada classe sequencialmente, mas múltiplas classes ao mesmo tempo.
Trabalhadores 0 O número de threads/trabalhadores usados para paralelização. O valor padrão corresponde ao número de processadores no computador atual.

Exemplo:

{
  "mstest": {
    "parallelism": {
        "enabled": true,
        "scope": "method",
        "workers": 32
    }
  }
}

Configurações doexecution

Todas as configurações nesta seção pertencem ao execution elemento.

Entry Padrão Descrição
considerarFonteDeDadosVaziaComoInconclusiva falso Quando definido como true, uma fonte de dados vazia é considerada inconclusiva.
considerFixturesAsSpecialTests falso Para exibir AssemblyInitialize, AssemblyCleanup, ClassInitialize, ClassCleanup como entradas individuais no log do Visual Studio e do Visual Studio Code Test Explorer e .trx, defina esse valor como true.
dependências A partir do MSTest 4.4, declare a dependência chains de teste e nodes. Essa configuração só está disponível com Microsoft. Testing.Platform. Para obter mais informações, consulte Dependências de teste.
mapInconclusiveToFailed falso Se um teste for concluído com um status inconclusivo, ele será mapeado para o status Ignorado no Gerenciador de Testes. Caso deseje que os testes inconclusivos sejam mostrados como com falha, defina esse valor como true.
launchDebuggerOnTestFailure falso A partir do MSTest 4.2, quando definido como true, o MSTest inicia o depurador quando um teste falha.
mapNotRunnableToFailed verdadeiro Um valor que indica se um resultado não executável será mapeado para o teste com falha.
ordenarTestesPorNomeNaClasse falso Execute testes em ordem alfabética dentro de cada classe. A partir do MSTest 4.3, use mstest.execution.orderTestsByNameInClass. A chave anterior mstest.orderTestsByNameInClass ainda funciona, mas produz um aviso de substituição.
randomizeTestOrder falso A partir do MSTest 4.3, defina esse valor para true executar testes em uma ordem aleatória, o que ajuda a exibir dependências de ordenação ocultas entre testes. Essa configuração não pode ser combinada com orderTestsByNameInClass.
randomTestOrderSeed A partir do MSTest 4.3, quando randomizeTestOrder for true, defina uma semente inteira para tornar a ordem aleatória reproduzível entre as execuções. Quando não definido, uma nova semente é usada para cada execução.
treatClassAndAssemblyCleanupWarningsAsErrors falso Para ver as falhas nas limpezas de classe como erros, defina esse valor como true.
tratarAvisosDeDescobertaComoErros falso Para relatar avisos de descoberta de teste como erros, defina este valor como true.

Exemplo:

{
  "mstest": {
    "execution": {
        "considerEmptyDataSourceAsInconclusive": false,
        "considerFixturesAsSpecialTests": false,
        "mapInconclusiveToFailed": true,
        "mapNotRunnableToFailed": true,
        "treatClassAndAssemblyCleanupWarningsAsErrors": false,
        "treatDiscoveryWarningsAsErrors": false
    }
  }
}

Configurações dotimeout

Todas as configurações nesta seção pertencem ao timeout elemento.

Entry Padrão Descrição
assemblyCleanup Nenhum Especifique globalmente o tempo limite a ser aplicado em cada instância do método de limpeza do assembly.
assemblyInitialize Nenhum Especifique globalmente o tempo limite a ser aplicado a cada instância do método de inicialização do assembly.
classCleanup Nenhum Especifique globalmente o tempo limite a ser aplicado a cada instância do método de limpeza de classes.
classInitialize Nenhum Especifique globalmente o tempo limite a ser aplicado a cada instância do método de inicialização de classes.
globalTestCleanup testCleanup A partir do MSTest 4.4, especifique o tempo limite para cada método de limpeza de teste global. Quando você omite essa entrada, o MSTest usa testCleanup.
globalTestInitialize testInitialize A partir do MSTest 4.4, especifique o tempo limite para cada método de inicialização de teste global. Quando você omite essa entrada, o MSTest usa testInitialize.
testar Nenhum Especifique globalmente o tempo limite de teste.
testCleanup Nenhum Especifique globalmente o tempo limite a ser aplicado a cada instância do método de limpeza de testes.
testInitialize Nenhum Especifique globalmente o tempo limite a ser aplicado a cada instância do método de inicialização de testes.
useCooperativeCancellation falso Quando configurado para true, em caso de tempo de espera, o MSTest executará somente o cancelamento do CancellationToken, mas não deixará de observar o método. Esse comportamento é mais eficiente, mas depende do usuário encaminhar corretamente o token por todos os caminhos.

Nota

Os valores de tempo limite devem ser inteiros positivos em milissegundos. Para ser executado sem tempo limite, omita a entrada em vez de defini-la como 0. Os tempos limite de instalação de teste globais herdam o valor ou testCleanup o correspondentetestInitialize, portanto, omitem ambas as entradas quando você não deseja um tempo limite em uma instalação global. Um [Timeout] atributo em um método substitui o tempo limite configurado.

Exemplo:

{
  "mstest": {
    "timeout": { "globalTestInitialize": 30000, "globalTestCleanup": 30000 }
  }
}

Exemplo testconfig.json arquivo

O JSON a seguir mostra o conteúdo de um arquivo de .testconfig.json típico. Copie esse código e edite-o para atender às suas necessidades.

Cada elemento do arquivo é opcional, porque tem um valor padrão.

{
  "platformOptions": {
    "resultDirectory": "./TestResults"
  },
  "mstest": {
    "execution": {
        "mapInconclusiveToFailed": true,
        "disableAppDomain": true,
        "considerFixturesAsSpecialTests": false
    },
    "parallelism": {
        "enabled": true,
        "scope": "method"
    },
    "output": {
        "captureTrace": false
    }
  }
}

Propriedades do MSBuild

A partir do MSTest 4.3, habilite a paralelização no nível do assembly no arquivo do projeto ou em Directory.Build.props, sem precisar declarar um atributo [assembly: Parallelize]. Essas propriedades emitem o atributo de montagem correspondente durante a compilação, portanto, exigem que GenerateAssemblyInfo esteja true (o padrão para projetos no estilo do SDK).

Property Padrão Descrição
MSTestParallelizeScope O escopo de paralelização. Defina-o como MethodLevel ou ClassLevel para emitir [assembly: Parallelize(Scope = ExecutionScope.MethodLevel)] (ou ExecutionScope.ClassLevel), ou como None para emitir [assembly: DoNotParallelize].
MSTestParallelizeWorkers O número máximo de threads de trabalho, emitido como o valor Workers de [assembly: Parallelize]. Um valor de 0 corresponde ao número de processadores na máquina atual. Essa propriedade não pode ser definida quando MSTestParallelizeScope é None.

O MSTest valida ambas as propriedades durante o build. Valores de escopo inválidos, contagens de trabalho não inteiros e uma contagem de trabalho combinada com um None escopo falham no build. Também não declare [assembly: Parallelize] ou [assembly: DoNotParallelize] na origem, pois o atributo gerado o duplicaria. Quando GenerateAssemblyInfo for false, declare o atributo na origem.

O exemplo a seguir habilita a paralelização no nível do método com quatro trabalhadores para cada projeto de teste que importa o Directory.Build.props arquivo:

<Project>
  <PropertyGroup>
    <MSTestParallelizeScope>MethodLevel</MSTestParallelizeScope>
    <MSTestParallelizeWorkers>4</MSTestParallelizeWorkers>
  </PropertyGroup>
</Project>