xUnit v2 簡介
核心觀念和主流的測試工具一樣,主要差在 Initialize 和 Cleanup 不同,xUnit 主要靠建構式和實作 IDisposable
來處理,而且有 IClassFixture
和 ICollectionFixture
來提供多種組合,增加了彈性。目前 v2 不支援 Assembly 層級,但是有其他套件,不想用可以等 v3。
目錄
Attribute:
各層級 Fixture 生命週期的說明
Fixture:
已知和 MSTest 的差異
主要和 MSTest 常用的寫法對比。
官方也有給詳細的差異對照表,詳細可以看 Comparing xUnit.net to other frameworks。
Method Level
xUnit | MSTest | 備註 |
---|---|---|
x | [TestClass] | xUnit 不需要這個 |
建構式 | [TestInitialize] | xUnit 認為不好追蹤和除錯測試的程式碼,詳細請看 Attribute Notes, Note 2 |
Dispose | [TestCleanup] | 原因同上,xUnit 要繼承 IDisposable |
[Fact] | [TestMethod] | 靠這個偵測測試方法 |
[Theory] | [TestMethod] | 靠這個偵測測試方法。要用類似 MSTest 的 DataRow 功能時,Fact 必須改成 Theory 。可以帶 DisplayName 在測試結果顯示此名稱 |
[InlineData] | [DataRow] | InlineData 沒有 DisplayName ,都是看 Theory 的DisplayName |
[MemberData] | [DynamicData] | MemberData 類似於 InlineData ,但是是獨立出一個必須是 public 且 static 的方法,型別使用 object。attribute 內使用 nameof (裡面參數是 string memberName) |
[ClassData] | [CustomDataSource] | ClassData 類似於 InlineData ,建一個獨立的類別,但是這個類別必須繼承 IEnumerable 。attribute 內使用 typeof |
x | [Owner] | |
x | [TestCategory] | |
x | [TestProperty] | |
x | [Timeout] |
其他注意事項
- 想要判斷陣列是否為空集合的時候,可能會想要使用
Assert.Equal(0, actual.Count());
,但是官方不建議,IDE 也會提示。建議使用Empty
(Assert.Empty(actual);
)。
Class Level
獨立出一個類別來撰寫,然後在測試的類別裡繼承 IClassFixture<T>
,變成可以同時繼承多個,和 MSTest 寫在測試方法內不同。
xUnit | MSTest | 備註 |
---|---|---|
x | [TestClass] | xUnit 不需要這個 |
建構式 | [ClassInitialize] | xUnit 認為不好追蹤和除錯測試的程式碼,詳細請看 Attribute Notes, Note 2 |
Dispose | [ClassCleanup] | 原因同上,xUnit 要繼承 IDisposable |
Assembly Level
v2 版作者不支援也不打算做,但是有給範例,請看原因。也有很多第三方套件可以用,例如 Xunit.Extensions.Ordering , Xunit.Extensions.AssemblyFixture。
v3 版作者加進去了,但是風格不同,目前是使用 attribute,而不是 IAssemblyFixture<T>
這種。
xUnit | MSTest | 備註 |
---|---|---|
x | [TestClass] | xUnit 不需要這個 |
建構式 | [AssemblyInitialize] | xUnit 認為不好追蹤和除錯測試的程式碼,詳細請看 Attribute Notes, Note 2 |
Dispose | [AssemblyCleanup] | 原因同上,xUnit 要繼承 IDisposable |
執行測試的範例:
到單元測試專案的目錄下,執行 dotnet run
。