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:
- TestName: nome del test attualmente in esecuzione.
- CurrentTestOutcome : il risultato del test corrente.
- FullyQualifiedTestClassName: nome completo della classe di test.
- TestRunDirectory: directory in cui viene eseguita l'esecuzione del test.
- DeploymentDirectory: directory in cui si trovano gli elementi di distribuzione.
-
ResultsDirectory: directory in cui vengono archiviati i risultati del test. In genere una sottodirectory del
TestRunDirectory
. -
TestRunResultsDirectory: directory in cui vengono archiviati i risultati del test. In genere una sottodirectory del
ResultsDirectory
. -
TestResultsDirectory: directory in cui vengono archiviati i risultati del test. In genere una sottodirectory del
ResultsDirectory
.
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 onull
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 oppurenull
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.