SKILL.md
readonlyread-only
name
csharp-nunit
description
取得 NUnit 單元測試的最佳實務,包含資料驅動測試
NUnit 最佳實務
你的目標是協助我使用 NUnit 撰寫有效的單元測試,涵蓋標準測試與資料驅動測試方法。
專案設定
- 使用獨立的測試專案,命名慣例為
[ProjectName].Tests - 參考 Microsoft.NET.Test.Sdk、NUnit 和 NUnit3TestAdapter 套件
- 建立與被測試類別對應的測試類別(例如
Calculator對應CalculatorTests) - 使用 .NET SDK 測試命令:
dotnet test來執行測試
測試結構
- 在測試類別上套用
[TestFixture]屬性 - 測試方法使用
[Test]屬性 - 遵循 Arrange-Act-Assert (AAA) 模式
- 使用
MethodName_Scenario_ExpectedBehavior模式命名測試 - 使用
[SetUp]和[TearDown]進行每個測試的設定與清理 - 使用
[OneTimeSetUp]和[OneTimeTearDown]進行每個類別的設定與清理 - 使用
[SetUpFixture]進行組件層級的設定與清理
標準測試
- 保持測試專注於單一行為
- 避免在一個測試方法中測試多個行為
- 使用能清楚表達意圖的判斷式
- 僅包含驗證測試案例所需的判斷式
- 讓測試獨立且具冪等性(可以任意順序執行)
- 避免測試間的相依性
資料驅動測試
- 使用
[TestCase]提供內嵌測試資料 - 使用
[TestCaseSource]提供程式產生的測試資料 - 使用
[Values]提供簡單的參數組合 - 使用
[ValueSource]提供屬性或方法為基礎的資料來源 - 使用
[Random]提供隨機數值測試值 - 使用
[Range]提供連續數值測試值 - 使用
[Combinatorial]或[Pairwise]組合多個參數
判斷式
- 使用
Assert.That搭配條件約束模型(NUnit 偏好的風格) - 使用
Is.EqualTo、Is.SameAs、Contains.Item等條件約束 - 使用
Assert.AreEqual進行簡單值相等判斷(傳統風格) - 使用
CollectionAssert進行集合比較 - 使用
StringAssert進行字串專用判斷 - 使用
Assert.Throws<T>或Assert.ThrowsAsync<T>測試例外狀況 - 在判斷式中加入描述性訊息,以便失敗時清楚了解原因
模擬與隔離
- 考慮搭配 NUnit 使用 Moq 或 NSubstitute
- 模擬相依性以隔離被測試單元
- 使用介面以便於模擬
- 對於複雜的測試設定,考慮使用 DI 容器
測試組織
- 依功能或元件分組測試
- 使用
[Category("CategoryName")]分類 - 必要時使用
[Order]控制測試執行順序 - 使用
[Author("DeveloperName")]標示擁有者 - 使用
[Description]提供額外的測試資訊 - 考慮使用
[Explicit]標記不應自動執行的測試 - 使用
[Ignore("Reason")]暫時跳過測試






