本文へスキップ
BecomeCoder

C#デザインパターンコース · 第2章 TDD ― テスト駆動開発 · レッスン15

xUnitの記法

ブラウザで完結

導入

実務では自作Assertではなく、xUnit(またはNUnit/MSTest)というテストフレームワークを使います。Visual StudioやCI(自動ビルド)と統合され、テストの一覧・実行・集計を自動化します。記法を読めるようにしましょう。

図解

flowchart LR
    T["[Fact] メソッド<br/>1つのテストケース"] --> RUN["dotnet test"]
    RUN --> RES["緑(成功) / 赤(失敗)を集計"]

サンプル

xUnitの実際の記法は次の形です(ローカルのVisual Studioでdotnet testにより実行します)。テストクラスは実装とは別ファイル(CalculatorTests.cs)に置くのが基本です。

// --- xUnit のテストコード(読み物/別ファイル CalculatorTests.cs に置く) ---
// using Xunit;
//
// public class CalculatorTests
// {
//     [Fact]                              // [Fact] = 1つのテストケース
//     public void Add_2と3_5になる()
//     {
//         var result = Calculator.Add(2, 3);
//         Assert.Equal(5, result);        // 期待値, 実際の値
//     }
//
//     [Theory]                            // [Theory] = 複数データで同じテスト
//     [InlineData(2, 3, 5)]
//     [InlineData(-1, 1, 0)]
//     public void Add_複数パターン(int a, int b, int expected)
//     {
//         Assert.Equal(expected, Calculator.Add(a, b));
//     }
// }

ブラウザではこの考え方を素のAssertで再現します。ファイルの分け方は実務と同じで、実装(Calculator.cs)とテスト(Program.cs)に分けています。

public static class Calculator
{
    public static int Add(int a, int b) => a + b;
}
Assert(Calculator.Add(2, 3) == 5, "2+3=5");
Console.WriteLine("OK");

void Assert(bool c, string n) { if (!c) throw new Exception($"FAIL: {n}"); }
  • [Fact]は1つのテストケース、[Theory]+[InlineData]は複数データでの反復テスト
  • Assert.Equal(期待値, 実際の値)で検証する
  • ローカルではdotnet new xunitでテストプロジェクトを作りdotnet testで一括実行する
  • テストは実装と別ファイル・別プロジェクトに置き、実装だけを製品に含める

演習

// xUnitの Assert.Equal に相当する検証を素のC#で
Assert(Max(3, 8) == 8, "max(3,8)=8");
Console.WriteLine("OK");

// TODO: 2つのうち大きい方を返す Max を実装し、テストを通してください
void Assert(bool c, string n) { if (!c) throw new Exception($"FAIL: {n}"); }
___
  • 期待される出力: OK
ヒント1を見る

int Max(int a, int b) => a > b ? a : b;

ヒント2を見る

三項演算子で大きい方を返します

まとめ

  • xUnitは[Fact]/[Theory]でテストを書くフレームワーク
  • Assert.Equal(期待, 実際)で検証
  • ローカルではdotnet testで一括実行する

次回: 仕様変更に強いことを体感するTDD実践です。

実際に動かしてみよう

このレッスンのサンプルは、実務と同じように役割ごとの .cs ファイルへ分けてあります。下のエディタは最初からその複数ファイルが入った状態で、上のタブでファイルを切り替えられます。そのまま「▶ 実行」を押せば全ファイルをまとめてコンパイルして動かせるので、クラスを足したりファイルをまたいで書き換えたりしながら進めましょう(演習は本文のコードをコピーして Program.cs のタブに貼り付ければ試せます)。

C# — ブラウザ内で実行

ブラウザ内でC#を動かす環境を読み込みます(初回のみ数秒)。
スクロールして表示された時点でも自動で読み込まれます。

次のレッスンへ →