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では、Microsoft 以外のアダプターがいくつか用意されています。 詳細については、「単体テスト フレームワークをインストールする」を参照してください。
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 つまたは複数のテスト プロジェクト内で単体テストを定義して実行します。 テスト プロジェクトは、実行可能ファイル内のコードを呼び出し、その動作を報告する個別のアプリを作成します。 テストするコードと同じソリューション内にテスト プロジェクトを作成します。
既存のソリューションに新しいテスト プロジェクトを追加するには:
- ソリューション エクスプローラーで、ソリューション ノードを右クリックします。
- コンテキスト メニューの [新しいプロジェクト
追加] 選択します。 言語 を C++に設定し、検索ボックス テスト を入力します。 次のスクリーンショットは、デスクトップ開発と C++ と UWP 開発 ワークロードがインストールされている場合に使用できるテスト プロジェクトを示しています。
Visual Studio 2019 でテスト プロジェクトを作成する
1 つまたは複数のテスト プロジェクト内でテストを定義して実行します。 テストするコードと同じソリューション内にプロジェクトを作成します。
既存のソリューションに新しいテスト プロジェクトを追加するには:
- ソリューション エクスプローラーで、ソリューション ノードを右クリックします。
- コンテキスト メニューの [新しいプロジェクト
追加] 選択します。 言語 を C++に設定し、検索ボックス テスト を入力します。 次のスクリーンショットは、デスクトップ開発と C++ と UWP 開発 ワークロードがインストールされている場合に使用できるテスト プロジェクトを示しています。
ソリューション内の他のプロジェクトへの参照を作成する
テスト対象プロジェクト内の関数にアクセスできるようにするには、テスト プロジェクト内のプロジェクトへの参照を追加します。 ソリューション エクスプローラー で、テスト プロジェクトを展開します。 [参照] を右クリックして、[追加]>[参照] を選びます。 [参照の追加] ダイアログ ボックスで、テストするプロジェクトを選びます。
オブジェクトまたはライブラリ ファイルのリンク
テスト コードでテストしたい関数がエクスポートされていない場合は、出力.obj
または .lib
ファイルをテスト プロジェクトの依存関係に追加してください。 詳細については、「オブジェクト ファイルまたはライブラリ ファイルにテストをリンクするには」を参照してください。 main
関数や、wmain
、WinMain
、DllMain
などの別の標準エントリ ポイントを持つオブジェクト ファイルは含めないでください。 新しいソース ファイルをプロジェクトに追加する場合は、対応するオブジェクト ファイルを含むようにテスト プロジェクトの依存関係を更新してください。
ヘッダー ファイルの #include ディレクティブを追加する
単体テスト .cpp
ファイルに、テスト対象の型や関数を宣言するヘッダーファイル用の #include
ディレクティブを追加します。 「#include "
」と入力すると、IntelliSense がアクティブになって選択を支援します。 その他のヘッダーにも繰り返します。
ヒント
ソース ファイル内の各 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 は、Microsoft ネイティブ テスト フレームワークの一部です。 テスト エクスプローラーは、サポートされている他のフレームワークのテスト メソッドも同様の方法で検出します。
TEST_METHOD は void を返します。 テスト結果を生成するには、Assert
クラスの静的メソッドを使って、期待される結果に対して実際の結果をテストします。 次の例では、MyClass
に std::string
を受け取るコンストラクターがあるものとします。 この例では、コンストラクターでクラスが期待した方法で初期化されることをどのようにテストできるかを示します。
TEST_METHOD(TestClassInit)
{
std::string name = "Bill";
MyClass mc(name);
Assert::AreEqual(name, mc.GetName());
}
前の例では、Assert::AreEqual
の呼び出しの結果によって、テストが成功か失敗かが決まります。 Assert
クラスには、期待される結果と実際の結果を比較する他の多くのメソッドが含まれています。
テスト メソッドに "特徴" を追加して、テストの所有者、優先度、他の情報を指定できます。 その後、これらの値を使って、テスト エクスプローラーでテストの並べ替えやグループ化を行うことができます。 詳細については、「テスト エクスプローラーを使用して単体テストを実行する」を参照してください。
テストの実行
[
テスト ] メニューの [テスト エクスプローラー]選択します。 次の図は、テストを実行する前のテスト プロジェクトを示しています。 Note
CTest とテスト エクスプローラーの統合はまだ利用できません。 CTest のテストは CMake のメイン メニューから実行します。
ウィンドウにいずれかのテストが不足している場合は、ソリューション エクスプローラーで、該当するノードを右クリックし、[ビルド] または [リビルド] を選択して、テスト プロジェクトをビルドします。
テスト エクスプローラーで、[すべて実行] を選択するか、または実行する特定のテストを選択します。 ブレークポイントを有効にした場合のデバッグ モードでのテストの実行など他のオプションについては、テストを右クリックします。 すべてのテストの実行後、ウィンドウには合格したテストと失敗したテストが表示されます。
失敗したテストについては、原因の診断に役立つ詳細がメッセージで表示されます。 失敗したテストを右クリックして、ポップアップ メニューを表示します。 [デバッグ] を選択し、失敗が発生した関数をステップ実行できます。
テスト エクスプローラーの使い方については、「テスト エクスプローラーを使用して単体テストを実行する」をご覧ください。
単体テストの詳細については、「単体テストの基本」をご覧ください。
CodeLens を使用する
Visual Studio 2017 以降 (Professional および Enterprise エディション)
CodeLens を使用すると、コード エディターを開いたままで単体テストの状態をすばやく確認できます。
次のいずれかの方法で、C++ 単体テスト プロジェクト用に CodeLens を初期化します。
- テスト プロジェクトまたはソリューションを編集してビルドします。
- プロジェクトまたはソリューションをリビルドします。
- [テスト エクスプローラー] ウィンドウからテストを実行します。
CodeLens を初期化すると、各単体テストの上にテスト状態アイコンが表示されます。
アイコンを選択して詳細を表示するか、単体テストを実行またはデバッグします。