チュートリアル: Visual Studio Code を使用して .NET クラス ライブラリをテストする
このチュートリアルでは、テスト プロジェクトをソリューションに追加して単体テストを自動化する方法について説明します。
前提 条件
- このチュートリアルは、「Visual Studio Codeを使用して .NET クラス ライブラリを作成する
で作成するソリューションと連携します。
単体テスト プロジェクトを作成する
単体テストでは、開発と公開中に自動ソフトウェア テストが提供されます。 このチュートリアルで使用するテスト フレームワークは MSTest です。 MSTest
Visual Studio Code を起動します。
Visual Studio Codeを使用して .NET クラス ライブラリを作成
で作成した ソリューションを開きます。 ソリューション エクスプローラー
で、[新しいプロジェクト] 選択するか、[コマンド パレット] で [.NET: 新しいプロジェクト 選択します。 MSTest テスト プロジェクト
選択し、"StringLibraryTest" という名前を付け、既定のディレクトリを選択して、プロジェクトの作成 選択します。 プロジェクト テンプレートは、次のコードを使用して UnitTest1.cs ファイルを作成します。
namespace StringLibraryTest; [TestClass] public class UnitTest1 { [TestMethod] public void TestMethod1() { } }
単体テスト テンプレートによって作成されたソース コードでは、次の処理が行われます。
- TestClassAttribute 属性を
UnitTest1
クラスに適用します。 - TestMethodAttribute 属性を適用して、
TestMethod1
を定義します。 - Microsoft.VisualStudio.TestTools.UnitTesting 名前空間がインポートされます。この名前空間には、単体テストに使用される型が含まれます。 名前空間は、GlobalUsings.csの
global using
ディレクティブを介してインポートされます。
[TestClass] でタグ付けされたテスト クラスの [TestMethod] でタグ付けされた各メソッドは、単体テストが呼び出されたときに自動的に実行されます。
- TestClassAttribute 属性を
プロジェクト参照を追加する
テスト プロジェクトで StringLibrary
クラスを操作するには、StringLibraryTest
プロジェクト内の参照を StringLibrary
プロジェクトに追加します。
ソリューション エクスプローラー で 'StringLibraryTest' プロジェクトを右クリックし、[プロジェクト参照の追加] を選択します。
[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 メソッドを呼び出します。 テストに失敗した場合に表示するエラー メッセージを指定できるメソッド オーバーロードを呼び出します。 このメッセージは、エラーの原因となった文字列を識別します。
テスト メソッドを作成するには:
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) が含まれます。変更を保存します。
テストをビルドして実行する
ソリューション エクスプローラー
で、ソリューションを右クリックし、[ビルド] 選択するか、コマンド パレットから [.NET: ビルド 選択します。 テスト ウィンドウを選択し、テストの実行 を選択するか、コマンドパレットから テスト: すべてのテストを実行するを選択します。
テストエラーの処理
テスト駆動型開発 (TDD) を実行している場合は、最初にテストを記述し、最初にテストを実行すると失敗します。 次に、テストを成功させるコードをアプリに追加します。 このチュートリアルでは、検証するアプリ コードを記述した後にテストを作成したので、テストの失敗を確認していません。 テストが失敗すると予想されたときにテストが失敗することを検証するには、テスト入力に無効な値を追加します。
文字列 "Error" を含むように、
TestDoesNotStartWithUpper
メソッドのwords
配列を変更します。string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " " };
エディターでテストの横にある緑色のエラーをクリックして、テストを実行します。
出力にはテストが失敗したことが示されており、失敗したテストに関するエラーメッセージが提供されています:「Assert.IsFalse failed.」 Expected for 'Error': false; actual: True" が表示されます。 エラーのため、"Error" の後に配列内の文字列がテストされませんでした。
手順で追加した文字列 "Error" を削除します。
テストを再実行し、テストに合格します。
ライブラリのリリース バージョンをテストする
ライブラリのデバッグ ビルドを実行するときにテストがすべて成功したら、ライブラリのリリース ビルドに対して追加の時間テストを実行します。 コンパイラの最適化など、さまざまな要因によって、デバッグ ビルドとリリース ビルド間で動作が異なる場合があります。
リリース ビルド構成でテストを実行します。
dotnet test StringLibraryTest/StringLibraryTest.csproj --configuration Release
テストに合格します。
テストのデバッグ
IDE として Visual Studio Code を使用している場合は、「Visual Studio Code を使用して .NET コンソール アプリケーションをデバッグ
Visual Studio Code では、デバッガーがアタッチされた状態でテスト プロジェクトが開始されます。 テスト プロジェクトまたは基になるライブラリ コードに追加したブレークポイントで実行が停止します。
その他のリソース
次の手順
このチュートリアルでは、クラス ライブラリを単体テストしました。 ライブラリを他のユーザーが使用できるようにするには、ライブラリをパッケージとして NuGet に発行します。 方法については、NuGet チュートリアルに従ってください。
dotnet CLI を使用してパッケージを作成して発行する
ライブラリを NuGet パッケージとして発行すると、他のユーザーがライブラリをインストールして使用できます。 方法については、NuGet チュートリアルに従ってください。
dotnet CLI を使用してパッケージをインストールして使用する
ライブラリをパッケージとして配布する必要はありません。 それを使用するコンソール アプリにバンドルできます。 コンソール アプリを発行する方法については、このシリーズの前のチュートリアルを参照してください。
Visual Studio Code を使用して .NET コンソール アプリケーションを発行する
Visual Studio Code 拡張機能 C# Dev Kit には、C# アプリとライブラリを開発するためのツールがさらに用意されています。
.NET