xUnit テストプロジェクトを利用してユニットテストを実装する - C#

xUnit テストプロジェクトを利用してシンプルなユニットテストを実装する手順を紹介します。

概要

.NET 5以降や.NET Core ではxUnitを利用してユニットテストのしくみを実装できます。この記事では、xUnitプロジェクトを利用して単純なユニットテストを実装する手順を紹介します。

手順

テストされるプログラムの作成

はじめにテストされるプログラムを作成します。

UI

下図のフォームを作成します。テキストボックスを3つ、ボタンを1つ配置します。

コード

下記のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace xUnitTestSimple
{
  public partial class FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      int value1 = Convert.ToInt32(textBox1.Text);
      int value2 = Convert.ToInt32(textBox2.Text);
      int value3 = calc(value1, value2);

      textBox3.Text = value3.ToString();
    }

    public int calc(int a, int b)
    {
      return a + b;
    }
  }
}

解説

テキストボックスに入力された値を数値に変換し、calc() メソッドに与えます。戻り値の数値を下部のテキストボックスに表示します。
calcメソッドは2つの引数の値を足した数値を返します。

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


上部のテキストボックスに数値を入力します。今回は "8" と "4" を入力します。入力ができたら[button1]をクリックします。


下部のテキストボックスに "12" が表示されます。入力した "8" と "4" の合計の数が表示されます。

テストプロジェクトの作成

作成したプログラムの calc メソッドをテストするxUnitのテストプロジェクトを作成します。
ソリューションへのテストプロジェクトの作成、追加はこちらの記事を参照してください。

テストプロジェクトへの参照の追加

テストプロジェクトにテストされるプロジェクトの参照を追加します。
[ソリューション エクスプローラー]のウィンドウのツリービューでテストプロジェクトのノードの子ノードの[依存関係]ノードをクリックして選択し、 右クリックします。下図のポップアップメニューが表示されますので、[プロジェクト参照の追加]の項目をクリックします。


[参照マネージャ-]のダイアログが表示されます。


左側のツリービューで[プロジェクト]の項目をクリックして選択します。右側のプロジェクトの一覧に、ソリューション内のプロジェクトの一覧が表示されます。 テストされるプロジェクトの項目の左側のチェックボックスをクリックしてチェックし選択します。チェック後、ダイアログ右下の[OK]ボタンをクリックします。


ソリューション エクスプローラーのツリービューの[依存関係]ノードの子ノードの[プロジェクト]ノードに参照したプロジェクトが追加されます。
なお、Windows Formプロジェクトを追加した場合は、アラートが表示され、エラーが発生します。対処方法はこちらの記事を参照して下さい。

テストコードの実装

テストプロジェクトのユニットテストのクラスにテストコードを実装します。
以下のコードを記述します。
using System;
using Xunit;
using xUnitTestSimple;

namespace xUnitTestSimpleTest
{
  public class UnitTest1
  {
    [Fact]
    public void Test1()
    {
      FormMain f = new FormMain();
      int result = f.calc(1, 2);

      Assert.True(result == 3, "NG");
    }
  }
}

解説

テストされるプロジェクトを参照するため using を追記し、テストされるプロジェクトの名前空間を宣言します。
Test1() メソッドにテストのロジックを実装します。
今回の例では、FormMainオブジェクトを作成し、calcメソッドを呼び出し、結果をテストパターンと比較します。 1,2 をcalcメソッドに与えているため、期待される戻り値は 3 になります。Assert.True(result == 3, "NG"); により戻り値が 3 でない場合に"NG"のメッセージとともに、テスト失敗の状態にします。

テストの実行

テストを実行します。[ソリューション エクスプローラー]でテストプロジェクトのノードを選択し、右クリックします。ポップアップニューが表示されます。 メニューの[テストの実行]の項目をクリックします。~

下図の[テスト エクスプローラー]のウィンドウが表示されます。テストが実行され、結果がウィンドウに表示されます。緑色のアイコンが表示されており、テストは成功していることが表示されています。

テストの項目を増やす

テストの項目を増やします。
課金補コードを記述し、Test2() Test3() のメソッドを追加します。
using System;
using Xunit;
using xUnitTestSimple;

namespace xUnitTestSimpleTest
{
  public class UnitTest1
  {
    [Fact]
    public void Test1()
    {
      FormMain f = new FormMain();
      int result = f.calc(1, 2);

      Assert.True(result == 3, "NG");
    }

    [Fact]
    public void Test2()
    {
      FormMain f = new FormMain();
      int result = f.calc(6, 8);

      Assert.True(result == 14, "NG");
    }

    [Fact]
    public void Test3()
    {
      FormMain f = new FormMain();
      int result = f.calc(12, 31);

      Assert.True(result == 43, "NG");
    }

  }
}


テストメソッドを追記すると[テスト エクスプローラー]のウィンドウが下図の状態になります。Test2, Test3 は未テストの状態です。


テスト エクスプローラーのウィンドウの上部のツールバーの一番左のボタン[ビュー内のすべてのテストを実行]ボタンをクリックします。


テストが実行され、すべての項目がOKの状態になりました。

バグがある場合の表示結果

続いて、プログラムにバグを作りこんで、テストが失敗する場合の動作を確認します。
テストされるプログラムのコードを下記に変更します。
calc メソッドの引数の第一引数が6の時だけ引数の値を1,000にしてしまうバグを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace xUnitTestSimple
{
  public partial class FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      int value1 = Convert.ToInt32(textBox1.Text);
      int value2 = Convert.ToInt32(textBox2.Text);
      int value3 = calc(value1, value2);

      textBox3.Text = value3.ToString();
    }

    public int calc(int a, int b)
    {
      if (a == 6) a = 1000; //バグ
      return a + b;
    }
  }
}


テストを実行します。Test2 のメソッドのテストが失敗し、×アイコンが表示されます。


xUnitを利用したテストを実装できました。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2021-08-22
作成日: 2021-08-22
iPentec all rights reserverd.