技術情報ブログ
c#
2021.09.01

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初期値でないことを確認
TrueTrue であることを確認
FalseFalse であることを確認
IsType型一致を確認
IsNotType型不一致を確認
NullNull であることを確認
NotNullNNull でないことを確認
ThrowsN例外が発生することを確認

今回はサンプルとして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設定

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

テスト一覧表示

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

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

テスト結果

 

あとがき

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

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

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

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

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

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

戸田隆俊

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

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

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

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

シェアする
記事カテゴリ
最新記事
Power Apps
2021.12.08

Power AppsアプリをPCとスマホで操作したい時の対応方針

Power Apps
2021.12.01

Dataverse for Teams・Power Apps:ドロップダウンメニューの順番を並び替えたい

Power Apps
2021.11.24

Automateのベストプラクティス・アンチパターン(1)【アクション名は変更すべき?Power】

Angular
2021.11.17

Angularでマルチテナント対応(2)

Angular
2021.11.10

Angularでマルチテナント対応(1)

人気記事ランキング
1
Power PlatformPower Apps
2020.10.02

世界に広がる「モデル駆動型アプリ」のココがスゴイ!【第1回】

2
Power PlatformPower AutomateSharePointExcel
2021.07.14

Power AutomateでExcelデータをSharePointにインポートするために考えること(第2回)

3
Power PlatformPower AutomateSharePointExcel
2021.06.23

Power AutomateでExcelデータをSharePointにインポートするために考えること(第1回)

4
Power PlatformPower AppsSharePoint
2021.07.16

Power AppsとSharePoint連携:SortByColumns関数で日本語列をソートする際の注意点

5
Power PlatformPower AutomateSharePointExcel
2021.08.11

Power AutomateでExcelデータをSharePointにインポートするために考えること(第5回)

PageTop
ページトップに戻る