Visual Studio で C++ 用の Boost.Test を使用する

Visual Studio 2017 以降、Boost.Test テスト アダプターは Visual Studio IDE に統合されています。 これは、C++ によるデスクトップ開発ワークロードのコンポーネントです。

Test Adapter for Boost.Test

[C++ によるデスクトップ開発] ワークロードがインストールされていない場合は、Visual Studio インストーラーを開きます。 [C++ によるデスクトップ開発] ワークロードを選んで、[変更] ボタンを選択します。

Boost のインストール

Boost.Test には Boost が必要です。 Boost がインストールされていない場合は、Vcpkg パッケージ マネージャーを使うことをお勧めします。

  1. vcpkg: Windows 用の C++ パッケージ マネージャー」の説明に従って、vcpkg をインストールします (まだない場合)。

  2. Boost.Test のダイナミック ライブラリまたはスタティック ライブラリをインストールします。

    • Boost.Test のダイナミック ライブラリをインストールするには、vcpkg install boost-test を実行します。

      または

    • Boost.Test のスタティック ライブラリをインストールするには、vcpkg install boost-test:x86-windows-static を実行します。

  3. vcpkg integrate install を実行して、ライブラリで Visual Studio を構成し、Boost のヘッダーとバイナリへのパスを組み込みます。

Visual Studio 内でテストを構成する方法には選択肢があります。プロジェクトにテスト コードを含めたり、テスト用に別個のテスト プロジェクトを作成したりできます。 どちらの選択肢にも長所と短所があります。

プロジェクトにテストを追加する

Visual Studio 2017 バージョン 15.6 以降、テスト用の項目テンプレートをプロジェクトに追加できます。 テストとコードの両方が同じプロジェクト内に存在します。 テスト ビルドを生成するには、別のビルド構成を作成する必要があります。 また、デバッグ ビルドとリリース ビルドからテストを除外する必要があります。

Visual Studio 2017 バージョン 15.5 には、Boost.Test に利用できる構成済みのテスト プロジェクトまたは項目テンプレートはありません。 手順に従って、別のテスト プロジェクトを作成および構成します。

Boost.Test 項目を作成する

  1. テスト用の .cpp ファイルを追加するには、ソリューション エクスプローラーでプロジェクト ノードを右クリックし、[追加]>[新規項目] を選択します。

  2. [新しい項目の追加] ダイアログで、[インストール済み]>[Visual C++]>[テスト] を展開します。 [Boost.Test] を選択し、[追加] を選択して、プロジェクトに Test.cpp を追加します。

    Boost.Test Item Template

新しい Test.cpp ファイルには、サンプル テスト メソッドが含まれます。 このファイルには、独自のヘッダー ファイルを含め、アプリのテストを記述することができます。

テスト ファイルでは、マクロを使用して、テスト構成の新しい main ルーチンを定義することもできます。 ここでプロジェクトをビルドすると、"_main は既に main.obj で定義されています。" などの LNK2005 エラーが表示されます。

ビルド構成を作成および更新する

  1. テスト構成を作成するには、メニュー バーで [ビルド]>[構成マネージャー] を選択します。 [構成マネージャー] ダイアログで、[アクティブ ソリューション構成] の下にあるドロップダウンを開き、[新規] を選択します。 [新しいソリューション構成] ダイアログで、「Debug UnitTests」などの名前を入力します。 [設定のコピー元][デバッグ] を選択し、[OK] を選択します。

  2. デバッグ構成とリリース構成からテスト コードを除外します。ソリューション エクスプローラー で、Test.cpp ファイルを右クリックし、[プロパティ] を選択します。 [プロパティ ページ] ダイアログで、[構成] ドロップダウンの [すべての構成] を選択します。 [構成プロパティ]>[全般] を選択して、[ビルドから除外] プロパティのドロップダウンを開きます。 [はい] を選択し、[適用] を選択して変更を保存します。

  3. Debug UnitTests 構成にテスト コードを含めるには、[プロパティ ページ] ダイアログで、[構成] ドロップダウンの [Debug UnitTests] を選択します。 [ビルドから除外] プロパティの [いいえ] を選択し、[OK] を選択して変更を保存します。

  4. Debug UnitTests 構成からメイン コードを除外します。 ソリューション エクスプローラーmain 関数が含まれるファイルを右クリックし、[プロパティ] を選択します。 [プロパティ ページ] ダイアログで、[構成] ドロップダウンの [Debug UnitTests] を選択します。 [構成プロパティ]>[全般] を選択して、[ビルドから除外] プロパティのドロップダウンを開きます。 [はい] を選択し、[OK] を選択して変更を保存します。

  5. ソリューション構成を Debug UnitTests に設定し、テスト エクスプローラーでメソッドを検出できるようにプロジェクトをビルドします。

