Visual Studio で C/C++ 用の単体テストを作成する

C++ についても、[テスト エクスプローラー] ウィンドウを使って単体テストを作成して実行できます。 他の言語の場合と同じように動作します。 テスト エクスプローラーの使い方については、「テスト エクスプローラーを使用して単体テストを実行する」をご覧ください。

Note

Live Unit Testing、コード化された UI テスト、IntelliTest などの一部の機能は、C++ についてはサポートされていません。

Visual Studio には次の C++ テスト フレームワークが含まれており、追加のダウンロードは必要ありません。

  • C++ 用の Microsoft 単体テスト フレームワーク
  • Google Test
  • Boost.Test
  • CTest

インストールされているフレームワークを使用することも、Visual Studio 内で使いたいフレームワークに対応する独自のテスト アダプターを作成することもできます。 テスト アダプターによって、単体テストが [テスト エクスプローラー] ウィンドウと統合されます。 Visual Studio Marketplace では複数のサードパーティ製アダプターを利用できます。 詳細については、「サードパーティ製の単体テスト フレームワークをインストールする」をご覧ください。

Visual Studio 2017 以降 (Professional および Enterprise)

C++ 単体テスト プロジェクトでは CodeLens がサポートされています。

Visual Studio 2017 以降 (すべてのエディション):

  • Google Test アダプターは、C++ によるデスクトップ開発ワークロードの既定のコンポーネントとして含まれます。 ソリューションに追加できるプロジェクト テンプレートが含まれています。 ソリューション エクスプローラーでソリューション ノードを右クリックして、ショートカット メニューで [追加]>[新しいプロジェクト] の順に選択してプロジェクト テンプレートを追加します。 また、[ツール]>[オプション] を使用して構成できるオプションもあります。 詳細については、「方法:Visual Studio での Google Test の使用に関する記事をご覧ください。

  • Boost.Test は、C++ によるデスクトップ開発ワークロードの既定のコンポーネントとして含まれます。 テスト エクスプローラーとは統合されていますが、現時点ではプロジェクト テンプレートが含まれていません。 手動で構成する必要があります。 詳細については、「方法:Visual Studio での Boost.Test の使用に関する記事をご覧ください。

  • CTest のサポートは、C++ によるデスクトップ開発ワークロードの一部である C++ CMake ツール コンポーネントで組み込まれます。 詳細については、「方法:Visual Studio での CTest の使用に関する記事をご覧ください。

以前のバージョンの Visual Studio

Google Test アダプターと Boost.Test アダプターは、Visual Studio Marketplace でダウンロードできます。 「Test adapter for Boost.Test」 (Boost.Test 用テスト アダプター) および「Test adapter for Google Test」 (Google Test 用テスト アダプター) にあります。

ヒント

また、コパイロット /tests スラッシュ コマンドを使用して、コードから単体テストを生成することもできます。 たとえば、/tests using Boost framework を入力して Boost.Test テストを生成できます。 詳細については、「コパイロット チャットの使用」を参照してください。

テストの基本的なワークフロー

以下のセクションでは、C++ の単体テストを始めるための基本的な手順を示します。 基本的な構成は、Microsoft と Google どちらのテスト フレームワークでも似ています。 Boost.Test では、テスト プロジェクトを手動で作成することが必要です。

Visual Studio 2022 でテスト プロジェクトを作成する

1 つまたは複数のテスト プロジェクト内で単体テストを定義して実行します。 テスト プロジェクトは、実行可能ファイル内のコードを呼び出し、その動作を報告する個別のアプリを作成します。 テストするコードと同じソリューション内にテスト プロジェクトを作成します。

既存のソリューションに新しいテスト プロジェクトを追加するには、

  1. ソリューション エクスプローラーで、ソリューション ノードを右クリックします。
  2. ポップアップ メニューで、[追加]>[新しいプロジェクト] の順に選択します。
  3. [言語][C++] に設定し、検索ボックスに「test」と入力します。 次の図は、C++ によるデスクトップ開発ワークロードと UWP 開発ワークロードがインストールされている場合に選ぶことができるテスト プロジェクトです。

Visual Studio 2022 の C++ テスト プロジェクト

Visual Studio 2019 でテスト プロジェクトを作成する

1 つまたは複数のテスト プロジェクト内でテストを定義して実行します。 テストするコードと同じソリューション内にプロジェクトを作成します。 既存のソリューションに新しいテスト プロジェクトを追加するには、

  1. ソリューション エクスプローラーで、ソリューション ノードを右クリックします。
  2. ポップアップ メニューで、[追加]>[新しいプロジェクト] の順に選択します。
  3. [言語][C++] に設定し、検索ボックスに「test」と入力します。 次の図は、C++ によるデスクトップ開発ワークロードと UWP 開発ワークロードがインストールされている場合に選ぶことができるテスト プロジェクトです。

Visual Studio 2019 の C++ テスト プロジェクト

ソリューション内の他のプロジェクトへの参照を作成する

テスト対象プロジェクト内の関数にアクセスできるようにするには、テスト プロジェクト内のプロジェクトへの参照を追加します。 ソリューション エクスプローラーでプロジェクト ノードを右クリックして、ポップアップ メニューを表示します。 [追加]>[参照]の順に選択します。 [参照の追加] ダイアログで、テストするプロジェクトを選択します。

参照の追加

