コンテンツへスキップ
NUnit を使用した .NET 単体テストの概要

NUnit を使用した .NET 単体テストの概要

通常、コードの開発中に自動単体テストを行うことをお勧めします。これにより、開発サイクルの早い段階でバグを見つけ、長期的には時間を節約できます。

9min read

コードの開発中に自動化された単体テストは、良い習慣と見なされます。これにより、開発サイクルの早い段階でバグを見つけ、長期的には時間を節約できます。開発者は、これらのテストを複数回実行して、さまざまな入力セットに対する特定のコード単位の動作を検証できます。

ユニットテストは基本的に、コードまたは関数の特定のユニットの動作をチェックし、機能を実装している開発者によって記述されます。

Unit Testing

関数がシステム全体の一部になり、さまざまな条件下でこの動作をテストするコードを書くことで、関数の動作をテストします。通常、関数はテスト対象システム (SUT) の他の関数と分離してテストされます。

.NET では、単体テストを記述するための 2 つのオプションがあります。

  1. MS テストの使用
  2. Using NUnit

この記事では、NUnit を使用して C# クラスの単体テストを開始する方法を学習します。以下について説明します。

  • テスト対象システムの作成
  • Setting up NUnit
  • テストプロジェクトの作成
  • Test クラスとメソッドの作成
  • テストを実行するためのさまざまなオプション
  • Understanding TestFixtures and TestTearDown
  • Ignore テストの操作

System Under Test

この例では、電卓システムのユニットテストを作成します。電卓のインターフェースが以下のリストに示すように定義されているとします。

namespace Calculator
{
   public interface ICalculator
    {
       int Add(int num1, int num2);
       int Mul(int num1, int num2);
    }
}

Calculator クラスは、次のリストに示すように実装されます。

namespace Calculator
{
  public class Calculator :ICalculator
    {
 
        public int Add(int num1, int num2)
        {
            int result = num1 + num2;
            return result;
        }
 
        public int Mul(int num1, int num2)
        {
            int result = num1 + num2;
            return result;
        }
    }
}

Mul関数を意図的に誤って実装したことに気付くでしょう。

NUnit の操作とテストの作成を開始するには、次の手順に従う必要があります。

  1. テスト プロジェクトを作成する
  2. NUnit ライブラリへの参照を追加する
  3. テスト対象システムプロジェクトへの参照を追加します
  4. テストクラスを作成し、テストメソッドを書く

テストプロジェクトの設定

テスト プロジェクトを作成するには、次の一覧に示すように、クラス ライブラリ プロジェクトを追加します。通常、命名規則に従って、テスト プロジェクトに ProjectUnderTest.Test という名前を付けます。ここでは Calculator プロジェクトをテストするため、テスト プロジェクトの名前はCalculator.Testにする必要があります。

テストプロジェクトの設定

Test プロジェクトが作成されたら、プロジェクトに NUnit への参照を追加する 2 つのオプションがあります。

  1. 拡張機能と更新プログラムの使用
  2. NuGet パッケージの使用

拡張機能と更新プログラムを使用するには、[Tool->Extension and Updates] をクリックし、[NUnit Test Adapter] を選択します。

NuGet パッケージを操作するには、プロジェクトを右クリックし、コンテキスト メニューから [NuGet パッケージの管理] オプションを選択します。NuGet パッケージ マネージャーで NUnit を検索し、次の図に示すように、プロジェクトに VS と NUnit 用の NUnit Test Adapter をインストールします。

NuGetパッケージマネージャー、NUnitを検索し、図に示すようにプロジェクト内のVSおよびNUnit用のNUnitテストアダプターをインストールします

NUnit Test Adapterをインストールした後、NUnitを操作できます。

テスト対象システムプロジェクトへの参照を追加する

次に、テスト プロジェクトに Calculator プロジェクト (テスト対象のシステム) への参照を追加する必要があります。これを追加するには、テスト プロジェクトを右クリックし、電卓プロジェクトへの参照を追加します。

テスト対象システムプロジェクトへの参照を追加します