作成した構成名が "Debug" または "Release" という語で始まる限り、対応する Boost.Test ライブラリが自動的に選択されます。

項目テンプレートは、Boost.Test の単一ヘッダー バリアントを使用しますが、スタンドアロン ライブラリ バリアントを使用するように #include パスを変更できます。 詳細については、「インクルード ディレクティブを追加する」を参照してください。

別のテスト プロジェクトを作成する

多くの場合、テストに別のプロジェクトを使用する方が簡単です。 プロジェクトに特別なテスト構成を作成する必要はありません。 または、デバッグ ビルドとリリース ビルドからテスト ファイルを除外します。

別のテスト プロジェクトを作成するには

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

  2. [新しいプロジェクトの追加] ダイアログで、フィルター ドロップダウンの [C++][Windows][コンソール] を選択します。 [コンソール アプリ] テンプレートを選択し、[次へ] を選択します。

  3. プロジェクト名を設定し、[作成] を選択します。

  4. .cpp ファイル内の main 関数を削除します。

  5. Boost.Test の単一ヘッダーまたはダイナミック ライブラリ バージョンを使用している場合は、「インクルード ディレクティブを追加する」に進みます。 スタティック ライブラリ バージョンを使用している場合は、追加の構成を実行する必要があります。

    a. プロジェクト ファイルを編集するには、最初にプロジェクト ファイルをアンロードします。 ソリューション エクスプローラーで、プロジェクト ノードを右クリックして [プロジェクトのアンロード] を選択します。 次に、プロジェクト ノードを右クリックして、[<名前>.vcxproj の編集] を選択します。

    b. 次に示すように、Globals プロパティ グループに 2 つの行を追加します。

    <PropertyGroup Label="Globals">
    ....
        <VcpkgTriplet>x86-windows-static</VcpkgTriplet>
        <VcpkgEnabled>true</VcpkgEnabled>
    </PropertyGroup>
    

    c. .vcxproj ファイルを保存して閉じた後、プロジェクトを再度読み込みます。

    d. プロパティ ページを開くには、プロジェクト ノードを右クリックして、[プロパティ] を選択します。

    e. [C/C++]>[コード生成] の順に展開し、[ランタイム ライブラリ] を選択します。 スタティック ランタイム ライブラリをデバッグする場合は/MTd を、スタティック ランタイム ライブラリをリリースする場合は /MT を選択します。

    f. [リンカー]>[システム] の順に展開します。 [サブシステム][コンソール] に設定されていることを確認します。

    g. [OK] を選んで、プロパティ ページを閉じます。

インクルード ディレクティブを追加する

  1. テストの .cpp ファイルで、必要な #include ディレクティブを追加して、プログラムの型と関数がテスト コードに認識されるようにします。 別のテスト プロジェクトを使用している場合は、通常、プログラムはフォルダー階層内の兄弟レベルにあります。 「#include "../"」と入力すると IntelliSense ウィンドウが表示され、ヘッダー ファイルへの完全パスを選択できます。

    Add #include directives

    次のようにすると、スタンドアロン ライブラリを使うことができます。

    #include <boost/test/unit_test.hpp>
    

    または、次のようにすると、単一ヘッダー バージョンを使うことができます。

    #include <boost/test/included/unit_test.hpp>
    

    次に、BOOST_TEST_MODULE を定義します。

テストがテスト エクスプローラーで検出されるのに十分な例を次に示します。

#define BOOST_TEST_MODULE MyTest
#include <boost/test/included/unit_test.hpp> //single-header
#include "../MyProgram/MyClass.h" // project being tested
#include <string>

BOOST_AUTO_TEST_CASE(my_boost_test)
{
    std::string expected_value = "Bill";

    // assume MyClass is defined in MyClass.h
    // and get_value() has public accessibility
    MyClass mc;
    BOOST_CHECK(expected_value == mc.get_value());
}

テストを作成して実行する

Boost テストを作成して実行する準備が整いました。 テスト マクロについては、Boost Test ライブラリのドキュメントをご覧ください。 テスト エクスプローラーを使ってテストを検出、実行、グループ化する方法については、「テスト エクスプローラーを使用して単体テストを実行する」をご覧ください。