BOOST_FIXTURE_TEST_CASE_TEMPLATE
複数のテストをインスタンス化するために使用できます。
#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MODULE TestModuleName
#include <boost/test/unit_test.hpp>
#include <boost/mpl/vector.hpp>
struct Fixture1 { int i; Fixture1() : i(1) {} };
struct Fixture2 { int i; Fixture2() : i(2) {} };
struct Fixture3 { int i; Fixture3() : i(3) {} };
typedef boost::mpl::vector<Fixture1, Fixture2, Fixture3> Fixtures;
BOOST_FIXTURE_TEST_CASE_TEMPLATE(Test, T, Fixtures, T){
std::cout << T::i << "\n";
}
印刷します
1
2
3
mpl::vector
このコードは、 「Fixtures」の各タイプに対して独自のテスト ケースをインスタンス化します。各フィクスチャ タイプはT
(の 2 番目のパラメータBOOST_FIXTURE_TEST_CASE_TEMPLATE
)として渡されT
、テスト ケースのフィクスチャとして使用されます (最後のパラメータ)。
警告
テスト ケース (クラス) のテンプレートの性質のためT::
、フィクスチャ メンバーにアクセスして (テンプレート パラメーター) に依存する名前であることを示すために先頭に追加する必要があります。
改善
は非常に一般的なのでBOOST_FIXTURE_TEST_CASE_TEMPLATE
、何が行われているのかをより明確にする便利な「ショートカット」を定義したいと思うかもしれません:
#define MULTI_FIXTURE_TEST_CASE(NAME, TPARAM, ...) \
typedef boost::mpl::vector<__VA_ARGS__> NAME##_fixtures; \
BOOST_FIXTURE_TEST_CASE_TEMPLATE(NAME, TPARAM, NAME##_fixtures, TPARAM)
MULTI_FIXTURE_TEST_CASE(Test, T, Fixture1, Fixture2, Fixture3){
std::cout << T::i << "\n";
}
ご覧のとおり、mpl::vector
. このマクロを独自のヘッダーで定義し#include <boost/mpl/vector.hpp>
て、依存関係を見逃さないようにするのが最善だと思います。フィクスチャ リストの名前は、テスト ケースの名前に '_fixtures' を加えたものなので、既存の名前と競合せず、ある程度意味のある名前にする必要があります。