Kelas TestContext

Kelas TestContext memberikan informasi dan alat yang berguna untuk membantu mengelola eksekusi pengujian. Ini memungkinkan Anda mengakses detail tentang uji coba dan menyesuaikan lingkungan pengujian. Kelas ini adalah bagian dari namespace Microsoft.VisualStudio.TestTools.UnitTesting.

Mengakses objek TestContext

Objek TestContext tersedia dalam konteks berikut:

  • Sebagai parameter untuk AssemblyInitialize, metode ClassInitialize. Dalam konteks ini, properti yang terkait dengan uji coba tidak tersedia.
  • Dimulai dengan 3.6, secara opsional sebagai parameter untuk AssemblyCleanup, terdapat metode ClassCleanup. Dalam konteks ini, properti yang terkait dengan uji coba tidak tersedia.
  • Sebagai properti dari kelas pengujian. Dalam konteks ini, properti yang terkait dengan pelaksanaan tes tersedia.
  • Sebagai parameter konstruktor dari kelas pengujian (dimulai dengan v3.6). Cara ini direkomendasikan dibandingkan menggunakan properti, karena memberikan akses ke objek dalam konstruktor. Sementara properti hanya tersedia setelah konstruktor berjalan. Cara ini juga membantu memastikan kekekalan objek dan memungkinkan pengkompilasi untuk menegakkan bahwa objek tidak 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
    }
}

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

Anggota TestContext

Kelas TestContext menyediakan properti tentang uji coba bersama dengan metode untuk memanipulasi lingkungan pengujian. Bagian ini mencakup properti dan metode yang paling umum digunakan.

Informasi uji coba

TestContext menyediakan informasi tentang uji coba, seperti:

Direktori sementara per pengujian

Important

TestContext.TestTempDirectory direncanakan untuk MSTest 4.4 dan hanya tersedia dalam build pratinjau hingga MSTest 4.4.0 dirilis.

Gunakan TestContext.TestTempDirectory sebagai ruang coretan privat untuk pengujian. MSTest membuat direktori hanya ketika Anda pertama kali mengakses properti, dan setiap eksekusi pengujian menerima direktori unik. Setiap baris data juga menerima direktorinya sendiri, sehingga pengujian paralel tidak berbagi jalur.

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

MSTest membuat direktori di bawah TestResultsDirectory jika memungkinkan dan kembali ke direktori sementara sistem ketika jalur hasil tidak tersedia, terlalu panjang, atau baca-saja. MSTest menghapus direktori setelah pengujian yang lulus dan tetap menyimpan direktori tersebut setelah hasil apa pun selain lulus. Atur MSTEST_TEST_TEMP_DIRECTORY_RETAIN variabel lingkungan ke 1 atau true untuk mempertahankan direktori untuk semua hasil.

Ketika pengujian yang lulus mendaftarkan file dari direktori dengan AddResultFile, MSTest mempertahankan direktori tersebut sampai host mengambil lampiran tersebut. Pembersihan adalah upaya terbaik dan tidak mengubah hasil pengujian.

TestTempDirectorytersedia untuk target .NET dan .NET Framework, tetapi tidak untuk target UWP atau WinUI. Properti tidak mengubah direktori proses saat ini.

Di MSTest 3.7 dan yang lebih baru, kelas TestContext juga menyediakan properti baru yang berguna untuk metode TestInitialize dan TestCleanup:

  • TestContext.TestData - data yang akan diberikan ke metode pengujian berparameter, atau null jika pengujian tidak diparameterkan.
  • TestContext.TestDisplayName - nama tampilan metode pengujian.
  • TestContext.TestException - pengecualian yang dilemparkan oleh metode pengujian atau pengujian diinisialisasi, atau null jika metode pengujian tidak melemparkan pengecualian.

Pengujian berbasis data

Di MSTest 3.7 dan yang lebih baru, properti TestContext.TestData dapat digunakan untuk mengakses data untuk pengujian saat ini selama metode TestInitialize dan TestCleanup.

