A TestContext osztály

A TestContext osztály hasznos információkat és eszközöket biztosít a tesztvégrehajtás kezeléséhez. Lehetővé teszi a tesztfuttatás részleteinek elérését és a tesztkörnyezet módosítását. Ez az osztály a Microsoft.VisualStudio.TestTools.UnitTesting névtér része.

Az TestContext objektum elérése

A TestContext objektum a következő környezetekben érhető el:

  • Az AssemblyInitialize paramétereként a ClassInitialize metódusokat. Ebben az összefüggésben a tesztfuttatáshoz kapcsolódó tulajdonságok nem érhetők el.
  • A 3.6-os értéktől kezdődően, opcionálisan, a AssemblyCleanup paramétereként a ClassCleanup metódusokat. Ebben az összefüggésben a tesztfuttatáshoz kapcsolódó tulajdonságok nem érhetők el.
  • Egy tesztosztály tulajdonságaként. Ebben az összefüggésben a tesztfuttatáshoz kapcsolódó tulajdonságok elérhetők.
  • Egy tesztosztály konstruktorparamétereként (a 3.6-os verziótól kezdve). Ez a módszer ajánlott a tulajdonság használata során, mivel hozzáférést biztosít az objektumhoz a konstruktorban. Habár a tulajdonság csak a konstruktor lefutása után érhető el. Így biztosítható az objektum nem módosíthatósága, és lehetővé teszi, hogy a fordító kikényszerítse, hogy az objektum ne null értékű legyen.
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
    }
}

Vagy az MSTest 3.6+-os verziójával:

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

TestContext tagok

A TestContext osztály tulajdonságokat biztosít a tesztfuttatásról, valamint a tesztkörnyezet manipulálására használható módszereket. Ez a szakasz a leggyakrabban használt tulajdonságokat és metódusokat ismerteti.

Tesztfuttatási információk

A TestContext információt nyújt a tesztfuttatásról, például:

Az MSTest 3.7-ben és újabb verzióiban a TestContext osztály az TestInitialize és TestCleanup metódusokhoz is hasznos új tulajdonságokat biztosít:

  • TestContext.TestData – a paraméteres tesztmetódushoz megadott adatok, vagy null, ha a teszt nincs paraméterezve.
  • TestContext.TestDisplayName – a vizsgálati módszer megjelenítendő neve.
  • TestContext.TestException – a vizsgálati módszer vagy a teszt inicializálása által okozott kivétel, vagy null, ha a vizsgálati módszer nem adott kivételt.

Adatvezérelt tesztek

Az MSTest 3.7-es és újabb verzióiban a tulajdonság TestContext.TestData használható az aktuális teszt adatainak elérésére TestInitialize és TestCleanup metódusok során.

A .NET-keretrendszer megcélzásakor a TestContext lehetővé teszi az adatok lekérését és beállítását az egyes iterációkhoz egy adatvezérelt tesztben, olyan tulajdonságok használatával, mint a DataRow és a DataConnection (DataSource-alapú tesztekhez).

Fontolja meg a következő CSV-fájl TestData.csv:

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

Az DataSource attribútummal beolvashatja az adatokat a CSV-fájlból:

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

Futtatókörnyezeti adatok tárolása és lekérése

A TestContext.Properties használhatja az egyéni kulcs-érték párok tárolására, amelyek ugyanabban a tesztelési munkamenetben különböző metódusok között érhetők el.

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

Adatok társítása teszthez

A TestContext.AddResultFile(String) metódus lehetővé teszi egy fájl hozzáadását a teszteredményekhez, így az megtekinthető a teszt kimenetében. Ez akkor lehet hasznos, ha a teszt során olyan fájlokat hoz létre (például naplófájlokat, képernyőképeket vagy adatfájlokat), amelyeket a teszt eredményeihez szeretne csatolni.

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

Az egyéni üzenetek közvetlenül a tesztkimenetbe való írásához TestContext.Write vagy TestContext.WriteLine metódusokat is használhat. Ez különösen hasznos hibakeresési célokra, mivel valós idejű naplózási információkat biztosít a tesztvégrehajtási környezetben.

Lemondási jogkivonat

A TestContext rendszer egy olyan tulajdonságot CancellationToken tesz elérhetővé, amely akkor lesz jelezve, ha a teszt túllépi az időkorlátot vagy megszakítja a tesztfuttatást. Ezt a jogkivonatot át kell adnia az aszinkron műveleteknek, hogy azok együttműködve válaszoljanak a lemondásra. Ez különösen fontos időtúllépési attribútumok használatakor.

Mikor TestContext érhető el tulajdonságként:

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

Amikor TestContext a konstruktoron át van injektálva (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);
    }
}

Jótanács

Az MSTest-elemző szabály MSTEST0049 segít azonosítani az aszinkron hívásokat, ahol TestContext.CancellationToken át kell adni. Emellett egy kódjavítót is biztosít a módosítás automatikus alkalmazásához.

Az alábbi elemzők segítenek biztosítani az TestContext osztály megfelelő használatát:

  • MSTEST0005 – A TestContext tulajdonságnak érvényes elrendezéssel kell rendelkeznie.
  • MSTEST0024 – Ne tárolja a TestContextet statikus tagban.
  • MSTEST0033 – Elnyomja a CS8618-at a TestContext tulajdonság vonatkozásában.
  • MSTEST0048 – A TestContext tulajdonságainak elkerülése a rögzítési módszerekben.
  • MSTEST0049 – Flow TestContext CancellationToken.
  • MSTEST0054 – A CancellationToken tulajdonság használata.