テスト エクスプローラーを使用した既存の C++ アプリケーションの単体テスト

既存のアプリケーションを変更する場合は、単体テストでのカバレッジ率が十分であることを事前に確認しておくことをお勧めします。 これにより、変更がバグの原因になっていないことを確信できます。 アプリケーションに既存の単体テストがない場合は、このトピックに示されている手法を使用して追加できます。 このトピックでは、既存の Visual C++ コードに単体テストを追加する方法を説明します。コードのテスト方法を決定してから、テストを作成、記述、および実行します。

コードのテスト方法の決定

既存の C++ プロジェクトを開いて調べ、単体テストをどのように追加するかを決定します。 場合によってはモデリング ツールを使用します。これらは、コード内の依存関係を表示し、各パーツの相互作用を理解するために役立ちます。 詳細については、「コードの視覚化」を参照してください。

変更は、小さいタスクに分割して行うことをお勧めします。 小さな変更をそれぞれ行う前に、変更されない動作を確認するための単体テストを記述してください。 これらのテストは、変更を加えた後も引き続き合格になります。 たとえば、並べ替え関数を変更して、人物の一覧が名ではなく姓で並べ替えられるようにする場合、入力されたすべての名前が出力に表示されていることを確認する単体テストを記述します。 変更を加えた後で、新しい動作に対して新しい単体テストを追加する必要が生じることがあります。

可能であれば、大多数またはすべての単体テストで、エクスポートされた関数のみが使用されるようにする必要があります。 ただし、アプリケーション全体のうち、ごく一部のみにわずかな変更を行う場合は、エクスポートされていない関数を使用することもできます。 たとえば、内部関数を呼び出すテストや、内部変数の値を設定および取得するテストが必要になることがあります。

テストするインターフェイスを公開するかどうかによって、製品コードをテストする方法はいくつかあります。 次のいずれかの方法を選択してください。

単体テストでは、テスト対象のコードからエクスポートされた関数のみを使用します。
別のテスト プロジェクトを追加します。 このテスト プロジェクトに、テスト対象のプロジェクトへの参照を追加します。

手順「テスト プロジェクトからエクスポートされた関数を参照するには」に移動します。

テスト対象のコードが .exe ファイルとしてビルドされます。
別のテスト プロジェクトを追加します。 これを出力オブジェクト ファイルにリンクします。

手順「テストをオブジェクトまたはライブラリ ファイルにリンクするには」に移動します。

単体テストはプライベート関数とデータを使用する必要があり、テスト対象のコードはスタティック ライブラリとしてビルドできます。
.lib ファイルにコンパイルされるように、テスト対象のプロジェクトを変更します。 テスト対象のプロジェクトを参照する、別のテスト プロジェクトを追加します。

この方法には、プライベート メンバーをテストで使用できる一方で、独立したプロジェクトにテストが保持されるという利点があります。 ただし、ダイナミック リンク ライブラリ (.dll) を必要とする一部のアプリケーションには適していないことがあります。

テスト対象のコードをスタティック ライブラリに変更するには」の手順に移動します。

単体テストはプライベート関数とデータを使用する必要があり、コードをダイナミック リンク ライブラリ (DLL) としてビルドする必要があります。
製品コードと同じプロジェクトに単体テストを追加します。

同じプロジェクトに単体テストを追加するには」の手順に移動します。

テストの作成

  • テスト対象のプロジェクトによってエクスポートされていないメンバーをテストで使用する必要があり、テスト対象のプロジェクトがダイナミック ライブラリとしてビルドされる場合は、これをスタティック ライブラリに変換することを検討します。

    1. ソリューション エクスプローラーで、テスト対象プロジェクトのショートカット メニューの [プロパティ] をクリックします。 プロジェクトのプロパティ ウィンドウが開きます。

    2. [構成プロパティ][全般] の順にクリックします。

    3. [構成の種類][スタティック ライブラリ (.lib)] に設定します。

    手順「テストをオブジェクトまたはライブラリ ファイルにリンクするには」を続行します。

