次の方法で共有


単体テストの基本

単体テストを作成して実行して、コードが期待どおりに動作していることを確認します。 単体テストと呼ばれるのは、プログラムの機能を個別のテスト可能な動作に分割し、個々のユニットとしてテストできるため です。 Visual Studio テスト エクスプローラーでは、単体テストを実行し、その結果を Visual Studio で表示するための柔軟で効率的な方法が提供されます。 Visual Studio は、マネージド コードとネイティブ コード用の Microsoft 単体テスト フレームワークをインストールします。 単体テスト フレームワークを使用して単体テストを作成し、それらを実行し、これらのテストの結果を報告します。 コードがまだ正常に動作していることをテストするために変更を加えた場合は、単体テストを再実行します。 Visual Studio Enterprise では、コードの変更の影響を受けるテストを検出し、入力時にバックグラウンドで実行する Live Unit Testing を使用して自動的にこれを行うことができます。

単体テストは、ソフトウェア開発ワークフローに不可欠な部分である場合、コードの品質に最も大きな影響を与えます。 関数またはその他のアプリケーション コード ブロックを記述したら、入力データの標準、境界、および正しくないケースに応答してコードの動作を検証し、コードによって行われた明示的または暗黙的な前提条件を確認する単体テストを作成します。 テスト駆動型開発では、コードを記述する前に単体テストを作成するので、単体テストを設計ドキュメントと機能仕様の両方として使用します。

テスト エクスプローラーでは、テスト エクスプローラーのアドオン インターフェイスを実装したサードパーティ製およびオープン ソースの単体テスト フレームワークを実行することもできます。 これらのフレームワークの多くは、Visual Studio 拡張機能マネージャーと Visual Studio ギャラリーを使用して追加できます。 詳細については、「サードパーティの単体テスト フレームワークインストールする」を参照してください。

概要

コーディングに直接取り組む単体テストの概要については、次のいずれかの記事を参照してください。

Bank ソリューションの例

この記事では、 MyBank という架空のアプリケーションの開発を例として使用します。 この記事の説明に従うために実際のコードは必要ありません。 テスト メソッドは C# で記述され、マネージド コード用の Microsoft 単体テスト フレームワークを使用して提示されます。 ただし、概念は他の言語やフレームワークに簡単に移行できます。

MyBank Solution 2019

MyBank Solution 2022

MyBank アプリケーションの設計における最初の試みには、個々の口座とその銀行との取引を表す勘定コンポーネントと、個々の口座を集計および管理する機能を表すデータベース コンポーネントが含まれます。

次の 2 つのプロジェクトを含む Bank ソリューションを作成します。

  • Accounts

  • BankDB

Accounts プロジェクトを設計する最初の試みには、アカウントに関する基本情報を保持するクラス、アカウントからの資産の入金や引き出しなどの任意の種類のアカウントの共通機能を指定するインターフェイス、およびチェック アカウントを表すインターフェイスから派生したクラスが含まれています。 次のソース ファイルを作成して、Accounts プロジェクトを開始します。

  • AccountInfo.cs は、アカウントの基本情報を定義します。

  • IAccount.cs は、口座の資産を入金および引き出し、口座残高を取得する方法を含む、アカウントの標準 IAccount インターフェイスを定義します。

  • CheckingAccount.csには、チェック アカウントのCheckingAccount インターフェイスを実装するIAccount クラスが含まれています。

私たちは経験から、当座預金口座から引き出さなければならないことの1つは、引き出された金額が口座残高よりも小さいことを確認することです。 そのため、IAccount.WithdrawCheckingAccount メソッドを、この条件をチェックするメソッドでオーバーライドします。 メソッドは次のようになります。

public void Withdraw(double amount)
{
    if(m_balance >= amount)
    {
        m_balance -= amount;
    }
    else
    {
        throw new ArgumentException(nameof(amount), "Withdrawal exceeds balance!");
    }
}

コードが用意されたので、次はテストします。

Copilot を使用して単体テストを作成する

Visual Studio 2026 Insiders ビルド以降では、.NET 用の GitHub Copilot テストを使用して、単体テストを自動的に生成できます。 .NET 用の GitHub Copilot テストでは、テストが生成されるだけでなく、テストがデバッグされ、テスト エクスプローラーで実行されます。 詳細については、 .NET の GitHub Copilot テストの概要を参照してください。 これは、テストを生成するために推奨される方法です。

