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 pacotes de teste com integração com Visual Studio e Visual Studio Code Test Explorers, a CLI do .NET e muitos pipelines de CI.

O MSTest é uma estrutura de teste totalmente suportada, de código aberto e multiplataforma 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

Um arquivo .runsettings pode ser usado para configurar como os testes de unidade estão sendo executados. Para saber mais sobre as definições de execução e as configurações relacionadas com a plataforma, pode consultar a documentação sobre definições de execução do VSTest ou a documentação sobre definições de execução do MSTest runner.

Elemento MSTest

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

Configuração Predefinido Valores
AssemblyCleanupTimeout Nenhum Defina o tempo limite global a ser aplicado em cada instância do método de limpeza de assemblagem. [Timeout] o atributo especificado no método de limpeza de montagem sobrepõe-se ao timeout global.
AssemblyInitializeTimeout Nenhum Especifique o tempo limite global a ser aplicado em cada instância do método de inicialização do assembly. [Timeout] O atributo especificado no método de inicialização da montagem sobrepõe-se ao timeout global.
AssemblyResolution falso Você pode especificar caminhos para assemblies extras ao localizar e executar testes de unidade. Por exemplo, use esses caminhos para assemblies de dependências que não estão no mesmo diretório que o assembly de teste. Para especificar um caminho, use um elemento Directory Path . 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 do .NET Framework.
CaptureTraceOutput Result Captura texto das Console.Write*APIs , Trace.Write*, e Debug.Write* associa-o ao teste atual. A partir do MSTest 4.4, use None, Result, ou Live. Live Também ecoa Console, Trace, e TestContext.Write* envia para a consola enquanto o teste decorre. Os valores booleanos anteriores continuam a ser suportados: true mapeiam para Result, e false mapeiam para None.
ClassCleanupLifecycle Fim de Aula Se quiseres que a limpeza da classe ocorra no final da compilação, define-a como EndOfAssembly. (Já não é suportado a partir do MSTest v4, pois EndOfClass é o comportamento padrão e único do ClassCleanup )
ClassCleanupTimeout Nenhum Especifique globalmente o tempo limite para aplicar em cada instância do método de limpeza da classe. O [Timeout] atributo especificado no método de limpeza da classe substitui o tempo limite global.
ClassInitializeTimeout Nenhum Especifique globalmente o tempo limite a ser aplicado em cada instância do método de inicialização de classe. [Timeout] atributo especificado no método de inicialização de classe substitui o tempo limite global.
ConsiderFixturesAsSpecialTests falso Para exibir AssemblyInitialize, AssemblyCleanup, ClassInitialize, ClassCleanup como entradas individuais no Visual Studio e no Visual Studio Code Test Explorer no log .trx, defina esse valor como true
DeleteDeploymentDirectoryAfterTestRunIsComplete verdadeiro Para manter 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 no 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 do teste devem ser implantadas.
EnableBaseClassTestMethodsFromOtherAssemblies verdadeiro Um valor que indica se a descoberta de métodos de teste de classes base deve ser habilitada em um assembly diferente da classe de teste herdeira.
ForcedLegacyMode falso Em versões mais antigas do Visual Studio, o adaptador MSTest foi otimizado para torná-lo mais rápido e escalável. Alguns comportamentos, como a ordem em que os testes são executados, podem não ser exatamente como era em edições anteriores do Visual Studio. Defina o valor como true para usar o adaptador de teste mais antigo.

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

Recomendamos que você considere a refatoração de seus testes para permitir que você use o adaptador mais recente.
GlobalTestCleanupTimeout TestCleanupTimeout A partir do MSTest 4.4, especifique o timeout para cada método global de limpeza de teste. Quando omite esta entrada, o MSTest usa TestCleanupTimeout. Um [Timeout] atributo no método sobrepõe-se a ambos os valores.
GlobalTestInitializeTimeout TestInitializeTimeout A partir do MSTest 4.4, especifique o timeout para cada método global de inicialização de teste. Quando omite esta entrada, o MSTest usa TestInitializeTimeout. Um [Timeout] atributo no método sobrepõe-se a ambos os valores.
LaunchDebuggerOnTestFailure falso A partir do MSTest 4.2, quando definido como true, o MSTest lança 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. Se você quiser que testes inconclusivos sejam mostrados como reprovados, defina o valor como true.
MapNotRunnableToFailed verdadeiro Um valor que indica se um resultado não executável é mapeado para um teste falhado.
OrderTestsByNameInClass falso Se você quiser executar testes por nomes de teste nos Exploradores de Teste e na linha de comando, defina esse valor como true.
Parallelize Usado para definir as configurações de paralelização:

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

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

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

