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
提供測試回合的相關信息,例如:
- TestName – 目前執行中測試的名稱。
- CurrentTestOutcome - 目前測試結果。
- FullyQualifiedTestClassName - 測試類別的完整名稱。
- TestRunDirectory - 執行測試回合的目錄。
- DeploymentDirectory - 部署專案所在的目錄。
-
ResultsDirectory - 儲存測試結果的目錄。 通常是
TestRunDirectory
的子目錄。 -
TestRunResultsDirectory - 儲存測試結果的目錄。 通常是
ResultsDirectory
的子目錄。 -
TestResultsDirectory - 儲存測試結果的目錄。 通常是
ResultsDirectory
的子目錄。
在 MSTest 3.7 和更新版本中,TestContext
類別也提供有助於 TestInitialize
和 TestCleanup
方法的新屬性:
-
TestContext.TestData
是提供給參數化測試方法的數據,如果測試未參數化,則使用null
。 -
TestContext.TestDisplayName
- 測試方法的顯示名稱。 -
TestContext.TestException
- 測試方法或測試初始化所擲回的例外狀況,如果測試方法未擲回例外狀況,則為null
。
數據驅動測試
在 MSTest 3.7 和更新版本中,屬性 TestData
可用來存取 TestInitialize
和 TestCleanup
方法期間目前測試的數據。
以 .NET Framework 為目標時,TestContext
可讓您使用 DataRow
和 DataConnection
等屬性,擷取和設定資料驅動測試中每次迭代的資料(適用於 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.Write
或 TestContext.WriteLine
方法來直接將自定義訊息寫入測試輸出。 這對於偵錯用途特別有用,因為它會在測試執行內容中提供實時記錄資訊。