アーティサン株式会社
  • c#

C# xUnit での単体テスト自動化|VSCode + .NET Core で始めるテスト実装手順

こんにちは、アーティサン株式会社の戸田隆俊と申します。

C#のバックエンド開発を担当:戸田隆俊

戸田隆俊

🖊戸田隆俊さんのブログ一覧はこちら

SE歴は約9年間!2021年3月にアーティサンに入社し、主にC#のバックエンド開発を担当しています。

新しいもの好きで新機能はどんどん使っていきたいタイプです。

かゆいところに手が届くような記事を作っていければと思います。

ちなみに趣味は映画鑑賞(ファンタジー系)でアマプラにドはまりしてます!

本記事では、C# での単体テストを自動化するために、Microsoft のテストフレームワーク xUnit と無料エディタ Visual Studio Code(VSCode) を使ってテスト環境を構築する手順を丁寧に解説します。本稿を通して、.NET Core プロジェクトにおけるテスト作成と実行の基本を理解できます。

記事内の手順を実装した上で、御社のプロジェクトに最適な C# xUnit テスト戦略の設計や VSCode 環境構築を支援します。

お気軽にご相談ください。

私は主に 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.csAddメソッドを追加します。
以下、追加後のクラスです。

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

以下のようなテスト結果が出力されれば成功です。

合計 1 個のテスト ファイルが指定されたパターンと一致しました。
成功! -失敗: 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 件となっています。

合計 1 個のテスト ファイルが指定されたパターンと一致しました。
成功! -失敗: 0、合格: 3、スキップ: 0、合計: 3、期間: 3 ms – UnitTests.dll (netcoreapp3.1)

 

(おまけ)拡張機能 .Net Core Test Explorer

VSCode のアドバンテージの一つに豊富な拡張機能があげられます。

今回は自動テストに便利な.Net Core Test Explorerをご紹介致します。

こちらの拡張機能ではサイドバーからのテスト実行や、テスト結果の可視化が出来ます。

Marketplace で.Net Core Test Explorerを検索してインストールをクリックすることで拡張機能が導入されます。

 .Net Core Test Explorer を検索してインストールをクリックすることで拡張機能が導入

拡張機能の設定を行います。

設定から Test Project Path に**/*Tests.csprojを入力します。

.Net Core Test Explorer設定

左側のフラスコマークをクリックすることでテスト一覧が表示されます。

テスト一覧表示

再生ボタンを押すことで各テストが実行されます。

こちらの拡張機能を使用することでより分かりやすくテスト結果を確認出来ます。

テスト結果

 

あとがき

いかがでしたでしょうか?

このようにテストを自動化することによって、一定品質を保証し、再テストの工数削減も可能です。

仕様変更・改修が頻繁に発生するプロジェクトや、アジャイル開発を採用しているプロジェクトにマッチします。

ただし、テストロジックを実装する必要があるため開発工数は増加してしまいます。
そのため、ウォーターフォール開発を採用している、仕様変更が発生しないようなプロジェクトには向いていません。

自身のプロジェクトに照らし合わせて慎重に導入を検討して頂ければと思います。

xUnit を用いた単体テストは品質保証と工数削減に直結します。

より包括的なテスト設計・CI/CD 統合支援をご希望の場合はこちらからお問い合わせください。