プログラミング

C#でUnitテスト方法

hebishima.shogo

はい、hebiです。

今回はVisual Studio 2022 C# .NET 5.0でのUnitテスト方法を記事にしたいと思います。

スポンサーリンク

テスト対象のクラスを準備

テスト対象となるMessageクラスを準備しましょう。

    public class Message
    {
        public enum MessageType
        {
            message1,
            message2
        }

        private readonly Dictionary<MessageType, string> messageList = new System.Collections.Generic.Dictionary<MessageType, string>()
        {
            {MessageType.message1, "Hello World!" }
        };

        public Message()
        {
        }

        /// <summary>
        /// メッセージを取得します
        /// </summary>
        /// <param name="messageType">メッセージタイプ</param>
        /// <returns>メッセージ</returns>
        public string GetMessage(MessageType messageType)
        {
            if (messageList.ContainsKey(messageType))
            {
                return messageList[messageType];
            }
            return "";
        }

        /// <summary>
        /// メッセージを追加します
        /// </summary>
        /// <param name="messageType">メッセージタイプ</param>
        /// <returns>メッセージ</returns>
        public void AddMessage(MessageType messageType, string message)
        {
            if (!messageList.ContainsKey(messageType))
            {
                messageList.Add(messageType, message);
            }
            else
            {
                UpdateMessage(messageType, message);
            }
        }

        /// <summary>
        /// メッセージを更新します
        /// </summary>
        /// <param name="messageType">メッセージタイプ</param>
        /// <returns>メッセージ</returns>
        protected virtual void UpdateMessage(MessageType messageType, string message)
        {
            messageList[messageType] = message;
        }
    }

準備したMessageクラスの以下の関数をUnitテストしていきます。

  • public GetMessage
  • publuc AddMessage
  • protected virtual void UpdateMessage※

UpdateMessageをprotected virtualにしている理由は、AddMessage内でUpdateMessageを実行しているため、Moqというライブラリを使用してモック化するためです。プロジェクト的にpivateにする必要がある場合は別の方法でモック化するか、private関数が正常動作するための事前準備を行って試験を実施する必要があります。

プロジェクト構成は以下となります。
今回はコンソールアプリケーションプロジェクトにMessageクラスを追加しました。

テストプロジェクトの作成

Messageクラスをテストするためのテストプロジェクトを作成します。

XUnitテストプロジェクトの作成

Visual Studioを起動し、新しいプロジェクトの作成にて、XUnitテストプロジェクトを選択し、次へボタンを押下します。

テストプロジェクトが作成されるため、自動で生成されるUnitTest1クラス名を試験対象のクラス名に変更します。

テスト対象のプロジェクトを追加

ソリューションを右クリックし、「追加」-「既存のプロジェクト」を選択し、試験対象のプロジェクトを追加します。

依存関係を右クリックし、プロジェクト参照の追加を選択し、試験対象のプロジェクトを追加します。

「表示」-「テストエクスプローラ」を表示しておきます。

以上でテストプロジェクトの作成完了です。

テスト項目の作成

GetMessage関数のテストを作成したいと思います。

指定したmessageTypeがmessageListに存在する場合と存在しない場合の2件を実施する必要があるため、2件の項目を作成します。

取得成功パターンを作成

取得成功パターンを作成します。

        [Fact]
        public void GetMessage1()
        {
            // 取得成功パターン
            var message = new Message();
            string result = message.GetMessage(Message.MessageType.message1);
            Assert.Equal("Hello World!", result);
        }

取得失敗パターンを作成
        [Fact]
        public void GetMessage2()
        {
            // 取得失敗パターン
            var message = new Message();
            string result = message.GetMessage((Message.MessageType)3);
            Assert.Equal("", result);
        }

以上でGetMessageのテスト項目作成完了です。

テスト実行

GetMessageのテストを実行してみましょう。

テストエクスプローラからテストを行いたい項目を選択し実行を押下します。
今回はGetMessageのすべての項目を実行したいためMessageTestから実行します。

テストが完了すると、以下のように成功を示す緑アイコンとなります。

仮に返却する文字列が誤っている場合は、Assertでエラーとなります。(返却文字列をHallo Worldに変更して実行)

最後に

C#でのUnitテスト方法でした。次回はprivateプロパティの確認方法やprotected関数のテスト方法を記事にしたいと思います。

最後までお読みいただきありがとうございました。

スポンサーリンク
ABOUT ME
hebi
hebi
エンジニア
フルスタックエンジニアとして活躍中。
HTML5プロフェッショナル認定Level1、Level2所持者です。

未経験の方でも簡単にプログラミングを学べるようにと情報を発信しております。
記事URLをコピーしました