csharp-tunit について
csharp-tunitは、.NETプロジェクトでTUnitのユニットテストを書くためのスキルです。テスト構成、アサーション、データ駆動テスト、ライフサイクルフック、xUnitからの移行を扱います。
主な機能
- 01AAAテスト構成
- 02非同期の流暢なアサーション
- 03データ駆動テストのパターン
- 04ライフサイクルと実行制御
- 05xUnit移行ガイド
活用シーン
- 01焦点を絞ったTUnitユニットテストの作成
- 02インラインまたはメソッド形式のテストデータ追加
- 03セットアップと後処理フックの管理
- 04xUnitテストのTUnitへの移行
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ github/ awesome-copilot --skill csharp-tunitインストール後、Claude Code で/csharp-tunitを入力して読み込まれたか確認します。
詳細
TUnit ベストプラクティス
あなたの目標は、標準的なテストとデータ駆動型テストの両方のアプローチをカバーし、TUnit で効果的な単体テストを書く手助けをすることです。
プロジェクトのセットアップ
[ProjectName].Testsという命名規則で別のテストプロジェクトを使用する- 流暢なアサーションのために TUnit パッケージと TUnit.Assertions を参照する
- テスト対象のクラスに対応するテストクラスを作成する (例:
Calculatorに対するCalculatorTests) - .NET SDK のテストコマンドを使用する: テストの実行には
dotnet test - TUnit には .NET 8.0 以上が必要です
テスト構造
- テストクラスの属性は不要です (xUnit/NUnit のような)
- テストメソッドには
[Test]属性を使用する (xUnit の[Fact]ではありません) - Arrange-Act-Assert (AAA) パターンに従う
- テストの命名には
MethodName_Scenario_ExpectedBehaviorというパターンを使用する - ライフサイクルフックを使用する: セットアップには
[Before(Test)]、ティアダウンには[After(Test)] - クラス内のテスト間で共有するコンテキストには
[Before(Class)]と[After(Class)]を使用する - テストクラス間で共有するコンテキストには
[Before(Assembly)]と[After(Assembly)]を使用する - TUnit は
[Before(TestSession)]や[After(TestSession)]のような高度なライフサイクルフックをサポートしています
標準的なテスト
- テストは単一の振る舞いに集中させる
- 1 つのテストメソッドで複数の振る舞いをテストすることは避ける
await Assert.That()を使った TUnit の流暢なアサーション構文を使用する- テストケースを検証するために必要なアサーションのみを含める
- テストを独立させ、冪等にする (どの順序でも実行可能)
- テスト間の相互依存を避ける (必要な場合は
[DependsOn]属性を使用する)
データ駆動型テスト
- インラインのテストデータには
[Arguments]属性を使用する (xUnit の[InlineData]に相当) - メソッドベースのテストデータには
[MethodData]を使用する (xUnit の[MemberData]に相当) - クラスベースのテストデータには
[ClassData]を使用する ITestDataSourceを実装してカスタムデータソースを作成する- データ駆動型テストでは意味のあるパラメーター名を使用する
- 複数の
[Arguments]属性を同じテストメソッドに適用できます
アサーション
- 値の等価性には
await Assert.That(value).IsEqualTo(expected)を使用する - 参照の等価性には
await Assert.That(value).IsSameReferenceAs(expected)を使用する - ブール条件には
await Assert.That(value).IsTrue()またはawait Assert.That(value).IsFalse()を使用する - コレクションには
await Assert.That(collection).Contains(item)またはawait Assert.That(collection).DoesNotContain(item)を使用する - 正規表現パターンマッチングには
await Assert.That(value).Matches(pattern)を使用する - 例外をテストするには
await Assert.That(action).Throws<TException>()またはawait Assert.That(asyncAction).ThrowsAsync<TException>()を使用する .And演算子でアサーションを連結する:await Assert.That(value).IsNotNull().And.IsEqualTo(expected)- 代替条件には
.Or演算子を使用する:await Assert.That(value).IsEqualTo(1).Or.IsEqualTo(2) - 許容範囲を伴う DateTime と数値の比較には
.Within(tolerance)を使用する - すべてのアサーションは非同期であり、await する必要があります
高度な機能
- テストを複数回繰り返すには
[Repeat(n)]を使用する - 失敗時の自動リトライには
[Retry(n)]を使用する - 並列実行の制限を制御するには
[ParallelLimit<T>]を使用する - 条件付きでテストをスキップするには
[Skip("reason")]を使用する - テストの依存関係を作成するには
[DependsOn(nameof(OtherTest))]を使用する - テストのタイムアウトを設定するには
[Timeout(milliseconds)]を使用する - TUnit の基本属性を拡張してカスタム属性を作成する
テストの整理
- 機能またはコンポーネントごとにテストをグループ化する
- テストのカテゴリ分けには
[Category("CategoryName")]を使用する - カスタムテスト名には
[DisplayName("Custom Test Name")]を使用する - テストの診断と情報のために
TestContextの使用を検討する - プラットフォーム固有のテストにはカスタムの
[WindowsOnly]のような条件付き属性を使用する
パフォーマンスと並列実行
- TUnit はデフォルトでテストを並列実行します(明示的な設定が必要な xUnit とは異なります)
- 特定のテストで並列実行を無効にするには
[NotInParallel]を使用します - カスタムの制限クラスとともに
[ParallelLimit<T>]を使用して、同時実行数を制御します - 同じクラス内のテストはデフォルトで順次実行されます
- 負荷テストのシナリオでは、
[ParallelLimit<T>]とともに[Repeat(n)]を使用します
xUnit からの移行
[Fact]を[Test]に置き換えます[Theory]を[Test]に置き換え、データには[Arguments]を使用します[InlineData]を[Arguments]に置き換えます[MemberData]を[MethodData]に置き換えますAssert.Equalをawait Assert.That(actual).IsEqualTo(expected)に置き換えますAssert.Trueをawait Assert.That(condition).IsTrue()に置き換えますAssert.Throws<T>をawait Assert.That(action).Throws<T>()に置き換えます- コンストラクター/IDisposable を
[Before(Test)]/[After(Test)]に置き換えます IClassFixture<T>を[Before(Class)]/[After(Class)]に置き換えます
xUnit ではなく TUnit を選ぶ理由
TUnit は、モダンで高速、かつ柔軟なテスト体験を提供し、非同期アサーション、より洗練されたライフサイクルフック、改善されたデータ駆動型テスト機能など、xUnit にはない高度な機能を備えています。TUnit の流暢なアサーションは、より明確で表現力豊かなテスト検証を提供し、複雑な .NET プロジェクトに特に適しています。
コメント
Markdown 対応