次の方法で共有


チュートリアル: Visual Studio Code を使用して .NET クラス ライブラリをテストする

このチュートリアルでは、テスト プロジェクトをソリューションに追加して単体テストを自動化する方法について説明します。

前提 条件

  • このチュートリアルは、「Visual Studio Codeを使用して .NET クラス ライブラリを作成する で作成するソリューションと連携します。

単体テスト プロジェクトを作成する

単体テストでは、開発と公開中に自動ソフトウェア テストが提供されます。 このチュートリアルで使用するテスト フレームワークは MSTest です。 MSTest は、選択できる 3 つのテスト フレームワークの 1 つです。 その他は xUnitnUnitです。

  1. Visual Studio Code を起動します。

  2. Visual Studio Codeを使用して .NET クラス ライブラリを作成 で作成した ソリューションを開きます。

  3. ソリューション エクスプローラー で、[新しいプロジェクト] 選択するか、[コマンド パレット] で [.NET: 新しいプロジェクト選択します。

  4. MSTest テスト プロジェクト選択し、"StringLibraryTest" という名前を付け、既定のディレクトリを選択して、プロジェクトの作成 選択します。

    プロジェクト テンプレートは、次のコードを使用して UnitTest1.cs ファイルを作成します。

    namespace StringLibraryTest;
    
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
        }
    }
    

    単体テスト テンプレートによって作成されたソース コードでは、次の処理が行われます。

    • TestClassAttribute 属性を UnitTest1 クラスに適用します。
    • TestMethodAttribute 属性を適用して、TestMethod1を定義します。
    • Microsoft.VisualStudio.TestTools.UnitTesting 名前空間がインポートされます。この名前空間には、単体テストに使用される型が含まれます。 名前空間は、GlobalUsings.csglobal using ディレクティブを介してインポートされます。

    [TestClass] でタグ付けされたテスト クラスの [TestMethod] でタグ付けされた各メソッドは、単体テストが呼び出されたときに自動的に実行されます。

プロジェクト参照を追加する

テスト プロジェクトで StringLibrary クラスを操作するには、StringLibraryTest プロジェクト内の参照を StringLibrary プロジェクトに追加します。

  1. ソリューション エクスプローラー で 'StringLibraryTest' プロジェクトを右クリックし、[プロジェクト参照の追加] を選択します

  2. [StringLibrary] を選択します。

単体テスト メソッドの追加と実行

Visual Studio で単体テストが呼び出されると、TestMethodAttribute 属性でマークされた各メソッドが、TestClassAttribute 属性でマークされたクラスで実行されます。 テスト メソッドは、最初のエラーが見つかったか、メソッドに含まれるすべてのテストが成功したときに終了します。

最も一般的なテストでは、Assert クラスのメンバーを呼び出します。 多くのアサート メソッドには、少なくとも 2 つのパラメーターが含まれています。そのうちの 1 つは予想されるテスト結果で、もう 1 つは実際のテスト結果です。 Assert クラスの最も頻繁に呼び出されるメソッドの一部を次の表に示します。

Assert メソッド 機能
Assert.AreEqual 2 つの値またはオブジェクトが等しいことを確認します。 値またはオブジェクトが等しくない場合、アサートは失敗します。
Assert.AreSame 2 つのオブジェクト変数が同じオブジェクトを参照していることを確認します。 変数が異なるオブジェクトを参照している場合、アサートは失敗します。
Assert.IsFalse 条件が falseであることを確認します。 条件が true場合、アサートは失敗します。
Assert.IsNotNull オブジェクトが nullされていないことを確認します。 オブジェクトが nullされている場合、アサートは失敗します。

また、テスト メソッドで Assert.ThrowsException (MSTest 3.8 以降を使用している場合は Assert.Throws および Assert.ThrowsExactly) メソッドを使用して、スローする必要がある例外の種類を示すこともできます。 指定した例外がスローされない場合、テストは失敗します。

StringLibrary.StartsWithUpper メソッドのテストでは、大文字で始まる文字列を多数指定する必要があります。 このような場合、メソッドは true を返す必要があるため、Assert.IsTrue メソッドを呼び出すことができます。 同様に、大文字以外の文字列で始まる文字列を多数指定する必要があります。 このような場合、メソッドは false を返す必要があるため、Assert.IsFalse メソッドを呼び出すことができます。

ライブラリ メソッドは文字列を処理するため、空の文字列 (String.Empty)null 文字列が正常に処理されるようにする必要もあります。 空の文字列は、文字がなく、Length が 0 である文字列です。 null 文字列は初期化されていない文字列です。 StartsWithUpper を静的メソッドとして直接呼び出し、1 つの String 引数を渡すことができます。 または、nullに割り当てられた string 変数の拡張メソッドとして StartsWithUpper を呼び出すことができます。

3 つのメソッドを定義します。各メソッドは、文字列配列内の各要素に対して Assert メソッドを呼び出します。 テストに失敗した場合に表示するエラー メッセージを指定できるメソッド オーバーロードを呼び出します。 このメッセージは、エラーの原因となった文字列を識別します。

