Partilhar via


A classe TestContext

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:

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 null se 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 null se 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.

TestContext.Properties["MyKey"] = "MyValue";
string value = TestContext.Properties["MyKey"]?.ToString();

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.");
    }
}

Você também pode usar métodos TestContext.Write ou TestContext.WriteLine para escrever mensagens personalizadas diretamente na saída do teste. Isso é especialmente útil para fins de depuração, pois fornece informações de log em tempo real dentro do contexto de execução do teste.

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.