Test クラスと Test メソッドの作成

テストクラスとテストメソッドを作成する前に、テストプロジェクトの構造を理解しましょう。SUTプロジェクトの名前はCalculatorであるため、テストプロジェクトの名前はCalculator.Testsにする必要があります。テスト対象のクラスの名前は Calculator であるため、テストの名前は CalculatorTest にする必要があります。最後に、テスト関数の名前は、テスト対象の関数の名前に "should" という単語を付けたものにする必要があります。ここでの考え方は、テストプロジェクト、クラス、および関数に読みやすい名前を付けることです。

SUTプロジェクトとテストプロジェクトの関係は、次の図に示すように表すことができます。

SUTプロジェクトとテストプロジェクトの関係は、次のように表すことができます

次に、Test ClassとTest Methodsを作成しましょう。 以下を使用する必要があります。

  1. TestFixture 属性を使用してテストクラスを作成します。
  2. テストメソッドを作成するための test 属性

テストクラスは、次のリストに示すように作成できます。

using NUnit.Framework;
 
namespace Calculator.Tests
{
   [TestFixture]
   public class CalculatorTest
    {
       [Test]
       public void ShouldAddTwoNumbers()
       {
           ICalculator sut = new Calculator();
           int expectedResult = sut.Add(7, 8);
           Assert.That(expectedResult, Is.EqualTo(15));
       }
 
       [Test]
       public void ShouldMulTwoNumbers()
       {
           ICalculator sut = new Calculator();
           int expectedResult = sut.Mul(7, 8);
           Assert.That(expectedResult, Is.EqualTo(56));
       }
 
    }
}

上記のリストでは、次のとおりです。

  1. SUT Calculator クラスのオブジェクトの作成
  2. メソッドの呼び出し
  3. NUnit assert を使用して結果をアサートする (アサートについては後の投稿で詳しく説明します)

テストプロジェクトをビルドした後、テストを実行する必要があります。

テストの実行

テストを実行するには、次の 3 つのオプションがあります。

  1. Visual Studio テスト エクスプローラーを使用する
  2. NUnit GUI を使用する
  3. NUnit コマンド プロンプトを使用する

Visual Studio Test Explorer

Visual Studio Test Runner を使用するには、次の図に示すように TEST-WINDOWS-TEST EXPLORER オプションをクリックして、Test Explorer を起動します。

Visual Studio Test Runner で TEST-WINDOWS-TEST EXPLORER オプションをクリックしてテスト エクスプローラーを起動します

単体テストがテスト エクスプローラーに一覧表示されます。特定のテストを選択して実行するか、すべてのテストを実行するように選択できます。Calculator.Tests プロジェクトのテストを実行した後、テスト エクスプローラーで、次の図に示すように結果を確認できます。ShouldAddTwoNumbers テストは合格したのに対し、ShouldMulTwoNumbers テストは失敗していることがわかります (これは予想されます)。

テストプロジェクトのテストエクスプローラーでは、図に示すように結果を確認できます

NUnit GUI

NUnit GUIのMSIはこちらからダウンロードできます。ダウンロードしたら、NUnit GUIをインストールし、[ファイル]メニューで[プロジェクトを開く]オプションを選択し、DLLをCalculator.Testプロジェクトに追加します。DLLを追加すると、UIにロードされたテストを確認できるはずです。テストを実行するには、[実行] を選択してクリックします。NUnit UI では、失敗したテストのメッセージがはっきりと確認できます。

テストを実行するには、[実行] を選択してクリックします

NUnit コマンド プロンプト

テストを実行する 3 番目のオプションは、NUnit コマンド プロンプトを使用することです。Program Filesの下のNUnit\Binフォルダに移動し(その場所は選択したインストールパスによって異なります)、ファイルnunit-console.exeを実行します。二重引用符では、次の図に示すように、テストを実行するための2番目のパラメーターとしてテストプロジェクトdllのフルパスを渡す必要があります。

NUnit Command Prompt

NUnit コマンド プロンプト オプションは、継続的インテグレーションに非常に役立ちます。