テストする関数がテスト コードによってエクスポートされない場合は、出力された .obj または .lib のファイルをテスト プロジェクトの依存関係に追加します。 詳細については、「オブジェクト ファイルまたはライブラリ ファイルにテストをリンクするには」を参照してください。 main 関数や、wmainWinMainDllMain などの別の標準エントリ ポイントを持つオブジェクト ファイルは含めないでください。 新しいソース ファイルをプロジェクトに追加する場合は、対応するオブジェクト ファイルを含むようにテスト プロジェクトの依存関係を更新してください。

ヘッダー ファイルの #include ディレクティブを追加する

次に、単体テストの .cpp ファイルで、テスト対象の型および関数が宣言されているヘッダー ファイルの #include ディレクティブを追加します。 「#include "」と入力すると、IntelliSense がアクティブになって選択を支援します。 その他のヘッダーにも繰り返します。

ソリューション エクスプローラーのスクリーンショット。インクルードするヘッダー ファイルが強調表示された IntelliSense で追加される #include ディレクティブが示されています。

ソース ファイル内の各 include ステートメントに完全なパスを入力しなくても済むように、必要なフォルダーを [プロジェクト]>[プロパティ]>[C/C++]>[全般]>[追加のインクルード ディレクトリ] に追加します。

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

Note

ここでは、C/C++ の Microsoft 単体テスト フレームワークの構文を示します。 詳細については、「Microsoft.VisualStudio.TestTools.CppUnitTestFramework API リファレンス」をご覧ください。 Google Test については、Google Test の入門に関するドキュメントをご覧ください。 Boost.Test については、「Boost Test Library: The Unit Test Framework」(Boost Test ライブラリ: 単体テスト フレームワーク) をご覧ください。

テスト プロジェクトの .cpp ファイルには、スタブ クラスとメソッドの定義が含まれています。 テスト コード記述方法の例として提供されています。 シグネチャでは TEST_CLASS および TEST_METHOD マクロが使われています。これにより、 [テスト エクスプローラー] ウィンドウでメソッドを見つけることができます。

[テスト エクスプローラー] ウィンドウのスクリーンショット。TEST_CLASS および TEST_METHOD のマクロを使用して、スタブ クラスとメソッドを含む unittest1.cpp コード ファイルが示されています。

TEST_CLASS と TEST_METHOD は、Microsoft ネイティブ テスト フレームワークの一部です。 テスト エクスプローラーは、サポートされている他のフレームワークのテスト メソッドも同様の方法で検出します。

TEST_METHOD は void を返します。 テスト結果を生成するには、Assert クラスの静的メソッドを使って、期待される結果に対して実際の結果をテストします。 次の例では、MyClassstd::string を受け取るコンストラクターがあるものとします。 この例では、コンストラクターでクラスが期待した方法で初期化されることをどのようにテストできるかを示します。

TEST_METHOD(TestClassInit)
{
    std::string name = "Bill";
    MyClass mc(name);
    Assert::AreEqual(name, mc.GetName());
}

前の例では、Assert::AreEqual の呼び出しの結果によって、テストが成功か失敗かが決まります。 Assert クラスには、期待される結果と実際の結果を比較する他の多くのメソッドが含まれています。

テスト メソッドに "特徴" を追加して、テストの所有者、優先度、他の情報を指定できます。 その後、これらの値を使って、テスト エクスプローラーでテストの並べ替えやグループ化を行うことができます。 詳細については、「テスト エクスプローラーを使用して単体テストを実行する」を参照してください。

テストの実行

  1. [テスト] メニューで、[Windows][テスト エクスプローラー] の順に選択します。 次の図は、テストがまだ実行されていないテスト プロジェクトです。

    テスト実行前のテスト エクスプローラー

    注意

    CTest とテスト エクスプローラーの統合はまだ利用できません。 CTest のテストは CMake のメイン メニューから実行します。

  2. ウィンドウにいずれかのテストが不足している場合は、ソリューション エクスプローラーで、該当するノードを右クリックし、[ビルド] または [リビルド] を選択して、テスト プロジェクトをビルドします。

  3. テスト エクスプローラーで、[すべて実行] を選択するか、または実行する特定のテストを選択します。 ブレークポイントを有効にした場合のデバッグ モードでのテストの実行など他のオプションについては、テストを右クリックします。 すべてのテストの実行後、ウィンドウには合格したテストと失敗したテストが表示されます。

    テスト実行後のテスト エクスプローラー

失敗したテストについては、原因の診断に役立つ詳細がメッセージで表示されます。 失敗したテストを右クリックして、ポップアップ メニューを表示します。 [デバッグ] を選択し、失敗が発生した関数をステップ実行できます。

テスト エクスプローラーの使い方については、「テスト エクスプローラーを使用して単体テストを実行する」をご覧ください。

単体テストの詳細については、「単体テストの基本」をご覧ください。

CodeLens を使用する

Visual Studio 2017 以降 (Professional および Enterprise エディション)

CodeLens を使用すると、コード エディターを開いたままで単体テストの状態をすばやく確認できます。

次のいずれかの方法で、C++ 単体テスト プロジェクト用に CodeLens を初期化します。

  • テスト プロジェクトまたはソリューションを編集してビルドします。
  • プロジェクトまたはソリューションをリビルドします。
  • [テスト エクスプローラー] ウィンドウからテストを実行します。

初期化されたら、各単体テストの上にテストの状態アイコンが表示されます。

C++ の CodeLens アイコン

アイコンを選択して詳細を表示するか、単体テストを実行またはデバッグします。

C++ の CodeLens の実行およびデバッグ