Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
A classe
A classe TestContext fornece informações e ferramentas úteis para ajudar a gerenciar a execução do teste. Ele permite que você acesse detalhes sobre a execução de teste e ajuste o ambiente de teste. Essa classe faz parte do namespace Microsoft.VisualStudio.TestTools.UnitTesting.
Acessando o objeto TestContext
O objeto TestContext está disponível nos seguintes contextos:
- Como parâmetro para AssemblyInitialize, o ClassInitialize métodos. Nesse contexto, as propriedades relacionadas à execução do teste não estão disponíveis.
- A partir da versão 3.6, opcionalmente, como parâmetro para o AssemblyCleanup, os métodos ClassCleanup. Nesse contexto, as propriedades relacionadas à execução do teste não estão disponíveis.
- Como uma propriedade de uma classe de teste. Nesse contexto, as propriedades relacionadas à execução do teste estão disponíveis.
- Como um parâmetro do construtor de uma classe de teste (começando com v3.6). Essa maneira é recomendada em vez de usar a propriedade, porque permite usar o objeto no construtor. Embora a propriedade só esteja disponível após o construtor ter sido executado. Essa maneira também ajuda a garantir a imutabilidade do objeto e permite que o compilador imponha que o objeto não é nulo.
using Microsoft.VisualStudio.TestTools.UnitTesting;
[TestClass]
public class MyTestClassTestContext
{
public TestContext TestContext { get; set; }
[AssemblyInitialize]
public static void AssemblyInitialize(TestContext context)
{
// Access TestContext properties and methods here. The properties related to the test run are not available.
}
[ClassInitialize]
public static void ClassInitialize(TestContext context)
{
// Access TestContext properties and methods here. The properties related to the test run are not available.
}
[TestMethod]
public void MyTestMethod()
{
// Access TestContext properties and methods here
}
}
Ou com MSTest 3.6+:
using Microsoft.VisualStudio.TestTools.UnitTesting;
[TestClass]
public class MyTestClassTestContextThroughCtor
{
private readonly TestContext _testContext;
public MyTestClassTestContextThroughCtor(TestContext testContext)
{
_testContext = testContext;
}
[AssemblyInitialize]
public static void AssemblyInitialize(TestContext context)
{
// Access TestContext properties and methods here. The properties related to the test run are not available.
}
[ClassInitialize]
public static void ClassInitialize(TestContext context)
{
// Access TestContext properties and methods here. The properties related to the test run are not available.
}
[TestMethod]
public void MyTestMethod()
{
// Access TestContext properties and methods here
}
}
Os membros TestContext
A classe TestContext fornece propriedades sobre a execução de teste juntamente com métodos para manipular o ambiente de teste. Esta seção aborda as propriedades e métodos mais usados.
Informações sobre a execução do teste
O TestContext fornece informações sobre a execução do teste, como:
- TestContext.TestName – o nome do teste em execução no momento.
- TestContext.CurrentTestOutcome - o resultado do teste atual.
- TestContext.FullyQualifiedTestClassName - o nome completo da classe de teste.
- TestContext.TestRunDirectory - o diretório onde a execução de teste é executada.
-
TestContext.DeploymentDirectory - o diretório onde os itens de implantação estão localizados. Para preencher este diretório, use
DeploymentItemAttribute. - TestContext.ResultsDirectory - o diretório onde os resultados do teste são armazenados. Normalmente, um subdiretório do TestContext.TestRunDirectory.
- TestContext.TestRunResultsDirectory - o diretório onde os resultados do teste são armazenados. Normalmente, um subdiretório do TestContext.ResultsDirectory.
- TestContext.TestResultsDirectory - o diretório onde os resultados do teste são armazenados. Normalmente, um subdiretório do TestContext.ResultsDirectory.
- Começando pelo MSTest 3,9, TestContext.TestRunCount - o número de vezes que o teste atual foi executado, contando a partir de 1. O valor é maior do que 1 quando um teste é repetido com
[Retry].
Diretório temporário de cada teste
Use TestContext.TestTempDirectory como espaço de trabalho privado para fins de teste. O MSTest só cria o diretório quando acede pela primeira vez à propriedade, e cada execução de teste recebe um diretório único. Cada linha de dados também recebe o seu próprio diretório, por isso testes paralelos não partilham caminhos.
string path = Path.Combine(TestContext.TestTempDirectory!, "output.json");
File.WriteAllText(path, json);
O MSTest cria o diretório em TestResultsDirectory sempre que possível e recorre ao diretório temporário do sistema quando o caminho dos resultados não está disponível, é demasiado longo ou é apenas de leitura. O MSTest apaga o diretório após um teste de aprovação e mantém-no após qualquer resultado que não seja aprovado. Defina a MSTEST_TEST_TEMP_DIRECTORY_RETAIN variável de ambiente para 1 ou true para manter diretórios para todos os resultados.
Quando um teste de passagem regista um ficheiro do diretório com AddResultFile, o MSTest mantém o diretório até que o host recolha o anexo. A limpeza é o melhor esforço e não altera o resultado do teste.
TestTempDirectoryestá disponível para alvos .NET e .NET Framework, mas não para alvos UWP ou WinUI. A propriedade não altera o diretório atual do processo.
No MSTest 3.7 e posterior, a classe TestContext também fornece novas propriedades úteis para TestInitialize e TestCleanup métodos:
-
TestContext.TestData - os dados que serão fornecidos ao método de teste parametrizado, ou
nullse o teste não for parametrizado. - TestContext.TestDisplayName - o nome de exibição do método de teste.
-
TestContext.TestException - a exceção lançada pelo método de teste ou pelo inicializador do teste, ou
nullse o método de teste não lançar uma exceção.
Testes orientados por dados
No MSTest 3.7 e posterior, a propriedade TestContext.TestData pode ser usada para acessar os dados para o teste atual durante os métodos TestInitialize e TestCleanup.
Ao direcionar o .NET framework, o TestContext permite recuperar e definir dados para cada iteração em um teste controlado por dados, usando propriedades como DataRow e DataConnection (para testes baseados em DataSource).
Considere o seguinte arquivo CSV TestData.csv:
Number,Name
1,TestValue1
2,TestValue2
3,TestValue3
Você pode usar o atributo DataSource para ler os dados do arquivo CSV:
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
namespace YourNamespace
{
[TestClass]
public class CsvDataDrivenTest
{
public TestContext TestContext { get; set; }
[TestMethod]
[DataSource(
"Microsoft.VisualStudio.TestTools.DataSource.CSV",
"|DataDirectory|\\TestData.csv",
"TestData#csv",
DataAccessMethod.Sequential)]
public void TestWithCsvDataSource()
{
// Access data from the current row
int number = Convert.ToInt32(TestContext.DataRow["Number"]);
string name = TestContext.DataRow["Name"].ToString();
Console.WriteLine($"Number: {number}, Name: {name}");
// Example assertions or logic
Assert.IsTrue(number > 0);
Assert.IsFalse(string.IsNullOrEmpty(name));
}
}
}
Armazenar e recuperar dados de tempo de execução
Você pode usar TestContext.Properties para armazenar pares chave-valor personalizados que podem ser acessados em diferentes métodos na mesma sessão de teste.
A partir do MSTest 4.4, o indexador retorna null consistentemente quando uma chave personalizada não existe.
TestContext.Properties["MyKey"] = "MyValue";
string value = TestContext.Properties["MyKey"]?.ToString();
Note
A partir do MSTest 4.2, as categorias de teste de [TestCategory] são incluídas em TestContext.Properties.
A partir do MSTest 4.3, as propriedades personalizadas adicionadas em TestContext.Properties em [AssemblyInitialize] são aplicadas a todas as classes e testes na assemblagem, e as propriedades adicionadas em [ClassInitialize] são aplicadas a todos os testes dessa classe. Isto permite que os fixtures publiquem contexto partilhado que os métodos de teste podem ler.
A partir do MSTest 4.3.3, [TestProperty] valores, categorias de teste, propriedades fornecidas pelo host e propriedades que um teste adiciona mantêm-se direcionados a esse teste e não fluem para testes irmãos.
Aceda a TestContext a partir da pilha de chamadas atual
A partir da versão 4.2 do MSTest, TestContext.Current devolve o TestContext do teste atual a partir de qualquer ponto da pilha de chamadas durante a execução do método de teste. Esta API é experimental, utiliza o [Experimental] atributo e pode mudar numa futura versão do MSTest.
Associar dados a um teste
O método TestContext.AddResultFile(String) permite adicionar um arquivo aos resultados do teste, tornando-o disponível para revisão na saída do teste. Isso pode ser útil se você gerar arquivos durante o teste (por exemplo, arquivos de log, capturas de tela ou arquivos de dados) que deseja anexar aos resultados do teste.
using Microsoft.VisualStudio.TestTools.UnitTesting;
[TestClass]
public class TestClassResultFile
{
public TestContext TestContext { get; set; }
[TestMethod]
public void TestMethodWithResultFile()
{
// Simulate creating a log file for this test
string logFilePath = Path.Combine(TestContext.TestRunDirectory, "TestLog.txt");
File.WriteAllText(logFilePath, "This is a sample log entry for the test.");
// Add the log file to the test result
TestContext.AddResultFile(logFilePath);
// Perform some assertions (example only)
Assert.IsTrue(File.Exists(logFilePath), "The log file was not created.");
Assert.IsTrue(new FileInfo(logFilePath).Length > 0, "The log file is empty.");
}
}
A partir da pré-visualização MSTest 4.5, o adaptador MTP nativo preserva estes ficheiros de resultados como anexos de teste para que as extensões de relatórios MTP os possam incluir.
Você também pode usar métodos TestContext.Write ou TestContext.WriteLine para escrever mensagens personalizadas diretamente na saída do teste. A partir do MSTest 4.4, o Live modo de captura de saída ecoa estas mensagens durante o teste e ainda as anexa ao resultado final do teste. Para mais informações, consulte Configurar a saída MSTest.
Token de cancelamento
TestContext expõe a propriedade CancellationToken, que é indicativa quando ocorre um timeout no teste ou quando a execução do teste é abortada. Deves passar este token para operações assíncronas, permitindo que respondam ao cancelamento de forma cooperativa. Isto é especialmente importante quando se usam atributos de Timeout .
Quando TestContext é utilizado como uma propriedade:
using Microsoft.VisualStudio.TestTools.UnitTesting;
[TestClass]
public class TestClassCancellationToken
{
// MSTest automatically sets the TestContext property before each test runs.
// MSTest.Analyzers includes a diagnostic suppressor that removes CS8618
// (non-nullable property uninitialized) for this property.
public TestContext TestContext { get; set; }
[TestMethod]
[Timeout(5000, CooperativeCancellation = true)]
public async Task MyAsyncTest()
{
using var client = new HttpClient();
var response = await client.GetAsync(
"https://example.com", TestContext.CancellationToken);
Assert.IsTrue(response.IsSuccessStatusCode);
}
}
Quando TestContext é injetado através do construtor (MSTest 3.6+):
using Microsoft.VisualStudio.TestTools.UnitTesting;
[TestClass]
public class TestClassCancellationTokenCtor
{
private readonly TestContext _testContext;
public TestClassCancellationTokenCtor(TestContext testContext)
{
_testContext = testContext;
}
[TestMethod]
[Timeout(5000, CooperativeCancellation = true)]
public async Task MyAsyncTest()
{
using var client = new HttpClient();
var response = await client.GetAsync(
"https://example.com", _testContext.CancellationToken);
Assert.IsTrue(response.IsSuccessStatusCode);
}
}
Sugestão
A regra do analisador MSTest MSTEST0049 ajuda a identificar chamadas assíncronas onde TestContext.CancellationToken deveria ser passado. Também fornece um fixador de código para aplicar a alteração automaticamente.
Analisadores relacionados
Os seguintes analisadores ajudam a garantir a utilização correta da TestContext classe:
- MSTEST0005 - A propriedade TestContext deve ter um layout válido.
- MSTEST0024 - Não armazene o TestContext num membro estático.
- MSTEST0033 - Suprime CS8618 para a propriedade TestContext.
- MSTEST0048 - Evitar propriedades do TestContext nos métodos fixture.
- MSTEST0049 - Fluxo TestContext CancellationToken.
- MSTEST0054 - Utilize a propriedade CancellationToken.