TestFixtureSetUp と TestFixtureTearDown

NUnit テストの 2 つの非常に重要な概念は、テストのセットアップとティアダウンです。Calculator.Test では、両方のテストで SUT Calculator のオブジェクトを作成しています。これは正しい方法ではありません。テストを実行する前に、テストに必要なすべてのオブジェクトを作成する必要があります。その他のシナリオとしては、次のようなものがあります。

  1. 最初のテストを実行する前にデータベース接続を作成する
  2. 最初のテストを実行する前に、特定のオブジェクトのインスタンスを作成します
  3. すべてのテストの実行後にデータベースへのすべての接続を削除します
  4. テストを実行する前に、システムから特定のファイルを削除します

上記のシナリオは、TestFixtureSetUp と TestFixtureTearDown を使用して解決できます。TestFixtureSetUp は、任意のテストの実行前に実行されるコードであり、TestFixtureTearDown は、すべてのテストの実行後に実行されるコードの一部です。

We can solve the above scenarios using the TestFixtureSetUp and the TestFixtureTearDown. TestFixtureSetUp

Calculator.Testについて考えてみましょう。どちらのテストでも、SUT Calculator のオブジェクトを作成しています。一方、テストを実行する前にCalculatorクラスのオブジェクトが必要であり、すべてのテストの実行後にそれを破棄する必要があります。テストクラスは、以下のリストに示すように、SetUp と TearDown と同様に変更できます。

using NUnit.Framework;
 
namespace Calculator.Tests
{
 
   [TestFixture]
   public class CalculatorTest
    {
       ICalculator sut;
       [TestFixtureSetUp]
       public void TestSetup()
       {
           sut = new Calculator();
       }
       [Test]
       public void ShouldAddTwoNumbers()
       {
          
           int expectedResult = sut.Add(7, 8);
           Assert.That(expectedResult, Is.EqualTo(15));
       }
       [Test]
       public void ShouldMulTwoNumbers()
       {
        
           int expectedResult = sut.Mul(7, 8);
           Assert.That(expectedResult, Is.EqualTo(56));
       }
 
       [TestFixtureTearDown]
       public void TestTearDown()
       {
           sut = null;
       }
 
    }
}

上記のリストでは、次のことに気付くでしょう。

  1. [TestFixtureSetUp] で属性付けされた関数があります。この関数は、テストの実行前に実行されます。この関数内にSUT Calculatorのオブジェクトを作成し、作成されたインスタンスがすべてのテストで使用できるようにします。
  2. [TestFixtureTearDown] で属性付けされた関数があります。この関数は、すべてのテストの実行後に実行されます。この関数内にSUT Calculatorのオブジェクトを配置しています。

テストを無視

テストの実行中に遭遇する可能性のある別のシナリオは、実行される特定のテストを無視したい場合があります。たとえば、3 つのテストがあり、残りのテストの実行中にテストの 1 つを無視するとします。これは、テストを無視するように[ignore]属性で属性付けすることで実行できます。

テストは、次のリストに示すように無視できます。

 [Test]
       [Ignore]
       public void ShouldNotMulTwoNumbers()
       {
 
           int expectedResult = sut.Mul(7, 8);
           Assert.That(expectedResult, Is.EqualTo(15));
       }

テスト エクスプローラーですべてのテストを実行すると、無視されたテストについて、次の図に示すようなメッセージが表示されます。

テスト エクスプローラーですべてのテストを実行すると、無視されたテストに対してメッセージが表示されます

結論

この記事では、.NET で NUnit を使用して単体テストを開始しました。以下のポイントに示すように、NUnitを使用した単体テストのさまざまなコンポーネントについて学習しました。

  • テスト対象システムの作成
  • Setting up NUnit
  • テストプロジェクトの作成
  • Test クラスとメソッドの作成
  • テストを実行するためのさまざまなオプション
  • Understanding TestFixtures and TestTearDown
  • Ignore テストの操作

この記事が単体テストを始めるのに役立つことを願っています–読んでくれてありがとう、そしてハッピーコーディング!

デモを予約