共用方式為


TestContext 類別

TestContext 類別提供實用的資訊和工具,以協助管理測試執行。 它可讓您存取測試回合的詳細數據,並調整測試環境。 這個類別是 Microsoft.VisualStudio.TestTools.UnitTesting 命名空間的一部分。

存取 TestContext 物件

TestContext 物件可在下列內容中使用:

  • 做為 [AssemblyInitialize][ClassInitialize] 方法的參數。 在此內容中,無法使用與測試回合相關的屬性。
  • 作為測試類別的屬性。 在這個情境中,可以取得與測試執行相關的屬性。
  • 作為測試類別的建構函式參數(從 v3.6 開始)。 建議使用這種方式而非屬性,因為它可以在建構函式中提供對物件的存取權。 屬性只有在建構函式執行之後才能使用。 如此一來,也有助於確保物件的不變性,並允許編譯程式強制物件不是 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
    }
}

或者使用 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
    }
}

TestContext 成員

TestContext 類別提供測試回合的相關屬性,以及操作測試環境的方法。 本節涵蓋最常用的屬性和方法。

測試運行資訊

TestContext 提供測試回合的相關信息,例如:

在 MSTest 3.7 和更新版本中,TestContext 類別也提供有助於 TestInitializeTestCleanup 方法的新屬性:

  • TestContext.TestData 是提供給參數化測試方法的數據,如果測試未參數化,則使用 null
  • TestContext.TestDisplayName - 測試方法的顯示名稱。
  • TestContext.TestException - 測試方法或測試初始化所擲回的例外狀況,如果測試方法未擲回例外狀況,則為 null

數據驅動測試

在 MSTest 3.7 和更新版本中,屬性 TestData 可用來存取 TestInitializeTestCleanup 方法期間目前測試的數據。

以 .NET Framework 為目標時,TestContext 可讓您使用 DataRowDataConnection 等屬性,擷取和設定資料驅動測試中每次迭代的資料(適用於 DataSource型測試)。

請考慮下列 CSV 檔案 TestData.csv

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

您可以使用 DataSource 屬性從 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));
        }
    }
}

儲存和擷取運行時間數據

您可以使用 TestContext.Properties 來儲存可在相同測試工作階段中跨不同方法存取的自訂索引鍵/值組。

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

將數據關聯至測試

TestContext.AddResultFile(String) 方法可讓您將檔案新增至測試結果,使其可在測試輸出中檢閱。 如果您在測試期間產生檔案(例如記錄檔、螢幕快照或數據檔),而您想要附加至測試結果,這非常有用。

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

您也可以使用 TestContext.WriteTestContext.WriteLine 方法來直接將自定義訊息寫入測試輸出。 這對於偵錯用途特別有用,因為它會在測試執行內容中提供實時記錄資訊。