テスト プロジェクトからエクスポートされた関数を参照するには

  • テストする関数がテスト対象のプロジェクトからエクスポートされる場合は、テスト プロジェクトからコード プロジェクトへの参照を追加できます。

    1. C++ のテスト プロジェクトを作成します。

      1. [ファイル] メニューで、[新規][プロジェクト][Visual C++]、[テスト][C++ 単体テスト プロジェクト] の順にクリックします。
    2. ソリューション エクスプローラーで、テスト プロジェクトのショートカット メニューの [参照] をクリックします。 プロジェクトのプロパティ ウィンドウが開きます。

    3. [共通プロパティ][Framework と参照] の順にクリックし、[新しい参照の追加] をクリックします。

    4. [プロジェクト] をクリックし、テスト対象のプロジェクトを選択します。

      [追加] ボタンをクリックします。

    5. テスト プロジェクトのプロパティで、テスト対象プロジェクトの場所をインクルード ディレクトリに追加します。

      [構成プロパティ][VC++ ディレクトリ][インクルード ディレクトリ] の順にクリックします。

      [編集] をクリックし、テスト対象プロジェクトのヘッダー ディレクトリを追加します。

    単体テストの記述」に移動します。

オブジェクト ファイルまたはライブラリ ファイルにテストをリンクするには

  • テストする関数がテスト対象のコードでエクスポートされない場合は、出力された .obj ファイルまたは .lib ファイルをテスト プロジェクトの依存関係に追加できます。

    1. C++ のテスト プロジェクトを作成します。

      1. [ファイル] メニューで、[新規][プロジェクト][Visual C++]、[テスト][C++ 単体テスト プロジェクト] の順にクリックします。
    2. ソリューション エクスプローラーで、テスト プロジェクトのショートカット メニューの [プロパティ] をクリックします。 プロジェクトのプロパティ ウィンドウが開きます。

    3. [構成プロパティ][リンカー][入力][追加の依存ファイル] の順にクリックします。

      [編集] をクリックし、.obj ファイルまたは .lib ファイルの名前を追加します。 完全パス名は使用しないでください。

    4. [構成プロパティ][リンカー][全般][追加のライブラリ ディレクトリ] の順にクリックします。

      [編集] をクリックし、.obj ファイルまたは .lib ファイルのディレクトリ パスを追加します。 一般的にパスは、テスト対象プロジェクトのビルド フォルダー内になります。

    5. [構成プロパティ][VC++ ディレクトリ][インクルード ディレクトリ] の順にクリックします。

      [編集] をクリックし、テスト対象プロジェクトのヘッダー ディレクトリを追加します。

    単体テストの記述」に移動します。

同じプロジェクトに単体テストを追加するには

  1. 単体テストに必要なヘッダーおよびライブラリ ファイルが含まれるように、製品コード プロジェクトのプロパティを変更します。

    1. ソリューション エクスプローラーで、テスト対象プロジェクトのショートカット メニューの [プロパティ] をクリックします。 プロジェクトのプロパティ ウィンドウが開きます。

    2. [構成プロパティ][VC++ ディレクトリ] の順にクリックします。

    3. インクルード ディレクトリおよびライブラリ ディレクトリを編集します。

      インクルード ディレクトリ $(VCInstallDir)UnitTest\include;$(IncludePath)
      ライブラリ ディレクトリ $(VCInstallDir)UnitTest\lib;$(LibraryPath)
  2. C++ 単体テスト ファイルを追加します。

    • ソリューション エクスプローラーで、プロジェクトのショートカット メニューを開き、[追加][新しい項目][C++ 単体テスト] の順にクリックします。

    単体テストの記述」に移動します。

単体テストの記述

  1. 各単体テスト コード ファイルに、テスト対象プロジェクトのヘッダー用に #include ステートメントを追加します。

  2. 単体テスト コード ファイルに、テスト クラスとメソッドを追加します。 例:

    #include "stdafx.h"  
    #include "CppUnitTest.h"  
    #include "MyProjectUnderTest.h"  
    using namespace Microsoft::VisualStudio::CppUnitTestFramework;  
    namespace MyTest  
    {  
      TEST_CLASS(MyTests)  
      {  
      public:  
          TEST_METHOD(MyTestMethod)  
          {  
              Assert::AreEqual(MyProject::Multiply(2,3), 6);  
          }  
      };  
    }  
    

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

テストを実行

  1. [表示] メニューで、 [その他のウィンドウ][テスト エクスプローラー]の順にクリックします。

  2. テスト エクスプローラーで [すべて実行]をクリックします。

    詳細については、「クイック スタート: テスト エクスプローラーによるテスト駆動開発」を参照してください。