9

フィクスチャを 1 回だけ初期化して、同じテスト スイート内の複数のテスト ケースで使用することは可能ですか? 次の例では、フィクスチャが複数回構築および破棄されます。

struct F {
    F() : i( 0 ) { BOOST_TEST_MESSAGE( "setup fixture" ); }
    ~F()         { BOOST_TEST_MESSAGE( "teardown fixture" ); }

    int i;
};


BOOST_FIXTURE_TEST_SUITE( s, F )

BOOST_AUTO_TEST_CASE( test_case1 )
{
    BOOST_CHECK( i == 1 );
}

BOOST_AUTO_TEST_CASE( test_case2 )
{
    BOOST_CHECK_EQUAL( i, 0 );
}

BOOST_AUTO_TEST_SUITE_END()

しかし、テスト スイートの開始時にフィクスチャを1 回だけ構築し、その中のすべてのテスト ケースで共有したいと考えています。出来ますか?デストラクタは、テスト スイートを終了した後に呼び出されます。
Boost Test Framework を使用していますが、UnitTest++ などの他のフレームワークを使用しても問題ありません。

4

1 に答える 1

26

各テスト ケースは、各テスト ケースの開始時に構築され、完了時に破棄されるテスト スイート フィクスチャから派生します (この場合、test_case1&test_case2は両方とも から派生しますF)。フィクスチャは、個々のテスト ケースごとに環境を構成およびクリーンアップします。

単体テストの場合、これは通常推奨される戦略です。各テスト ケースは独立しており、完全にアトミックです。

一部のシナリオ (統合テストなど) では、高価なリソースを一度取得して、すべてのテスト ケースで保持することが望ましい場合があります。これは、テスト実行の開始時に構築され、テストの終了時に破棄される GLOBAL FIXTURE を介して実行できます。

テスト ケースでグローバル リソースの別のセットアップ / 構成が必要な場合、GLOBAL FIXTURE は使用できません。各テスト ケースが独自の環境を構成およびクリーンアップするように、テスト戦略を再考する必要があります。

残念ながら、テスト ケースはグローバル テスト フィクスチャに直接アクセスできません。そのため、リソースにアクセスできるメカニズムを提供する必要があります (たとえば、グローバル変数またはシングルトンを介して)。

以下の例MyFixtureは、リソースを保持するシングルトンです。例えば

struct MyFixture
{
    static MyFixture*& instance() { static MyFixture* s_inst = 0;
    return s_inst; }

    MyFixture()
    {
        instance() = this;
        x = 10;
        BOOST_TEST_MESSAGE( "setup fixture" );
    }

    ~MyFixture()
    {
        BOOST_TEST_MESSAGE( "teardown fixture" );
    }

    int x;
};

BOOST_GLOBAL_FIXTURE(MyFixture)


BOOST_AUTO_TEST_CASE(TEST_1)
{
    BOOST_CHECK(MyFixture::instance()->x == 10);
    MyFixture::instance()->x = 12;
}
BOOST_AUTO_TEST_CASE(TEST_2)
{
    BOOST_CHECK(MyFixture::instance()->x == 12);
}
于 2013-04-10T07:11:27.987 に答える