TestContext sınıfı

TestContext sınıfı, test yürütmeyi yönetmeye yardımcı olmak için yararlı bilgiler ve araçlar sağlar. Test çalıştırması hakkındaki ayrıntılara erişmenize ve test ortamını ayarlamanıza olanak tanır. Bu sınıf, Microsoft.VisualStudio.TestTools.UnitTesting ad alanının bir parçasıdır.

TestContext nesnesine erişme

TestContext nesnesi aşağıdaki bağlamlarda kullanılabilir:

  • AssemblyInitializeparametresi, ClassInitialize yöntemleri olarak. Bu bağlamda, test çalıştırması ile ilgili özellikler kullanılamaz.
  • İsteğe bağlı olarak 3.6 ile başlayarak AssemblyCleanupparametresi olarak ClassCleanup yöntemlerini. Bu bağlamda, test çalıştırması ile ilgili özellikler kullanılamaz.
  • Bir test sınıfının özelliği olarak. Bu bağlamda, test çalıştırması ile ilgili özellikler kullanılabilir.
  • Bir test sınıfının oluşturucu parametresi olarak (v3.6 ile başlayarak). Özelliğin kullanılmasına kıyasla, bu yöntem önerilir çünkü oluşturucuda nesneye erişim sağlar. Oluşturucu çalıştırıldıktan sonra, özellik yalnızca o zaman kullanılabilir. Bu yöntem, nesnenin değişmezliğini sağlamaya da yardımcı olur ve derleyicinin nesnenin null olmamasını zorlamasına olanak tanır.
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
    }
}

Veya MSTest 3.6+ ile:

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 üyeleri

TestContext sınıfı, test ortamını işleme yöntemleriyle birlikte test çalıştırması hakkında özellikler sağlar. Bu bölüm en yaygın kullanılan özellikleri ve yöntemleri kapsar.

Test çalıştırma bilgileri

TestContext, test çalıştırması hakkında aşağıdakiler gibi bilgiler sağlar:

Test başına geçici dizin

Important

TestContext.TestTempDirectory MSTest 4.4 için planlanır ve MSTest 4.4.0 yayımlanana kadar yalnızca önizleme derlemelerinde kullanılabilir.

Test için TestContext.TestTempDirectory alanını özel çalışma alanı olarak kullanın. MSTest, dizini yalnızca özelliğine ilk kez eriştiğiniz zaman oluşturur ve her test yürütmesi benzersiz bir dizin alır. Paralel testlerin yolları paylaşmaması için her veri satırı kendi dizinini de alır.

string path = Path.Combine(TestContext.TestTempDirectory!, "output.json");
File.WriteAllText(path, json);

MSTest, mümkün olduğunda TestResultsDirectory altında dizini oluşturur; sonuç yolu kullanılamıyorsa, çok uzunsa veya salt okunursa sistemin geçici dizinine başvurur. MSTest, başarılı bir testten sonra dizini siler ve başarılı olmayan herhangi bir sonuçtan sonra dizini korur. Tüm sonuçlar için MSTEST_TEST_TEMP_DIRECTORY_RETAIN dizinleri korumak için ortam değişkenini 1 veya true olarak ayarlayın.

Başarılı bir test, dizinden AddResultFile bir dosya kaydettiğinde, MSTest konak ek dosyayı toplayana kadar dizini korur. Temizleme en iyi çabadır ve test sonucunu değiştirmez.

TestTempDirectory.NET ve .NET Framework hedefleri için kullanılabilir, ancak UWP veya WinUI hedeflerinde kullanılamaz. özelliği geçerli işlem dizinini değiştirmez.

MSTest 3.7 ve sonraki sürümlerde TestContext sınıfı, TestInitialize ve TestCleanup yöntemleri için yardımcı olacak yeni özellikler de sağlar:

Veri temelli testler

MSTest 3.7 ve sonraki sürümlerde TestContext.TestData özelliği, TestInitialize ve TestCleanup yöntemleri sırasında geçerli testin verilerine erişmek için kullanılabilir.

