【C#】xUnit.netの導入と基本的な単体テストの記述

目次

概要

.NET開発で広く利用されているテストフレームワーク「xUnit.net」をプロジェクトに導入し、メソッドの動作を検証する最小限のテストコードを実装します。 Visual StudioやCI/CD環境で自動実行可能なテスト環境を構築するための手順と、基本的なアサーション(検証)の書き方を解説します。

仕様(入出力)

  • 入力: テスト対象のメソッド(ロジック)、期待する結果
  • 出力: テストの合否(Pass/Fail)
  • 必要パッケージ:
    • Microsoft.NET.Test.Sdk
    • xunit
    • xunit.runner.visualstudio
    • coverlet.collector

基本の使い方

まず、テストプロジェクトのディレクトリで以下のコマンドを実行し、ライブラリをインストールします。

dotnet add package Microsoft.NET.Test.Sdk
dotnet add package xunit
dotnet add package xunit.runner.visualstudio
dotnet add package coverlet.collector

次に、テストクラスを作成して検証ロジックを記述します。

[Fact]
public void Sum_ReturnCorrectValue()
{
    // 3 + 5 が 8 になることを検証
    Assert.Equal(8, Sum(3, 5));
}

コード全文

ネームスペースやクラス名は実務でよくある構成に変更しています。

using Xunit;

namespace TechBlog.Tests
{
    public class CalculationTests
    {
        /// <summary>
        /// [Fact] 属性を付与することで、このメソッドがテストランナーによって認識・実行されます。
        /// </summary>
        [Fact]
        public void Sum_TwoNumbers_ReturnsCorrectTotal()
        {
            // Arrange(準備)
            int value1 = 10;
            int value2 = 20;
            int expected = 30;

            // Act(実行)
            // テスト対象のメソッドを呼び出します
            int actual = Sum(value1, value2);

            // Assert(検証)
            // 期待値(expected)と実測値(actual)が等しいか確認します
            Assert.Equal(expected, actual);
        }

        // テスト対象のロジック
        // 通常は別プロジェクトのクラスを参照しますが、ここでは簡略化のため同居させています
        private int Sum(int a, int b)
        {
            return a + b;
        }
    }
}

カスタムポイント

  • テストメソッドの命名: メソッド名は「テスト対象メソッド名_条件_期待する結果」という形式(例: Sum_NegativeNumbers_ReturnsZero)にすると、テスト一覧を見ただけで内容が把握しやすくなります。
  • データ駆動テスト: [Fact] の代わりに [Theory][InlineData] を使用することで、異なる引数のパターンを一度にテストできます。
  • 非同期メソッドのテスト: public async Task TestName() のように戻り値を Task にすることで、await を含む非同期処理のテストが可能になります。

注意点

  1. アクセス修飾子: xUnitのテストクラスおよびテストメソッドは public である必要があります。internalprivate ではテストランナーが検知できません。
  2. Assertの引数順序: Assert.Equal は第一引数に「期待する値(Expected)」、第二引数に「実際の値(Actual)」を渡すのが慣例です。順序が逆でも判定は正しいですが、失敗時のエラーメッセージ(”Expected: X, Actual: Y”)が逆になり混乱を招きます。
  3. パッケージの更新: xunit.runner.visualstudio が古いと、Visual Studioのテストエクスプローラーにテストが表示されない場合があります。常に新しいバージョンを利用するようにしてください。

応用

複数の入力パターンをまとめて検証する

[Theory] を使用して、境界値や異常値を含む複数のケースを1つのメソッドで定義する例です。

[Theory]
[InlineData(1, 2, 3)]
[InlineData(100, 200, 300)]
[InlineData(-5, 5, 0)]
public void Sum_MultipleInputs_ReturnsCorrectTotal(int a, int b, int expected)
{
    var result = Sum(a, b);
    Assert.Equal(expected, result);
}

まとめ

xUnit.netの導入はNuGetパッケージを追加するだけで完了します。テストコードは [Fact] 属性を付けたメソッド内に記述し、Assert クラスを使って期待値との比較を行います。まずは単純なロジックの検証から始め、徐々にパラメータ化テスト(Theory)などの機能を活用してテスト網羅率を高めていく運用が適しています。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次