技術情報ブログ
c#
2021.09.01

C# xUnitを使用したVSCodeでの自動テスト

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#のバックエンド開発を担当しています。

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

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

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

シェアする
記事カテゴリ
最新記事
2024.04.17

Power Apps・Power Automateの勉強方法(1)

2024.04.03

非エンジニア【(元)自治体職員】が半年間ローコード開発をしてみたら

2024.03.27

Power Automateのベストプラクティス・アンチパターン(5)【Apply to each×コンカレンシー×変数の設定はNG】

2024.03.20

Power Apps×Teams:Teams上からPower Appsを実行する方法

2024.03.13

Power Apps:SharePointリストと連携したカレンダーアプリを自作してみよう

モデル駆動型アプリPower AppsPower PlatformSharePointExcelPower AutomateC#attributevalidationローコードAngularAccessInfoPathMatTableAngular Materialデータ構造SortByColumns関数TypeScriptHTMLEF CoreマイグレーションFramework CoreAttribute directivesO/Rマッパーazure sql databaseCase式HTTP RequestCSSxUnit.Net Core 3.1VSCode.Net Core Test ExplorerDataverse for Teamsitem関数Google MapsMarker ClustererRANK()関数Dynamics 365 SalesMicrosoft TranslatorマーカークラスタリングライブラリtailwindcssマルチテナントドロップダウンメニューBreakpointObserverメディアクエリスマホPCレスポンシブ入門初心者中級者キャンバスアプリDatePickerDropdownviewビューアクセス制限承認リマインドSetForAllUpdateContextロードマップ技術It情報技術メッセージIDメールfirst()関数nest入れ子動的リストcollectionコレクション複数の添付ファイル承認フローformエクスポートインポートカスタマイズcomponentダイアログコンポーネントdialogTips新機能変数検索Microsoft 365グループセキュリティグループ送信元メールの送信差出人インスタントクラウドフロー自動化したクラウドフロー委任VBAエラーエクセルerror復元restorePower BI個人列ユーザー列SharePoint Onlineリスト非表示アプリ[市民開発者構築自動化したクラウド フローフローの種類インスタント クラウド フロースケジュール済みクラウド フローレスポンシブ レイアウトresponsive layoutデータ行の制限引き継ぎ退職所有者を変更異動LoopMicrosoftdesignJSONデザインtemplateテンプレート運用選択肢列参照列ChatGPTOpenAIオープンAIチャットGPTgalleryギャラリースクロールコンテナショートカットキーshortcut keyconcat関数文字制限フロー実行開発環境環境本番環境ライセンス環境構築手順pipelineCI/CDパイプラインDevOpsMicrosoft 365簡易在庫管理時間外通知ファイルフィルター クエリドキュメント ライブラリfilter querysortソートmultiple item複数項目シェアポイント便利機能カレンダーCalendarTeamsローコード開発非エンジニア体験談勉強内製化
PageTop
ページトップに戻る