16

データベースのさまざまな状態に対して実行したいテストケースがあります。フィクスチャで DB にオブジェクトを挿入します (そのように維持したいと思います)。DB仮想の初期化のためのメソッドを作成し、DBのさまざまな構成に合わせてフィクスチャを特化したいと考えています。

私が考えることができる1つの方法は、次のようなことをすることです:

void doTest(){
    //test code here
}

BOOST_FIXTURE_TEST_CASE(test1, fixture1)
{
    doTest();
}

BOOST_FIXTURE_TEST_CASE(test2, fixture2)
{
    doTest();
}

BOOST_FIXTURE_TEST_CASE(test3, fixture3)
{
    doTest();
}

しかし、よりクリーンできちんとした方法はありますか? それとも、私はこれを完全に行うべきではありませんか?テストの専門家からのアドバイスに感謝します。

4

1 に答える 1

21

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' を加えたものなので、既存の名前と競合せず、ある程度意味のある名前にする必要があります。

于 2014-02-27T10:27:42.647 に答える