Condividi tramite


Classe TestContext

La classe TestContext fornisce informazioni e strumenti utili per gestire l'esecuzione dei test. Consente di accedere ai dettagli sull'esecuzione del test e modificare l'ambiente di test. Questa classe fa parte dello spazio dei nomi Microsoft.VisualStudio.TestTools.UnitTesting.

Accesso all'oggetto TestContext

L'oggetto TestContext è disponibile nei contesti seguenti:

  • Come parametro per i metodi [AssemblyInitialize] e [ClassInitialize]. In questo contesto, le proprietà correlate all'esecuzione del test non sono disponibili.
  • Come proprietà di una classe di test. In questo contesto sono disponibili le proprietà correlate all'esecuzione del test.
  • Come parametro costruttore di una classe di test (dalla versione 3.6 in poi). È consigliabile questo metodo rispetto all'uso della proprietà, perché consente l'accesso all'oggetto nel costruttore. Mentre la proprietà è disponibile solo dopo l'esecuzione del costruttore. In questo modo è inoltre possibile garantire l'immutabilità dell'oggetto e consentire al compilatore di imporre che l'oggetto non sia Null.
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
    }
}

Oppure con 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
    }
}

Membri TestContext

La classe TestContext fornisce proprietà sull'esecuzione del test insieme ai metodi per modificare l'ambiente di test. Questa sezione illustra le proprietà e i metodi più usati.

Informazioni sull'esecuzione dei test

Il TestContext fornisce informazioni sull'esecuzione del test, ad esempio:

In MSTest 3.7 e versioni successive, la classe TestContext fornisce anche nuove proprietà utili per i metodi TestInitialize e TestCleanup:

  • TestContext.TestData: i dati che verranno forniti al metodo di test con parametri o null se il test non è parametrizzato.
  • TestContext.TestDisplayName: nome visualizzato del metodo di test.
  • TestContext.TestException: eccezione generata dal metodo di test o dall'inizializzazione del test oppure null se il metodo di test non ha generato un'eccezione.

Test basati sui dati

In MSTest 3.7 e versioni successive, la proprietà TestData può essere usata per accedere ai dati per il test corrente durante i metodi TestInitialize e TestCleanup.

Quando la destinazione è .NET Framework, il TestContext consente di recuperare e impostare i dati per ogni iterazione in un test basato sui dati, usando proprietà come DataRow e DataConnection (per DataSource-based test).

Si consideri il file CSV seguente TestData.csv:

Number,Name
1,TestValue1
2,TestValue2
3,TestValue3

È possibile usare l'attributo DataSource per leggere i dati dal file 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));
        }
    }
}

Archiviare e recuperare i dati di runtime

È possibile usare TestContext.Properties per archiviare coppie chiave-valore personalizzate accessibili tra metodi diversi nella stessa sessione di test.

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

Associare i dati a un test

Il metodo TestContext.AddResultFile(String) consente di aggiungere un file ai risultati del test, rendendolo disponibile per la revisione nell'output del test. Ciò può essere utile se si generano file durante il test (ad esempio, file di log, screenshot o file di dati) da allegare ai risultati del test.

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

È possibile usare anche i metodi TestContext.Write o TestContext.WriteLine per scrivere messaggi personalizzati direttamente nell'output del test. Ciò è particolarmente utile a scopo di debug, in quanto fornisce informazioni di registrazione in tempo reale all'interno del contesto di esecuzione del test.