このチュートリアルでは、テスト プロジェクトをソリューションに追加して、単体テストを自動化する方法について説明します。
[前提条件]
このチュートリアルでは、 .NET クラス ライブラリを作成で作成するソリューションを使用します。
単体テスト プロジェクトを作成する
単体テストでは、開発および公開時に自動化されたソフトウェア テストが提供されます。 MSTest は、選択できる 3 つのテスト フレームワークのうちの 1 つです。 その他は xUnit と nUnitです。
Visual Studioを開始します。
ソリューションを開きます>.NET クラス ライブラリを作成します 。「StringLibraryTest」 という名前の新しい単体テスト プロジェクトをソリューションに追加します。
ソリューション エクスプローラー でソリューションを右クリックし、Add>New プロジェクト を選択します。
[新しいプロジェクトの追加] ページで、検索ボックスに「mstest」と入力します。 言語の一覧から C# または Visual Basic を選択し、プラットフォームの一覧から All platforms を選択します。
MSTest テスト プロジェクト テンプレートを選択し、[次へ] を選択します。
[新しいプロジェクトの構成] ページで、[プロジェクト名] ボックスに「StringLibraryTest」と入力します。 [次へ] を選びます。
[
追加情報 ] ページで、[Framework] ボックスで を選択>.NET 10 Microsoft.Testing.Platform Test runner を選択し、Create を選択します。
MSTest テスト プロジェクトの追加情報を入力する
Visual Studioプロジェクトを作成し、次のコードを使用してコード ウィンドウでクラス ファイルを開きます。 使用する言語が表示されない場合は、ページの上部にある言語セレクターを変更します。
namespace StringLibraryTest { [TestClass] public sealed class Test1 { [TestMethod] public void TestMethod1() { } } }Imports Microsoft.VisualStudio.TestTools.UnitTesting Namespace StringLibraryTest <TestClass> Public Class Test1 <TestMethod> Sub TestSub() End Sub End Class End Namespace単体テストのテンプレートで作成されたソース コードにより、次の処理が行われます。
- C# の StringLibraryTest プロジェクト ファイルに Microsoft.VisualStudio.TestTools.UnitTesting を含め、Visual Basic に Microsoft.VisualStudio.TestTools.UnitTestingをインポートします。
- クラスに属性を適用します。
-
TestMethodAttribute 属性を適用して、C# または Visual Basic
TestMethod1でTestSubを定義します。
[TestClass] でタグ付けされたテスト クラスの [TestMethod] でタグ付けされた各メソッドは、単体テストの実行時に自動的に実行されます。
Visual Studio Codeを開始します。
ソリューションを開きます。これは、 .NET クラス ライブラリを作成する で作成したものです。ソリューション エクスプローラー から New Project を選択するか、コマンド パレットから .NET: New Project を選択します。
MSTest テスト プロジェクトを選択し、"StringLibraryTest" という名前を付け、既定のディレクトリを選択して、[プロジェクトの作成] を選択します。
プロジェクト テンプレートは、次のコードを 使用して StringLibraryTest/Test1.cs を作成します。
namespace StringLibraryTest; [TestClass] public class Test1 { [TestMethod] public void TestMethod1() { } }単体テストのテンプレートで作成されたソース コードにより、次の処理が行われます。
- 属性を クラスに適用します。
- ある属性を適用して、特定の要素を定義します。
- 名前空間がインポートされます。この名前空間には、単体テストに使用される型が含まれています。 名前空間は、GlobalUsings.csの ディレクティブを使用してインポートされます。
[TestClass] でタグ付けされたテスト クラスの [TestMethod] でタグ付けされた各メソッドは、単体テストが呼び出されると自動的に実行されます。
ターミナルを開き、StringLibrary プロジェクトと ShowCase プロジェクトを含む tutorials フォルダーに移動します。
新しい MSTest テスト プロジェクトを作成します。
dotnet new mstest -n StringLibraryTestプロジェクト テンプレートは、次のコードを 使用して StringLibraryTest/Test1.cs を作成します。
namespace StringLibraryTest; [TestClass] public class Test1 { [TestMethod] public void TestMethod1() { } }単体テストのテンプレートで作成されたソース コードにより、次の処理が行われます。
- 属性を クラスに適用します。
- 属性を適用して、特定の定義を行います。
- 名前空間がインポートされます。この名前空間には、単体テストに使用される型が含まれています。
[TestClass] でタグ付けされたテスト クラスの [TestMethod] でタグ付けされた各メソッドは、単体テストが呼び出されると自動的に実行されます。
プロジェクト参照を追加する
テスト プロジェクトで クラスを操作するには、 プロジェクト内の参照を プロジェクトに追加します。
ソリューション エクスプローラー で、StringLibraryTest プロジェクトの Dependencies ノードを右クリックし、コンテキスト メニューから[プロジェクト参照の追加 を選択します。[ 参照マネージャー ] ダイアログで、[ StringLibrary] の横にあるボックスを選択します。
StringLibraryTest のプロジェクト参照として StringLibrary を追加します。
[OK] を選択.
ソリューション エクスプローラー 'StringLibraryTest' プロジェクトを右クリックし、プロジェクト参照の追加 を選択します。[StringLibrary] を選択します。
StringLibraryTest フォルダーに移動し、プロジェクト参照を追加します。
cd StringLibraryTest dotnet add reference ../StringLibrary/StringLibrary.csproj
単体テスト メソッドの追加と実行
単体テストを実行すると、属性でマークされたクラスの属性でマークされた各メソッドが自動的に実行されます。 テスト メソッドは、最初のエラーが見つかったか、メソッドに含まれるすべてのテストが成功したときに終了します。
一般的なテストでは、 クラスのメンバーが呼び出されます。 多くのアサート メソッドは最低 2 つのパラメーターを含んでいます。1 つは予期されるテスト結果、もう 1 つは実際のテスト結果です。 次の表に、 クラスの頻繁に呼び出されるメソッドをいくつか示します。
| Assert メソッド | Function |
|---|---|
Assert.AreEqual |
2 つの値または 2 つのオブジェクトが等しいことを確認します。 値またはオブジェクトが等しくない場合、アサートは失敗します。 |
Assert.AreSame |
2 つのオブジェクト変数が同じオブジェクトを参照していることを確認します。 変数が別々のオブジェクトを参照している場合、アサートは失敗します。 |
Assert.IsFalse |
条件がであることを検証します。 条件が の場合、アサートは失敗します。 |
Assert.IsNotNull |
オブジェクトが でないことを確認します。 オブジェクトが である場合、アサートは失敗します。 |
テスト メソッド内でそのメソッドを使うと、期待される例外の種類を示すことができます。 指定した例外がスローされない場合、テストは失敗します。
メソッドのテストでは、大文字で始まる文字列を多数指定する必要があります。 これらの場合ではメソッドが を返すと予測されるので、 メソッドを呼び出すことができます。 同様に、大文字以外の文字列で始まる文字列を多数指定する必要があります。 これらの場合ではメソッドが を返すと予測されるので、 メソッドを呼び出すことができます。
ライブラリ メソッドは文字列を処理するため、空の文字列 () と文字列が正常に処理されるようにする必要もあります。 空の文字列は、文字がなく、 が 0 である文字列です。 文字列は初期化されていない文字列です。 を静的メソッドとして直接呼び出し、1 つの引数を渡すことができます。 または、
3 つのメソッドを定義します。各メソッドは、文字列配列内の各要素に対して メソッドを呼び出します。 テストに失敗した場合に表示するエラー メッセージを指定できるメソッド オーバーロードを呼び出します。 このメッセージによって、エラーの原因となった文字列が識別されます。
テスト メソッドを作成するには
Test1.csまたはTest1.vbコード ウィンドウで、コードを次のコードに置き換えます。
using UtilityLibraries; namespace StringLibraryTest { [TestClass] public sealed class Test1 { [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, $"Expected for '{word}': true; Actual: {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, $"Expected for '{word}': false; Actual: {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, $"Expected for '{word ?? "<null>"}': false; Actual: {result}"); } } } }Imports Microsoft.VisualStudio.TestTools.UnitTesting Imports UtilityLibraries Namespace StringLibraryTest <TestClass> Public Class UnitTest1 <TestMethod> Public Sub TestStartsWithUpper() ' Tests that we expect to return true. Dim words() As String = {"Alphabet", "Zebra", "ABC", "Αθήνα", "Москва"} For Each word In words Dim result As Boolean = word.StartsWithUpper() Assert.IsTrue(result, $"Expected for '{word}': true; Actual: {result}") Next End Sub <TestMethod> Public Sub TestDoesNotStartWithUpper() ' Tests that we expect to return false. Dim words() As String = {"alphabet", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " "} For Each word In words Dim result As Boolean = word.StartsWithUpper() Assert.IsFalse(result, $"Expected for '{word}': false; Actual: {result}") Next End Sub <TestMethod> Public Sub DirectCallWithNullOrEmpty() ' Tests that we expect to return false. Dim words() As String = {String.Empty, Nothing} For Each word In words Dim result As Boolean = StringLibrary.StartsWithUpper(word) Assert.IsFalse(result, $"Expected for '{If(word Is Nothing, "<null>", word)}': false; Actual: {result}") Next End Sub End Class End Namespaceメソッドの大文字のテストには、ギリシャ語の大文字のアルファ (U+0391) とキリル文字の大文字 EM (U+041C) が含まれています。 メソッドの小文字のテストには、ギリシャ語の小文字のアルファ (U+03B1) とキリル文字の小文字 Ghe (U+0433) が含まれています。
メニュー バーの [ファイル] [Test1.csファイルの保存] または [ファイル] [Test1.vbに保存] を選択します。 [名前を付けてファイルを保存] ダイアログで、[保存] ボタンの横にある矢印を選択して、[エンコード付きで保存] を選択します。
[名前を付けて保存の確認] ダイアログ ボックスで、[はい] ボタンを選択してファイルを保存します。
[保存オプションの詳細設定] ダイアログの [エンコード] ドロップダウン リストから [Unicode (UTF-8 シグネチャ付き) - コードページ 65001] を選択し、[OK] の順に選択します。
ソース コードを UTF8 でエンコードされたファイルとして保存できない場合は、Visual Studio ASCII ファイルとして保存される可能性があります。 その場合、ランタイムは ASCII 範囲外の UTF8 文字を正確にデコードせず、テスト結果が正しくありません。
メニュー バーで [テスト][すべてのテストを実行する] を選択します。 テスト エクスプローラーの ウィンドウが開かない場合は、[テストテスト エクスプローラー]を選んで開いてください。 3 つのテストが [成功したテスト] セクションに表示され、[概要] セクションにはテストの実行結果が表示されています。
テストが合格したテスト エクスプローラー ウィンドウで [テスト エクスプローラー] ウィンドウと成功したテスト
StringLibraryTest/Test1.cs を開き、すべてのコードを次のコードに置き換えます。
using UtilityLibraries; namespace StringLibraryTest { [TestClass] public sealed class Test1 { [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, $"Expected for '{word}': true; Actual: {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, $"Expected for '{word}': false; Actual: {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, $"Expected for '{word ?? "<null>"}': false; Actual: {result}"); } } } }メソッドの大文字のテストには、ギリシャ語の大文字のアルファ (U+0391) とキリル文字の大文字 EM (U+041C) が含まれています。 メソッドの小文字のテストには、ギリシャ語の小文字のアルファ (U+03B1) とキリル文字の小文字 Ghe (U+0433) が含まれています。
変更を保存。
テストをビルドして実行する
ソリューション エクスプローラー で、ソリューションを右クリックし、Build を選択するか、コマンド パレットから .NET: Build を選択します。
[ テスト ] ウィンドウを選択し、[ テストの実行 ] を選択するか、コマンド パレットで [ テスト: すべてのテストを実行] を選択します。
StringLibraryTest/Test1.cs を開き、すべてのコードを次のコードに置き換えます。
using UtilityLibraries; namespace StringLibraryTest { [TestClass] public sealed class Test1 { [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, $"Expected for '{word}': true; Actual: {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, $"Expected for '{word}': false; Actual: {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, $"Expected for '{word ?? "<null>"}': false; Actual: {result}"); } } } }メソッドの大文字のテストには、ギリシャ語の大文字のアルファ (U+0391) とキリル文字の大文字 EM (U+041C) が含まれています。 メソッドの小文字のテストには、ギリシャ語の小文字のアルファ (U+03B1) とキリル文字の小文字 Ghe (U+0433) が含まれています。
変更を保存してテストを実行します。
dotnet testテストに合格する必要があります。
テストの失敗の処理
テスト駆動開発 (TDD) を行っている場合、最初にテストを作成すると、1 回目のテスト実行は失敗します。 その後、テストを成功させるコードをアプリに追加します。 このチュートリアルでは、検証するアプリ コードを記述した後にテストを作成したため、テストが失敗することはありませんでした。 テストの失敗が予想されるときにテストが失敗することを検証するには、テスト入力に無効な値を追加します。
メソッドの 配列を変更し、文字列 "Error" を含めます。
string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " " };Dim words() As String = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " " }
メニューバーから テストすべてのテスト を選択して、テストを実行します。 [テスト エクスプローラー] ウィンドウに、テストが 2 つ成功し、1 つ失敗したことが示されます。
[テスト エクスプローラー] ウィンドウで失敗したテスト
失敗したテストを選択し、を実行します。
テスト エクスプローラーの ウィンドウには、assert によって生成されたメッセージ「Assert.IsFalse に失敗しました」が表示されます。 'Error' に期待される結果: false; 実際の結果: True。失敗により、"Error" の後の配列内の文字列はテストされませんでした。
IsFalse アサーションの失敗を示す [テスト エクスプローラー] ウィンドウ
エディターでテストの横にある緑色のエラーをクリックして、テストを実行します。
出力に、テストが失敗したことを示すメッセージと失敗したテストのエラーメッセージが表示されます: "Assert.IsFalse failed." 'Error': false であることが期待されますが、実際は True です。 エラーのため、"Error" の後に配列内の文字列がテストされませんでした。
テストを実行します。
dotnet test出力はテストが失敗したことを示し、失敗したテストに対してエラーメッセージを提供します: "Assert.IsFalse failed." 'Error' の期待値: false; 実際の値: True。 エラーのため、"Error" の後に配列内の文字列がテストされませんでした。
追加した文字列 "Error" を削除します。
テストを再実行すると、テストは成功します。
ライブラリのリリース バージョンのテスト
ライブラリのデバッグ ビルドを実行するときにテストがすべて成功したら、ライブラリのリリース ビルドに対して追加の時間テストを実行します。 コンパイラの最適化など、さまざまな要因によって、デバッグ ビルドとリリース ビルド間で動作が異なる場合があります。
リリース ビルドをテストするには、次の操作を行います。
Visual Studio ツール バーで、ビルド構成を Debug から Release に変更します。
ソリューション エクスプローラー で、StringLibrary プロジェクトを右クリックし、コンテキスト メニューから Build を選択してライブラリを再コンパイルします。
メニューバーから [テスト] を選び、[すべてのテストの実行] を実行して、単体テストを行います。 テストが成功します。
リリース ビルド構成でテストを実行します。
dotnet test StringLibraryTest/StringLibraryTest.csproj --configuration Release
テストが成功します。
リリース ビルド構成でテストを実行します。
dotnet test --configuration Release
テストが成功します。
デバッグテスト
IDE としてVisual Studioを使用している場合は、「Tutorial: .NET コンソール アプリケーションをデバッグするに示されているのと同じプロセスを使用して、単体テスト プロジェクトを使用してコードをデバッグできます。 ShowCase アプリ プロジェクトを開始する代わりに、StringLibraryTests プロジェクトを右クリックし、コンテキスト メニューから [テストのデバッグ] を選択します。
Visual Studioデバッガーがアタッチされた状態でテスト プロジェクトを開始します。 テスト プロジェクトまたは基になるライブラリ コードに追加したブレークポイントで実行が停止します。
Visual Studio Codeを IDE として使用している場合は、debug a .NET コンソール アプリケーションに示されているのと同じプロセスを使用して、単体テスト プロジェクトを使用してコードをデバッグできます。 ShowCase アプリ プロジェクトを開始する代わりに、StringLibraryTest/Test1.cs を開き、7 行目から 8 行目までの現在のファイルで [テストのデバッグ] を選択します。 見つからない場合は、CtrlShiftP キーを押してコマンド パレットを開き、「ウィンドウの再読み込み」と入力します。
Visual Studio Codeデバッガーがアタッチされた状態でテスト プロジェクトを開始します。 テスト プロジェクトまたは基になるライブラリ コードに追加したブレークポイントで実行が停止します。
その他のリソース
リソースをクリーンアップする
GitHub、非アクティブ状態が 30 日後に Codespace を自動的に削除します。 このシリーズのその他のチュートリアルを調べる予定がある場合は、Codespace をプロビジョニングしたままにしておくことができます。 .NET サイトにアクセスして.NET SDK をダウンロードする準備ができたら、Codespace を削除できます。 Codespace を削除するには、ブラウザー ウィンドウを開き、 Codespaces に移動します。 ウィンドウにコードスペースの一覧が表示されます。 learn チュートリアルのコードスペースのエントリで、3 つのドット () を選択します。 次に、[削除] を選択します。
次のステップ
このチュートリアルでは、クラス ライブラリの単体テストを行いました。 ライブラリを他のユーザーが使用できるようにするには、ライブラリをパッケージとして NuGet に発行します。 方法については、次の NuGet のチュートリアルに従ってください。
dotnet CLI を使用してパッケージを作成して発行する
ライブラリを NuGet パッケージとして発行した場合、他のユーザーもそれをインストールして使用できます。 方法については、次の NuGet のチュートリアルに従ってください。
dotnet CLI を使用してパッケージをインストールして使用する
ライブラリはパッケージとして配布する必要はありません。 それが使用されるコンソール アプリにバンドルすることができます。 コンソール アプリを発行する方法については、このシリーズの前のチュートリアルを参照してください。
.NET