こんにちは、アーティサン株式会社の戸田隆俊と申します。
私は主に C#でのバックエンド開発を担当しております。
コーディングとテストは切っても切り離せないものです。システムを開発したらテストが必要ですし、改修をしたら再テストが発生します。
初回のテストは仕方ありませんが、同じような内容を、それも人力で1 件 1 件テストをするのは非効率な気がしませんか?
また、どれだけしっかりとしたテスト計画書を作成してもヒューマンエラーは防ぎようがありません。
そんなあなたに朗報です!
再テストの負荷を軽減する方法があります!
今回は xUnit を使用した VSCode での単体テストの自動化についてご紹介致します。
自動化することにより再テスト時のコストを削減し、ヒューマンエラーを防ぐことが出来ます。
xUnitは Visual Studio でも利用できますが、他のブログで見受けられる+ Visual Studio ではライセンス費用がかかる点から今回は VSCode でのご紹介とします。
環境
- .Net Core 3.1
- xUnit .net 2.4.1
- Visual Studio Code 1.58.2
xUnit とは
正式名称はxUnit.netです。.NET Frameworkや.Net Coreで利用できる単体テストツールです。
こちらを利用することで自動テストが可能となります。
他にも NUnit、MSTest といった類似ツールがありますが、一番人気があるのはxUnitとなっています。
前提条件
xUnit を導入する前に自動テストの対象となるプロジェクトが必要になります。
簡単に説明しますが、本題ではないので不要な方は以下リンクから読み飛ばしてください。
テスト対象プロジェクトの準備
まずは VSCode を起動し、ターミナルから以下のコマンドを実行してプロジェクトを作成します。
自動的に作成されたClass1.csにAddメソッドを追加します。 以下、追加後のクラスです。
dotnet new classlib -n Test -f netcoreapp3.1
namespace Test
{
public class Class1
{
public static int Add(int value1, int value2) => (value1 + value2);
}
}
以上でプロジェクトの準備は完了となります。
自動テストの実装
いよいよ自動テストを実装していきます。
まずは xUnit のテストプロジェクトを作成します。
テストプロジェクト作成
ターミナルから以下のコマンドを実行します。
dotnet new xunit -n UnitTests -f netcoreapp3.1
テストプロジェクトから対象プロジェクトを参照できるようにします。
dotnet add ./UnitTests/UnitTests.csproj reference ./Test/Test.csproj
テストロジック実装
テストロジックを実装します。
xUnitでは以下のような条件をチェックできます。
アサート名 | 概要 |
---|---|
Equal | 一致を確認 |
NotEqual | 不一致を確認 |
Same | インスタンスの一致を確認 |
NotSame | インスタンスの不一致を確認 |
Contains | 含まれることを確認 |
DoesNotContain | 含まれないことを確認 |
InRange | 範囲の間であることを確認 |
NotInRange | 範囲の間に含まれないことを確認 |
IsAssignableFrom | 代入できるかを確認 |
Empty | 初期値であることを確認 |
NotEmpty | 初期値でないことを確認 |
True | True であることを確認 |
False | False であることを確認 |
IsType | 型一致を確認 |
IsNotType | 型不一致を確認 |
Null | Null であることを確認 |
NotNull | NNull でないことを確認 |
Throws | N例外が発生することを確認 |
今回はサンプルとしてEqualを使用します。
自動作成されたUnitTest1クラスのTest1メソッドを以下のように修正します。
8 行目で 1+1=2 となることをテストしています。
namespace UnitTests
{
public class UnitTest1
{
[Fact]
public void Test1()
{
Assert.Equal(2, Test.Class1.Add(1, 1));
}
}
}
最後にテストを実行します。
ターミナルから以下のコマンドを実行します。
cd UnitTests
dotnet test
以下のようなテスト結果が出力されれば成功です。
成功! -失敗: 0、合格: 1、スキップ: 0、合計: 1、期間: < 1 ms - UnitTests.dll (netcoreapp3.1)
論理的なテスト
xUnit は複数のデータセットに対してテストを実行することも可能です。
以下は例として 1+2=2、3+7=10 となることをテストするメソッドTest2を追加しています。
データセットを使用する場合は 11 行目のようにTheoryとする必要があります。
namespace UnitTests
{
public class UnitTest1
{
[Fact]
public void Test1()
{
Assert.Equal(2, Test.Class1.Add(1, 1));
}
[Theory]
[InlineData(1, 1, 2)]
[InlineData(3, 7, 10)]
public void Test2(int value1, int value2, int expected)
{
Assert.Equal(expected, Test.Class1.Add(value1, value2));
}
}
}
以下は実行結果です。
合格の件数ですが、Test1の結果 1 件+Test2のデータセット 2 件で 3 件となっています。
成功! -失敗: 0、合格: 3、スキップ: 0、合計: 3、期間: 3 ms – UnitTests.dll (netcoreapp3.1)
(おまけ)拡張機能 .Net Core Test Explorer
VSCode のアドバンテージの一つに豊富な拡張機能があげられます。
今回は自動テストに便利な.Net Core Test Explorerをご紹介致します。
こちらの拡張機能ではサイドバーからのテスト実行や、テスト結果の可視化が出来ます。
Marketplace で.Net Core Test Explorerを検索してインストールをクリックすることで拡張機能が導入されます。
拡張機能の設定を行います。
設定から Test Project Path に**/*Tests.csprojを入力します。
左側のフラスコマークをクリックすることでテスト一覧が表示されます。
再生ボタンを押すことで各テストが実行されます。
こちらの拡張機能を使用することでより分かりやすくテスト結果を確認出来ます。
あとがき
いかがでしたでしょうか?
このようにテストを自動化することによって、一定品質を保証し、再テストの工数削減も可能です。
仕様変更・改修が頻繁に発生するプロジェクトや、アジャイル開発を採用しているプロジェクトにマッチします。
ただし、テストロジックを実装する必要があるため開発工数は増加してしまいます。 そのため、ウォーターフォール開発を採用している、仕様変更が発生しないようなプロジェクトには向いていません。
自身のプロジェクトに照らし合わせて慎重に導入を検討して頂ければと思います。
戸田隆俊
SE歴は約9年間!2021年3月にアーティサンに入社し、主にC#のバックエンド開発を担当しています。
新しいもの好きで新機能はどんどん使っていきたいタイプです。
かゆいところに手が届くような記事を作っていければと思います。
ちなみに趣味は映画鑑賞(ファンタジー系)でアマプラにドはまりしてます!