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