テスト メソッドを作成するには:

  1. StringLibraryTest/UnitTest1.cs 開き、すべてのコードを次のコードに置き換えます。

    using Microsoft.VisualStudio.TestTools.UnitTesting;
    using UtilityLibraries;
    
    namespace StringLibraryTest
    {
        [TestClass]
        public class UnitTest1
        {
            [TestMethod]
            public void TestStartsWithUpper()
            {
                // Tests that we expect to return true.
                string[] words = { "Alphabet", "Zebra", "ABC", "Αθήνα", "Москва" };
                foreach (var word in words)
                {
                    bool result = word.StartsWithUpper();
                    Assert.IsTrue(result,
                           string.Format("Expected for '{0}': true; Actual: {1}",
                                         word, result));
                }
            }
    
            [TestMethod]
            public void TestDoesNotStartWithUpper()
            {
                // Tests that we expect to return false.
                string[] words = { "alphabet", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                                   "1234", ".", ";", " " };
                foreach (var word in words)
                {
                    bool result = word.StartsWithUpper();
                    Assert.IsFalse(result,
                           string.Format("Expected for '{0}': false; Actual: {1}",
                                         word, result));
                }
            }
    
            [TestMethod]
            public void DirectCallWithNullOrEmpty()
            {
                // Tests that we expect to return false.
                string?[] words = { string.Empty, null };
                foreach (var word in words)
                {
                    bool result = StringLibrary.StartsWithUpper(word);
                    Assert.IsFalse(result,
                           string.Format("Expected for '{0}': false; Actual: {1}",
                                         word == null ? "<null>" : word, result));
                }
            }
        }
    }
    

    TestStartsWithUpper メソッドの大文字のテストには、ギリシャ大文字のアルファ (U+0391) とキリル大文字 EM (U+041C) が含まれます。 TestDoesNotStartWithUpper メソッドの小文字のテストには、ギリシャ文字の小文字のアルファ (U+03B1) とキリル文字の小文字 Ghe (U+0433) が含まれます。

  2. 変更を保存します。

テストをビルドして実行する

  1. ソリューション エクスプローラーで、ソリューションを右クリックし、[ビルド] 選択するか、コマンド パレットから [.NET: ビルド選択します。

  2. テスト ウィンドウを選択し、テストの実行 を選択するか、コマンドパレットから テスト: すべてのテストを実行するを選択します。

    Visual Studio Code テスト エクスプローラー

テストエラーの処理

テスト駆動型開発 (TDD) を実行している場合は、最初にテストを記述し、最初にテストを実行すると失敗します。 次に、テストを成功させるコードをアプリに追加します。 このチュートリアルでは、検証するアプリ コードを記述した後にテストを作成したので、テストの失敗を確認していません。 テストが失敗すると予想されたときにテストが失敗することを検証するには、テスト入力に無効な値を追加します。

  1. 文字列 "Error" を含むように、TestDoesNotStartWithUpper メソッドの words 配列を変更します。

    string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " };
    
  2. エディターでテストの横にある緑色のエラーをクリックして、テストを実行します。

    出力にはテストが失敗したことが示されており、失敗したテストに関するエラーメッセージが提供されています:「Assert.IsFalse failed.」 Expected for 'Error': false; actual: True" が表示されます。 エラーのため、"Error" の後に配列内の文字列がテストされませんでした。

    Visual Studio Code の失敗したテスト

  3. 手順で追加した文字列 "Error" を削除します。

  4. テストを再実行し、テストに合格します。

ライブラリのリリース バージョンをテストする

ライブラリのデバッグ ビルドを実行するときにテストがすべて成功したら、ライブラリのリリース ビルドに対して追加の時間テストを実行します。 コンパイラの最適化など、さまざまな要因によって、デバッグ ビルドとリリース ビルド間で動作が異なる場合があります。

  1. リリース ビルド構成でテストを実行します。

    dotnet test StringLibraryTest/StringLibraryTest.csproj --configuration Release
    

    テストに合格します。

テストのデバッグ

IDE として Visual Studio Code を使用している場合は、「Visual Studio Code を使用して .NET コンソール アプリケーションをデバッグ に示されているのと同じプロセスを使用して、単体テスト プロジェクトを使用してコードをデバッグできます。 ShowCase アプリ プロジェクトを開始するのではなく、StringLibraryTest/UnitTest1.csを開き、現在のファイルの 7 行目と 8 行目の間で デバッグ テスト を選択します。 見つからない場合は、CtrlShiftP 押してコマンド パレットを開き、「ウィンドウ再読み込み」と入力します。

Visual Studio Code では、デバッガーがアタッチされた状態でテスト プロジェクトが開始されます。 テスト プロジェクトまたは基になるライブラリ コードに追加したブレークポイントで実行が停止します。

その他のリソース

次の手順

このチュートリアルでは、クラス ライブラリを単体テストしました。 ライブラリを他のユーザーが使用できるようにするには、ライブラリをパッケージとして NuGet に発行します。 方法については、NuGet チュートリアルに従ってください。

dotnet CLI を使用してパッケージを作成して発行する

ライブラリを NuGet パッケージとして発行すると、他のユーザーがライブラリをインストールして使用できます。 方法については、NuGet チュートリアルに従ってください。

dotnet CLI を使用してパッケージをインストールして使用する

ライブラリをパッケージとして配布する必要はありません。 それを使用するコンソール アプリにバンドルできます。 コンソール アプリを発行する方法については、このシリーズの前のチュートリアルを参照してください。

Visual Studio Code を使用して .NET コンソール アプリケーションを発行する

Visual Studio Code 拡張機能 C# Dev Kit には、C# アプリとライブラリを開発するためのツールがさらに用意されています。