または、Copilot /tests スラッシュ コマンドを使用して、コードから単体テストを生成することもできます。 たとえば、 /tests using NUnit Framework を入力して NUnit テストを生成できます。 詳細については、「 Copilot Chat でスラッシュ コマンドを使用する」を参照してください。

単体テストを生成して実行する

Visual Studio 2026 Insiders ビルドを使用すると、 .NET 用の GitHub Copilot テスト を使用して、単体テストを自動的に生成できます。

この記事で説明する手順のほとんどは、手動で生成されたテストに適用されます。 単体テストの詳細については、この記事の残りの部分を参照するか、「 テスト エクスプローラーでテストを実行する」セクションに進んでください。

Copilot を使用して単体テストを作成する

Copilot /tests スラッシュ コマンドを使用して、コードから単体テストを生成できます。 たとえば、 /tests using NUnit Framework を入力して NUnit テストを生成できます。 詳細については、「 Copilot Chat でスラッシュ コマンドを使用する」を参照してください。

単体テスト プロジェクトとテスト メソッドを作成する (C#)

C# の場合、多くの場合、コードから単体テスト プロジェクトと単体テスト スタブを生成する方が高速です。 または、要件に応じて単体テスト プロジェクトとテストを手動で作成することもできます。 サード パーティのフレームワークを使用してコードから単体テストを作成する場合は、 NUnit または xUnit のいずれかの拡張機能がインストールされている必要があります。 C# を使用していない場合は、このセクションをスキップし、「 単体テスト プロジェクトと単体テストを手動で作成する」に進んでください。

単体テスト プロジェクトと単体テスト スタブを生成する

  1. コード エディター ウィンドウで右クリックし、右クリック メニューから [ 単体テストの作成 ] を選択します。

    エディター ウィンドウでコンテキスト メニューを表示する

    [ 単体テストの作成 ] メニュー コマンドは、C# コードでのみ使用できます。 .NET Core または .NET Standard でこのメソッドを使用するには、Visual Studio 2019 以降が必要です。

  2. [ OK] を 選択して既定値をそのまま使用して単体テストを作成するか、単体テスト プロジェクトと単体テストの作成と名前付けに使用する値を変更します。 単体テスト メソッドに既定で追加されるコードを選択できます。

    Visual Studio の [単体テストの作成] ダイアログ ボックス

  3. 単体テスト スタブは、クラス内のすべてのメソッドの新しい単体テスト プロジェクトに作成されます。

    単体テストが作成されます

  4. 次に、単体テストを意味のあるものにするために テストを記述 する方法と、コードを徹底的にテストするために追加する必要がある追加の単体テストについて説明します。

単体テスト プロジェクトとテスト メソッドを作成する (C#)

C# の場合、多くの場合、コードから単体テスト プロジェクトと単体テスト スタブを生成する方が高速です。 または、要件に応じて単体テスト プロジェクトとテストを手動で作成することもできます。 サード パーティのフレームワークを使用してコードから単体テストを作成する場合は、 NUnit または xUnit のいずれかの拡張機能がインストールされている必要があります。 C# を使用していない場合は、このセクションをスキップし、「 単体テスト プロジェクトと単体テストを手動で作成する」に進んでください。

単体テスト プロジェクトと単体テスト スタブを生成する

  1. コード エディター ウィンドウで右クリックし、右クリック メニューから [ 単体テストの作成 ] を選択します。

    エディター ウィンドウでコンテキスト メニューを表示する

    [ 単体テストの作成 ] メニュー コマンドは、C# コードでのみ使用できます。 .NET Core または .NET Standard でこのメソッドを使用するには、Visual Studio 2019 以降が必要です。

  2. [ OK] を 選択して既定値をそのまま使用して単体テストを作成するか、単体テスト プロジェクトと単体テストの作成と名前付けに使用する値を変更します。 単体テスト メソッドに既定で追加されるコードを選択できます。

    Visual Studio の [単体テストの作成] ダイアログ ボックス

  3. 単体テスト スタブは、クラス内のすべてのメソッドの新しい単体テスト プロジェクトに作成されます。

    単体テストが作成されます

  4. 次に、単体テストを意味のあるものにするために テストを記述 する方法と、コードを徹底的にテストするために追加する必要がある追加の単体テストについて説明します。

単体テスト プロジェクトと単体テストを手動で作成する

単体テスト プロジェクトは、通常、1 つのコード プロジェクトの構造を反映します。 MyBank の例では、 AccountsTestsBankDbTests という名前の 2 つの単体テスト プロジェクトを Bank ソリューションに追加します。 テスト プロジェクト名は任意ですが、標準の名前付け規則を採用することをお勧めします。

単体テスト プロジェクトをソリューションに追加するには:

  1. ソリューション エクスプローラーで、ソリューションを右クリックし、[追加>新しいプロジェクト] を選択します。

  2. プロジェクト テンプレートの検索ボックスに 「test 」と入力して、使用するテスト フレームワークの単体テスト プロジェクト テンプレートを見つけます。 (この記事の例では、MSTest を使用します)。

  3. 次のページで、プロジェクトに名前を付けます。 この例の Accounts プロジェクトをテストするには、プロジェクトに AccountsTestsという名前を付けます。

  4. 単体テスト プロジェクトで、テスト対象のコード プロジェクトへの参照を、この例の Accounts プロジェクトに追加します。

    コード プロジェクトへの参照を作成するには:

    1. ソリューション エクスプローラーの単体テスト プロジェクトで、[ 参照 ] または [依存関係 ] ノードを右クリックし、[ プロジェクト参照の追加 ] または [ 参照の追加] を選択します。いずれかを選択します。

    2. [ 参照マネージャー ] ダイアログ ボックスで、[ ソリューション ] ノードを開き、[ プロジェクト] を選択します。 コード プロジェクト名を選択し、ダイアログ ボックスを閉じます。

各単体テスト プロジェクトには、コード プロジェクト内のクラスの名前を反映するクラスが含まれています。 この例では、 AccountsTests プロジェクトには次のクラスが含まれています。

  • AccountInfoTestsクラスには、AccountInfo プロジェクトのAccounts クラスの単体テスト メソッドが含まれています

  • CheckingAccountTests クラスには、クラスの単体テスト メソッド CheckingAccount 含まれています。

テストを記述する

使用する単体テスト フレームワークと Visual Studio IntelliSense では、コード プロジェクトの単体テストのコードを記述する手順を説明します。 テスト エクスプローラーで実行するには、ほとんどのフレームワークで単体テスト メソッドを識別するために特定の属性を追加する必要があります。 また、フレームワークでは、通常は assert ステートメントまたはメソッド属性を使用して、テスト メソッドが成功したか失敗したかを示す方法も提供されます。 その他の属性は、クラスの初期化時、および各テスト メソッドの前、および各テスト メソッドの後、およびクラスが破棄される前に実行される破棄メソッドの前にあるオプションのセットアップ メソッドを識別します。

AAA (Arrange、Act、Assert) パターンは、テスト対象のメソッドの単体テストを記述する一般的な方法です。

  • 単体テスト メソッドの Arrange セクションは、オブジェクトを初期化し、テスト対象のメソッドに渡されるデータの値を設定します。

  • Act セクションでは、配置されたパラメーターを使用して、テスト対象のメソッドを呼び出します。

  • Assert セクションでは、テスト対象のメソッドのアクションが期待どおりに動作することを確認します。 .NET の場合、 Assert クラスのメソッドは検証によく使用されます。

この例の CheckingAccount.Withdraw メソッドをテストするには、メソッドの標準的な動作を検証するテストと、残高を超える引き出しが失敗することを検証するテストの 2 つを記述します (次のコードは、.NET でサポートされている MSTest 単体テストを示しています)。 CheckingAccountTests クラスでは、次のメソッドを追加します。

[TestMethod]
public void Withdraw_ValidAmount_ChangesBalance()
{
    // arrange
    double currentBalance = 10.0;
    double withdrawal = 1.0;
    double expected = 9.0;
    var account = new CheckingAccount("JohnDoe", currentBalance);

    // act
    account.Withdraw(withdrawal);

    // assert
    Assert.AreEqual(expected, account.Balance);
}

[TestMethod]
public void Withdraw_AmountMoreThanBalance_Throws()
{
    // arrange
    var account = new CheckingAccount("John Doe", 10.0);

    // act and assert
    Assert.ThrowsException<System.ArgumentException>(() => account.Withdraw(20.0));
}

Microsoft 単体テスト フレームワークの詳細については、次のいずれかの記事を参照してください。

単体テストのタイムアウトを設定する

MSTest フレームワークを使用している場合は、 TimeoutAttribute を使用して、個々のテスト メソッドにタイムアウトを設定できます。

[TestMethod]
[Timeout(2000)]  // Milliseconds
public void My_Test()
{ ...
}

タイムアウトを許可される最大値に設定するには:

[TestMethod]
[Timeout(TestTimeout.Infinite)]  // Milliseconds
public void My_Test ()
{ ...
}

テスト エクスプローラーでテストを実行する

テスト プロジェクトをビルドすると、テスト エクスプローラーにテストが表示されます。 テスト エクスプローラーが表示されない場合は、Visual Studio メニューの [テスト] を選択し、[Windows] を選択し、[テスト エクスプローラー] を選択します (または Ctrl + ET キーを押します)。

単体テスト エクスプローラー

単体テスト エクスプローラー

テストの実行、書き込み、再実行を行うと、テスト エクスプローラー、失敗したテスト、成功したテストスキップされたテストおよびテストを実行しないグループに結果を表示できます。 ツール バーのオプションで、さまざまなグループを選択できます。

グローバル レベルの検索ボックス内のテキストを照合するか、定義済みのフィルターのいずれかを選択して、任意のビューでテストをフィルター処理することもできます。 任意のテストをいつでも実行できます。 テスト実行の結果は、エクスプローラー ウィンドウの上部にある合格/失敗バーですぐにわかります。 テスト メソッドの結果の詳細は、テストを選択すると表示されます。

テストの実行と表示

[テスト エクスプローラー] ツール バーを使用すると、目的のテストを検出、整理、実行できます。

テスト エクスプローラーのツール バーからテストを実行する

テスト エクスプローラーのツール バーからテストを実行する

[すべて実行] を選択してすべてのテストを実行するか ( + 、V キーを押すか、[実行] を選択して実行するテストのサブセット (Ctrl + 、T) を選択します。 テストを選択すると、テストの詳細ウィンドウにそのテストの詳細が表示されます。 右クリック メニュー (キーボード: F12) から [テストを開く] を選択して、選択したテストのソース コードを表示します。

個々のテストに、任意の順序で実行できない依存関係がない場合は、ツール バーの設定メニューで並列テストの実行を有効にします。 これにより、すべてのテストの実行にかかる時間が大幅に短縮されます。

ビルドのたびにテストを実行する

各ローカル ビルドの後に単体テストを実行するには、テスト エクスプローラーツール バーの設定アイコンを開き、[ ビルド後にテストを実行] を選択します。

テスト リストをフィルター処理してグループ化する

テストの数が多い場合は、 テスト エクスプローラー の検索ボックスに入力して、指定した文字列で一覧をフィルター処理できます。 フィルター 一覧から選択すると、フィルター イベントをさらに制限できます。

検索フィルターのカテゴリ

検索フィルターのカテゴリ

Button Description
[テスト エクスプローラー] グループ ボタン カテゴリ別にテストをグループ化するには、[ グループ化 ] ボタンを選択します。

詳細については、「 テスト エクスプローラーを使用した単体テストの実行」を参照してください。

Q&A

Q: 単体テストをデバッグする方法

ある:テスト エクスプローラーを使用して、テストのデバッグ セッションを開始します。 Visual Studio デバッガーを使用してコードをステップ実行すると、単体テストとテスト対象のプロジェクトの間をシームレスに行き来できます。 デバッグを開始するには:

  1. Visual Studio エディターで、デバッグする 1 つ以上のテスト メソッドにブレークポイントを設定します。

    テスト メソッドは任意の順序で実行できるため、デバッグするすべてのテスト メソッドにブレークポイントを設定します。

  2. テスト エクスプローラーで、テスト メソッドを選択し、ショートカット メニューから [選択したテストのデバッグ] を選択します。

単体テストのデバッグの詳細について説明します。

Q: TDD を使用している場合、テストからコードを生成するにはどうすればよいですか?

ある: クイック アクションを使用して、プロジェクト コードでクラスとメソッドを生成します。 生成するクラスまたはメソッドを呼び出すステートメントをテスト メソッドに記述し、エラーの下に表示される電球を開きます。 新しいクラスのコンストラクターを呼び出す場合は、メニューから [型の生成 ] を選択し、ウィザードに従ってコード プロジェクトにクラスを挿入します。 メソッドの呼び出しの場合は、[IntelliSense] メニューから [ メソッドの生成 ] を選択します。

[メソッド スタブの生成] クイック アクション メニュー

[メソッド スタブの生成] クイック アクション メニュー

Q: テストを実行するための入力として複数のデータ セットを受け取る単体テストを作成できますか。

A: はい。 データ ドリブン テスト メソッドを 使用すると、1 つの単体テスト メソッドで値の範囲をテストできます。 テストする変数値を含むデータ ソースを指定するテスト メソッドの DataRowDynamicData 、または DataSource 属性を使用します。

属性付きメソッドは、データ ソース内の行ごとに 1 回実行されます。 テスト エクスプローラーは 、イテレーションのいずれかが失敗した場合に、メソッドのテスト エラーを報告します。 メソッドのテスト結果の詳細ウィンドウには、データの各行の成功/失敗状態メソッドが表示されます。

データドリブン単体テストの詳細を確認します。

Q: 単体テストでテストされたコードの量を確認できますか。

A: はい。 Visual Studio の Visual Studio Code カバレッジ ツールを使用して、単体テストによって実際にテストされるコードの量を確認できます。 ネイティブ言語とマネージド言語、および単体テスト フレームワークで実行できるすべての単体テスト フレームワークがサポートされています。

A: はい。 Visual Studio Enterprise の Visual Studio Code カバレッジ ツールを使用して、単体テストによって実際にテストされるコードの量を確認できます。 ネイティブ言語とマネージド言語、および単体テスト フレームワークで実行できるすべての単体テスト フレームワークがサポートされています。

選択したテストまたはソリューション内のすべてのテストでコード カバレッジを実行できます。 [ コード カバレッジの結果 ] ウィンドウには、行、関数、クラス、名前空間、モジュールによって実行された製品コードのブロックの割合が表示されます。

ソリューションでテスト メソッドのコード カバレッジを実行するには、[テスト]、[すべてのテストの>を選択します。

カバレッジの結果は、[ コード カバレッジの結果 ] ウィンドウに表示されます。

コードカバレッジ結果

コードカバレッジ結果

コード カバレッジの詳細を確認します。

Q: 外部依存関係を持つメソッドをコードでテストできますか。

A: はい。 Visual Studio Enterprise をお持ちの場合は、マネージド コード用の単体テスト フレームワークを使用して記述したテスト メソッドで Microsoft Fakes を使用できます。

Microsoft Fakes では、次の 2 つの方法を使用して、外部依存関係の代替クラスを作成します。

  1. スタブは、 ターゲット依存関係クラスの親インターフェイスから派生した代替クラスを生成します。 スタブ メソッドは、ターゲット クラスのパブリック仮想メソッドに置き換えることができます。

  2. Shim では、 ランタイム インストルメンテーションを使用して、ターゲット メソッドの呼び出しを非仮想メソッドの代替 shim メソッドに転送します。

どちらの方法でも、依存関係メソッドの呼び出しの生成されたデリゲートを使用して、テスト メソッドで必要な動作を指定します。

Microsoft Fakes を使用して単体テスト メソッドを分離する方法の詳細について説明します。

Q: 他の単体テスト フレームワークを使用して単体テストを作成することはできますか?

ある: はい。次の手順に従って 、他のフレームワークを見つけてインストールします。 Visual Studio を再起動した後、ソリューションを再度開いて単体テストを作成し、ここでインストールされているフレームワークを選択します。

インストールされている他の単体テスト フレームワークを選択する

単体テスト スタブは、選択したフレームワークを使用して作成されます。

Q: 単体テストの結果をエクスポートするにはどうすればよいですか?

ある: コマンド ラインまたは Visual Studio IDE で .runsettings ファイルを使用して、単体テストを構成し、テスト結果ファイルを設定できます。 詳細については、「 LoggerRunSettings 要素」を参照してください。