Se especificar este valor, também deve definir o ForcedLegacyMode como verdadeiro.

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

Os valores de timeout devem ser inteiros positivos em milissegundos. Para correr sem timeout, omita a entrada em vez de a definir como 0. Os tempos finais globais dos jogos de teste herdam o valor correspondenteTestInitializeTimeout.TestCleanupTimeout

TestRunParameter elemento

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

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

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 pública TestContext à sua classe de teste.

Exemplo de arquivo .runsettings

O XML a seguir mostra o conteúdo de um arquivo .runsettings típico. Copie este código e edite-o de acordo com as 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 de testconfig.json para configurar o comportamento do executor de teste. O arquivo testconfig.json é um arquivo JSON que contém as definições de configuração para o executor de teste. O arquivo é usado para configurar o executor de teste e o ambiente de execução de teste. Para mais informações, consulte a documentação do MTP testconfig.json.

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, o .NET Framework também aceita comentários e vírgulas em testconfig.json.

Elemento MSTest

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

Entrada Predefinido Descrição
ativarMétodosDeTesteDaClasseBaseDeOutrasAssemblies verdadeiro Um valor que indica se a descoberta de métodos de teste de classes base deve ser habilitada em um assembly diferente da classe de teste herdeira.
classCleanupLifecycle Fim da Montagem Se você quiser que a limpeza de classe ocorra no final da classe, defina-a como EndOfClass.

assemblyResolution configurações

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

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

Exemplo:

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

deployment configurações

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

Entrada Predefinido Descrição
excluirDiretórioDeDesenvolvimentoApósConclusãoDoTeste verdadeiro Para manter 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.
ativado verdadeiro Se você definir o valor como false, os itens de implantação especificados no 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
    }
  }
}

output configurações

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

Entrada Predefinido Descrição
captureTrace Result Capturar Console, Trace, e Debug sair e associá-lo ao teste atual. A partir do MSTest 4.4, use None, Result, ou Live. Live também ecoa a saída, incluindo TestContext.Write* mensagens, enquanto o teste é executado. Os valores booleanos continuam a ser suportados: true mapes para Result, e false mapes para None.

Exemplo:

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

parallelism configurações

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

Entrada Predefinido Descrição
ativado falso Habilite a paralelização de teste.
âmbito classe O âmbito da paralelização. Você pode defini-lo como method. O padrão, class, refere-se à execução sequencial de todos os testes de uma dada classe, enquanto várias classes são executadas em paralelo.
trabalhadores 0 O número de threads/trabalhadores a serem usados para paralelização. O valor predefinido corresponde ao número de processadores na máquina atual.

Exemplo:

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

execution configurações

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