.NET çerçevesini hedeflerken, TestContextDataRow ve DataConnection gibi özellikleri kullanarak (DataSourcetabanlı testler için) veri temelli testteki her yineleme için veri almanıza ve ayarlamanıza olanak tanır.

aşağıdaki CSV dosyasını TestData.csvgöz önünde bulundurun:

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

CSV dosyasındaki verileri okumak için DataSource özniteliğini kullanabilirsiniz:

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

Çalışma zamanı verilerini depola ve al

aynı test oturumunda farklı yöntemler arasında erişilebilen özel anahtar-değer çiftlerini depolamak için TestContext.Properties kullanabilirsiniz.

MSTest 4.4 önizleme sürümünden başlayarak, özel bir anahtar mevcut olmadığında indeksleyici tutarlı olarak null döndürür.

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

Note

MSTest 4.2’den itibaren, [TestCategory] içindeki test kategorileri TestContext.Properties içine dahil edilir.

MSTest 4.3'ten itibaren, TestContext.Properties içine [AssemblyInitialize] için eklenen özel özellikler derlemedeki her sınıfa ve teste aktarılır; [ClassInitialize] içine eklenen özellikler ise o sınıftaki her teste aktarılır. Bu, fikstürlerin test yöntemlerinin okuyabileceği paylaşılan bağlamı paylaşmasına olanak tanır.

MSTest 4.3.3'ten itibaren [TestProperty] değerleri, test kategorileri, ana bilgisayar tarafından sağlanan özellikler ve bir testin eklediği özellikler yalnızca ilgili test kapsamında kalır ve kardeş testlere aktarılmaz.

Geçerli çağrı yığınından erişim TestContext

MSTest 4.2’den itibaren, TestContext.Current, test yöntemi yürütülürken çağrı yığınının herhangi bir yerinden geçerli testin TestContext değerini döndürür. Bu API deneyseldir, özniteliğini [Experimental] kullanır ve gelecekteki bir MSTest sürümünde değişebilir.

Verileri testle ilişkilendirme

TestContext.AddResultFile(String) yöntemi, test sonuçlarına bir dosya eklemenizi sağlar ve test çıkışında gözden geçirilebilir hale getirir. Test sonuçlarına eklemek istediğiniz dosyaları (günlük dosyaları, ekran görüntüleri veya veri dosyaları gibi) testiniz sırasında oluşturursanız bu yararlı olabilir.

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

Özel iletileri doğrudan test çıkışına yazmak için TestContext.Write veya TestContext.WriteLine yöntemlerini de kullanabilirsiniz. MSTest 4.4'den başlayarak, Live çıkış yakalama modu test çalışırken bu iletileri yankılar ve yine de son test sonucuna ekler. Daha fazla bilgi için bkz . MSTest çıkışını yapılandırma.

İptal belirteci

The TestContext test zaman aşımına uğradığında veya test çalıştırması durdurulduğunda işaret edilen bir CancellationToken özelliğini kullanıma sunar. Bu belirteci zaman uyumsuz işlemlere geçirmelisiniz, böylece iptale birlikte yanıt verebilirler. Bu özellikle Zaman aşımı öznitelikleri kullanılırken önemlidir.

TestContext bir özellik olarak erişildiğinde:

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

Oluşturucu aracılığıyla TestContext eklenmiştir (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);
    }
}

Tavsiye

MSTest çözümleyicisi kuralı MSTEST0049, TestContext.CancellationToken'in geçirilmesi gereken eşzamansız çağrıları tanımlamaya yardımcı olur. Ayrıca, değişikliği otomatik olarak uygulamak için bir kod düzeltici sağlar.

Aşağıdaki çözümleyiciler sınıfın TestContext düzgün kullanımını sağlamaya yardımcı olur:

  • MSTEST0005 - TestContext özelliği geçerli bir düzene sahip olmalıdır.
  • MSTEST0024 - TestContext'i statik bir üyede depolamayın.
  • MSTEST0033 - TestContext özelliği için CS8618'i bastırır.
  • MSTEST0048 - Fikstür yöntemlerinde TestContext özelliklerinden kaçının.
  • MSTEST0049 - Flow TestContext CancellationToken.
  • MSTEST0054 - CancellationToken özelliğini kullanın.