SKILL.md
readonlyread-only
name
csharp-xunit
description
取得 XUnit 單元測試的最佳實務,包括資料驅動測試
XUnit 最佳實務
您的目標是協助我使用 XUnit 撰寫有效的單元測試,涵蓋標準測試與資料驅動測試方法。
專案設定
- 使用獨立的測試專案,命名慣例為
[ProjectName].Tests - 參考 Microsoft.NET.Test.Sdk、xunit 和 xunit.runner.visualstudio 套件
- 建立與被測試類別對應的測試類別(例如
Calculator對應CalculatorTests) - 使用 .NET SDK 測試命令:
dotnet test執行測試
測試結構
- 不需要測試類別屬性(與 MSTest/NUnit 不同)
- 使用
[Fact]屬性進行簡單測試 - 遵循 Arrange-Act-Assert (AAA) 模式
- 使用
MethodName_Scenario_ExpectedBehavior模式命名測試 - 使用建構函式進行設定,使用
IDisposable.Dispose()進行清除 - 使用
IClassFixture<T>在單一測試類別內共用上下文 - 使用
ICollectionFixture<T>在多個測試類別間共用上下文
標準測試
- 測試應專注於單一行為
- 避免在一個測試方法中測試多個行為
- 使用能清楚表達意圖的斷言
- 僅包含驗證測試案例所需的斷言
- 測試應獨立且冪等(可任意順序執行)
- 避免測試間的相依性
資料驅動測試
- 使用
[Theory]搭配資料來源屬性 - 使用
[InlineData]提供內聯測試資料 - 使用
[MemberData]提供方法為基礎的測試資料 - 使用
[ClassData]提供類別為基礎的測試資料 - 實作
DataAttribute建立自訂資料屬性 - 在資料驅動測試中使用有意義的參數名稱
斷言
- 使用
Assert.Equal檢查值相等 - 使用
Assert.Same檢查參考相等 - 使用
Assert.True/Assert.False檢查布林條件 - 使用
Assert.Contains/Assert.DoesNotContain檢查集合 - 使用
Assert.Matches/Assert.DoesNotMatch檢查正規表示式模式 - 使用
Assert.Throws<T>或await Assert.ThrowsAsync<T>測試例外 - 使用 Fluent Assertions 函式庫讓斷言更具可讀性
Mock 與隔離
- 考慮搭配 XUnit 使用 Moq 或 NSubstitute
- Mock 相依性以隔離受測單元
- 使用介面以便於 Mock
- 考慮對複雜測試設定使用 DI 容器
測試組織
- 依功能或元件分組測試
- 使用
[Trait("Category", "CategoryName")]進行分類 - 使用集合固定裝置將共用相依性的測試分組
- 考慮使用輸出協助程式(
ITestOutputHelper)進行測試診斷 - 使用
Skip = "reason"在 Fact/Theory 屬性中有條件地跳過測試