Entrada Predefinido Descrição
considerarFonteDeDadosVaziaComoInconclusiva falso Quando definido como true, uma fonte de dados vazia é considerada inconclusiva.
considerarFixturesComoTestesEspeciais falso Para exibir AssemblyInitialize, AssemblyCleanup, ClassInitialize, ClassCleanup como entradas individuais no Visual Studio e no Visual Studio Code Test Explorer e no log de .trx, defina este valor como verdadeiro.
dependências Começando pelo MSTest 4.4, declare dependência chains do teste e nodes. Esta definição está disponível apenas com a Microsoft. Teste.Plataforma. Para mais informações, consulte Dependências de Teste.
mapearInconclusivoParaFalhado falso Se um teste for concluído com um status inconclusivo, ele será mapeado para o status ignorado no Gerenciador de Testes. Se você quiser que testes inconclusivos sejam mostrados como reprovados, defina o valor como true.
iniciarDepuradorEmFalhaNoTeste falso A partir do MSTest 4.2, quando definido para true, o MSTest lança o depurador quando um teste falha.
mapearNaoExecutavelParaFalhado verdadeiro Um valor que indica se um resultado não executável é mapeado para um teste falhado.
ordenarTestesPorNomeNaClasse falso Realize testes por ordem alfabética dentro de cada turma. A partir do MSTest 4.3, use mstest.execution.orderTestsByNameInClass. A chave anterior mstest.orderTestsByNameInClass ainda funciona, mas gera um aviso de depreciação.
Aleatorizar a ordem dos testes falso A partir do MSTest 4.3, defina este valor para true executar testes por ordem aleatória, o que ajuda a revelar dependências ocultas de ordenação entre testes. Esta configuração não pode ser combinada com orderTestsByNameInClass.
randomTestOrderSeed A partir do MSTest 4.3, quando randomizeTestOrder for true, defina um valor inteiro para a semente para tornar a ordem aleatória reprodutível de execução para execução. Quando não estiver definido, é usada uma nova semente para cada execução.
treatClassAndAssemblyCleanupAvisosAsErros falso Para ver suas falhas nas limpezas de classe como erros, defina esse valor como true.
Tratar Avisos de Descoberta como Erros falso Para relatar avisos de descoberta de teste como erros, defina esse valor como true.

Exemplo:

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

timeout configurações

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

Entrada Predefinido Descrição
montagemLimpeza Nenhum Defina o tempo limite global a ser aplicado em cada instância do método de limpeza de assemblagem.
inicializarMontagem Nenhum Especifique o tempo limite global a ser aplicado em cada instância do método de inicialização do assembly.
classCleanup Nenhum Especifique globalmente o tempo limite para aplicar em cada instância do método de limpeza da classe.
classInitialize Nenhum Especifique globalmente o tempo limite a ser aplicado em cada instância do método de inicialização de classe.
globalTestCleanup testCleanup A partir do MSTest 4.4, especifique o timeout para cada método global de limpeza de teste. Quando omite esta entrada, o MSTest usa testCleanup.
globalTestInitialize testInitialize A partir do MSTest 4.4, especifique o timeout para cada método global de inicialização de teste. Quando omite esta entrada, o MSTest usa testInitialize.
testar Nenhum Especifique globalmente o tempo limite do teste.
testCleanup Nenhum Especifique globalmente o tempo limite a ser aplicado em cada instância do método de limpeza de teste.
testInitialize Nenhum Especifique globalmente o tempo limite a ser aplicado em cada instância do método de inicialização de teste.
useCooperativaCancelamento falso Quando definido como true, em caso de tempo limite, o MSTest apenas acionará o cancelamento do CancellationToken mas não deixará de observar o método. Este comportamento é mais eficiente, mas depende do utilizador para passar corretamente o token por todos os caminhos.

Observação

Os valores de timeout devem ser inteiros positivos em milissegundos. Para correr sem timeout, omita a entrada em vez de a definir como 0. Os tempos mortos dos jogos de teste globais herdam o valor correspondente testInitializetestCleanup , por isso omita ambas as entradas quando não quiseres um timeout num jogo global. Um [Timeout] atributo num método sobrepõe-se ao timeout configurado.

Exemplo:

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

Exemplo testconfig.json arquivo

O JSON a seguir mostra o conteúdo de um arquivo .testconfig.json típico. Copie este código e edite-o de acordo com as 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, ative a paralelização ao nível da assemblagem no ficheiro do projeto ou em Directory.Build.props, sem definir um atributo [assembly: Parallelize]. Estas propriedades emitem o correspondente atributo assembly durante a compilação, pelo que precisam GenerateAssemblyInfo de ser true (o padrão para projetos ao estilo SDK).

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

O MSTest valida ambas as propriedades durante a compilação. Valores de âmbito inválidos, contagens de trabalhadores não inteiros e uma contagem de trabalhadores combinados com um None âmbito falham na compilação. Também não declares [assembly: Parallelize] nem [assembly: DoNotParallelize] no código-fonte, porque o atributo gerado duplicaria o atributo. Quando GenerateAssemblyInfo é false, declare o atributo na fonte em vez disso.

O exemplo seguinte permite a paralelização ao nível do método com quatro trabalhadores para cada projeto de teste que importa o Directory.Build.props ficheiro:

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