.NET Core アプリケーションの単体テストの記述方法
単体テストの作成は、ソフトウェアエンジニアリングの優れた実践方法です。この記事では、テスト駆動開発 (TDD) アプローチに準拠しながら C# .NET Core アプリケーションを作成する方法について説明します。
TDD アプローチでは、機能を実装する前に、その機能の単体テストを記述します。たとえば、2 つの数値を加算する関数を作成する場合は、最初に失敗した単体テストを記述し、次にテストに合格する機能を実装します。
この投稿では、電卓アプリケーションを作成します。まず、以下に概説するフォルダ構造に従いましょう。
- CalculatorApp – Solution
- CalculatorApp.Services – Application project
- CalculatorApp.Services.Tests – テストプロジェクト
Visual Studio を使用してプロジェクトを作成できます。ただし、この投稿では、.NET Coreコマンドを使用して、プロジェクトを作成し、テストを追加し、テストを実行します。MSTest または NUnit を使用して単体テストを作成することもできますが、この例では、xUnit と dotnet test を使用して単体テストを記述して実行します。
まず、コマンド シェルを開いて手順を進めましょう。
アプリケーションプロジェクトの作成
まず、CalculatorAppというディレクトリを作成する必要があります。ディレクトリについては任意の命名規則に従うことができますが、この投稿に沿って進みたい場合は、同じディレクトリ名に従うことをお勧めします。それでは、CalculatorAppディレクトリを作成して移動しましょう。
CalculatorAppディレクトリ内で、次のコマンドを実行して新しいソリューションを作成します。
dotnet new sln
コマンドが正常に実行されると、「テンプレート ソリューション ファイルが正常に作成されました」というメッセージが表示されます。 また、CalculatorAppディレクトリ内には、calculatorapp.slnという名前のファイルがあります。
次に、CalculatorApp.Servicesというディレクトリを作成します。このディレクトリには、アプリケーションソース、つまり電卓アプリケーションのすべてのクラスが保持されます。Calculatorapp.Services ディレクトリに移動し、次のコマンドを実行してクラス ライブラリを作成します。
dotnet new classlib
このコマンドを正常に実行すると、「テンプレートクラスライブラリが正常に作成されました」というメッセージが表示されます。また、CalculatorApp.Services ディレクトリ内に calculatorapp.services.csproj という名前のファイルもあります。次に、このクラス ライブラリ プロジェクトを calculatorapp ソリューションに追加する必要があります。これを行うには、calculatorapp ディレクトリに戻り、次のコマンドを実行します。
dotnet sln add .\calculatorapp.services\calculatorapp.services.csproj
コマンドが正常に実行されると、"プロジェクトがソリューションに追加されました" というメッセージが表示されます。
CalculatorApp.Services フォルダ内には、Class1というクラスがあります。名前をCalculatorに変更し、次のリストに示すようにクラスを変更します。
Calculator.cs
using System;
namespace calculatorapp.services {
public class Calculator {
public int Add(int num1, int num2) {
throw new NotImplementedException();
}
public int Sub(int num1, int num2) {
throw new NotImplementedException();
}
}
}
上記のリストでは、Add 関数と Sub 関数が実装されていないことに気付くでしょう。まず、単体テストを作成し、次にこれらの機能を実装します。
テストプロジェクトの作成
テスト プロジェクトを追加するには、CalculatorApp.Services.Tests というディレクトリを作成し、そのディレクトリに移動します。このディレクトリでは、次のコマンドを実行してMSテストプロジェクトを作成します。
dotnet new mstest
このコマンドは、MS Test をテスト ライブラリとして使用するテスト プロジェクトを作成します。 テスト プロジェクトが作成されたら、ソース プロジェクト ライブラリをテスト プロジェクトに追加します。これを行うには、次のコマンドを実行します。
dotnet 参照を追加 ../CalculatorApp.Services/CalculatorApp.Services.csproj
このコマンドは CalculatorAppServiceプロジェクトの参照をテストプロジェクトに追加します。参照を追加した後、calculatorapp ルート ディレクトリに移動してテスト プロジェクトをソリューションに追加し、次のコマンドを実行します。
dotnet sln add .\CalculatorAppServices.tests\CalculatorAppServices.Tests.csproj
このコマンドは、テスト プロジェクトをソリューションに追加します。コマンドが正常に実行されると、"プロジェクトがソリューションに追加されました" というメッセージが表示されます。
Writing Unit Tests
ここまでで、アプリケーション ソース プロジェクトとテスト プロジェクトを作成しました。アプリケーション ソース プロジェクトには、実装されていない関数があります。次に、これらの関数のテストを記述しましょう。
Test プロジェクトでは、ファイルの名前を UnitTest1.cs に Calculator.Test.cs に変更し、クラス名を CalculatorTest に変更しました。CalculatorTest のコンストラクタでは、Calculator クラスのオブジェクトを作成する必要があります。これは、次のリストに示すように実行できます。
Calculator.Test.cs
using Microsoft.VisualStudio.TestTools.UnitTesting;
using calculatorapp.services;
namespace CalculatorApp.Services.Tests {
[TestClass]
public class CalculatorTest {
Calculator _calc;
public CalculatorTest() {
_calc = new Calculator();
}
}
}
Add 関数のユニットテスト
CalculatorTest クラスで、次のリストに示すように、追加機能をテストする単体テスト メソッドを追加します。
[TestMethod]
public void shouldaddtwonumbers() {
int res = _calc.Add(5, 3);
Assert.AreEqual(res, 8);
}
テストを実行するには、CalculatorApp.Services.Tests ディレクトリに移動し、次のコマンドを実行します。
dotnet test
次の図に示すように、Add 関数が実装されていないため、"テストに失敗しました" という出力が表示されます。