Saat menargetkan .NET framework, TestContext memungkinkan Anda mengambil dan mengatur data untuk setiap iterasi dalam pengujian berbasis data, menggunakan properti seperti DataRow dan DataConnection (untuk pengujian berbasis DataSource).

Pertimbangkan file CSV berikut TestData.csv:

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

Anda dapat menggunakan atribut DataSource untuk membaca data dari 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));
        }
    }
}

Menyimpan dan mengambil data runtime

Anda dapat menggunakan TestContext.Properties untuk menyimpan pasangan kunci-nilai kustom yang dapat diakses di berbagai metode dalam sesi pengujian yang sama.

Dimulai dengan pratinjau MSTest 4.4, pengindeks secara konsisten mengembalikan null ketika kunci kustom tidak ada.

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

Note

Dimulai dengan MSTest 4.2, kategori pengujian dari [TestCategory] disertakan dalam TestContext.Properties.

Mulai MSTest 4.3, properti kustom yang ditambahkan ke TestContext.Properties dalam [AssemblyInitialize] berlaku untuk setiap kelas dan pengujian dalam assembly, dan properti yang ditambahkan dalam [ClassInitialize] berlaku untuk setiap pengujian di kelas tersebut. Ini memungkinkan fixture membagikan konteks bersama yang dapat dibaca oleh metode pengujian.

Dimulai dengan MSTest 4.3.3, nilai [TestProperty], kategori pengujian, properti yang disediakan host, dan properti yang ditambahkan oleh pengujian tetap dibatasi pada pengujian tersebut dan tidak diteruskan ke pengujian saudara.

Akses TestContext dari tumpukan panggilan saat ini

Mulai MSTest 4.2, TestContext.Current mengembalikan TestContext dari pengujian saat ini dari mana pun dalam tumpukan panggilan selama eksekusi metode pengujian. API ini bersifat eksperimental, menggunakan [Experimental] atribut , dan mungkin berubah dalam versi MSTest di masa mendatang.

Mengaitkan data ke pengujian

Metode TestContext.AddResultFile(String) memungkinkan Anda menambahkan file ke hasil pengujian, membuatnya tersedia untuk ditinjau dalam output pengujian. Ini dapat berguna jika Anda membuat file selama pengujian (misalnya, file log, cuplikan layar, atau file data) yang ingin Anda lampirkan ke hasil pengujian.

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

Anda juga dapat menggunakan metode TestContext.Write atau TestContext.WriteLine untuk menulis pesan kustom langsung ke output pengujian. Mulai dari MSTest 4.4, mode pengambilan output Live menampilkan kembali pesan-pesan ini saat pengujian berlangsung dan tetap melampirkannya pada hasil akhir pengujian. Untuk informasi selengkapnya, lihat Mengonfigurasi output MSTest.

Token pembatalan

TestContext mengekspos properti CancellationToken yang ditandai ketika waktu pengujian habis atau eksekusi pengujian dibatalkan. Anda harus meneruskan token ini ke operasi asinkron sehingga mereka dapat merespons pembatalan secara kooperatif. Ini sangat penting saat menggunakan atribut Timeout .

Kapan TestContext diakses sebagai properti:

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

Ketika TestContext disuntikkan melalui konstruktor (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);
    }
}

Petunjuk / Saran

Aturan penganalisis MSTest MSTEST0049 membantu mengidentifikasi panggilan asinkron tempat TestContext.CancellationToken harus diteruskan. Ini juga menyediakan perbaikan kode untuk menerapkan perubahan secara otomatis.

Penganalisis berikut membantu memastikan penggunaan kelas yang TestContext tepat:

  • MSTEST0005 - Properti TestContext harus memiliki tata letak yang valid.
  • MSTEST0024 - Jangan simpan TestContext dalam anggota statis.
  • MSTEST0033 - Menekan peringatan CS8618 untuk properti TestContext.
  • MSTEST0048 - Hindari properti TestContext dalam metode pengaturan.
  • MSTEST0049 - Flow TestContext CancellationToken.
  • MSTEST0054 - Gunakan properti CancellationToken.