テストに合格するには、次のリストに示すように、Calculator クラスに Add 関数を実装します。
public int Add(int num1, int num2) {
int result = num1 + num2;
return result;
}
テストを今すぐ実行するには、CalculatorApp.Services.Tests ディレクターに移動し、次のコマンドを実行します。
dotnet test
出力として、次の画像に示すように「テストに合格しました」というメッセージが表示されます。

これで、.NET Core アプリケーションの TDD アプローチに準拠しながら、追加機能を実装しました。
サブ機能のユニットテスト
CalculatorTest クラスで、次のリストに示すように、サブ機能をテストする単体テスト メソッドを追加します。
[TestMethod]
public void shouldsubstracttwonumbers() {
int res = _calc.Sub(5, 3);
Assert.AreEqual(res, 2);
}
テストを実行するには、CalculatorApp.Services.Tests ディレクトリに移動し、次のコマンドを実行します。
dotnet test
ここでは、Sub 関数が実装されていないため、テストは失敗します。下の画像に示すように、1つの失敗したテスト結果が表示されます。

テストに合格するには、次のリストに示すように、Calculator クラスに Sub 関数を実装します。
public int Sub(int num1, int num2) {
int result = num1 - num2;
return result;
}
次に、CalculatorApp.Services.Tests ディレクトリに移動してテストを再度実行し、次のコマンドを実行します。
dotnet test
これで、次に示すように、両方のテストに合格したことがわかります。

これで、.NET Core アプリケーションの TDD アプローチに準拠しながら、Sub 機能を実装しました。
まとめ
この投稿では、これまで TDD アプローチに準拠しながら .NET Core Calculator アプリケーションを作成しました。テストを作成するために、XUnit テストと dotnet テストを使用しました。参考までに、Calculatorクラスとそのテストクラスの両方のソースコードを次に示します。
Calculator.cs
using System;
namespace calculatorapp.services {
public class Calculator {
public int Add(int num1, int num2) {
int result = num1 + num2;
return result;
}
public int Sub(int num1, int num2) {
int result = num1 - num2;
return result;
}
}
}
Calculator.test.cs
using Microsoft.VisualStudio.TestTools.UnitTesting;
using calculatorapp.services;
namespace CalculatorApp.Services.Tests {
[TestClass]
public class CalculatorTest {
Calculator _calc;
public CalculatorTest() {
_calc = new Calculator();
}
[TestMethod]
public void shouldaddtwonumbers() {
int res = _calc.Add(5, 3);
Assert.AreEqual(res, 8);
}
[TestMethod]
public void shouldsubstracttwonumbers() {
int res = _calc.Sub(5, 3);
Assert.AreEqual(res, 2);
}
}
}
そして、それがユニットテストを作成し、その機能を実装する方法です。この投稿が、次の .NET Core アプリケーションの単体テストの作成を開始するのに役立つことを願っています。
