2013-04-10 2 views
7

Kann das Gerät nur einmal initialisiert werden und in mehreren Testfällen innerhalb derselben Testsuite verwendet werden? Im folgenden Beispiel wird Befestigung gebaut und zerstört mehrere Male:Kann das Gerät nur einmal initialisiert und in mehreren Testfällen verwendet werden?

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() 

Aber ich will das Gerät nur einmal gebaut werden als die Testsuite beginnt und unter allen Testfällen in ihm geteilt. Ist es möglich? Der Destruktor würde nach dem Verlassen der Testsuite aufgerufen werden.
Ich verwende Boost Test Framework, habe aber kein Problem mit anderen Frameworks wie UnitTest ++.

+0

Die Absicht der Vorrichtung ist, die Umgebung für alle Testfälle vorzubereiten. Warum sollte es notwendig sein, es vor dem ersten Fall vorzubereiten, aber nicht für die anderen? – harper

+1

@harper Angenommen, ich öffne einen Socket, der in allen Testfällen verwendet werden soll. Ich möchte nicht, dass die Buchse für jeden Testfall geöffnet und geschlossen wird. Ich möchte es nur einmal öffnen, benutze es in mehreren Testfällen und schließe es nach dem letzten Testfall. –

+0

http://boost.2283326.n4.nabble.com/Boost-Test-Initialize-fixture-only-once-td2626388.html –

Antwort

19

Jeder Testfall wird aus dem Test Suite Fixture abgeleitet, die zu Beginn eines jeden Testfall aufgebaut und zerstört, wenn es (in Ihrem Fall beide test_case1 & test_case2 von F abgeleitet werden) abgeschlossen ist. Das Gerät konfiguriert und bereinigt die Umgebung für jeden einzelnen Testfall.

Für Unit-Tests ist dies normalerweise die bevorzugte Strategie - jeder Testfall ist eigenständig und vollständig atomar. In einigen Szenarien (z. B. Integrationstests) könnte es vorzuziehen sein, eine teure Ressource einmal zu erwerben und über alle Testfälle festzuhalten. Dies kann über eine GLOBALE FIXTURE erfolgen, die zu Beginn des Testlaufs erstellt und beim Beenden des Tests zerstört wird.

Wenn Testfälle eine andere Konfiguration/Konfiguration der globalen Ressourcen erfordern, kann GLOBAL FIXTURE nicht verwendet werden und Sie sollten Ihre Teststrategie überdenken, damit jeder Testfall seine eigene Umgebung konfiguriert und bereinigt.

Leider haben Testfälle keinen direkten Zugriff auf die globale Testvorrichtung, daher müssen Sie einen Mechanismus bereitstellen, der es ihnen ermöglicht, auf die Ressource zuzugreifen (z. B. über eine globale Variable oder Singleton).

Im folgenden Beispiel ist MyFixture ein Singleton, der die Ressource enthält. z.B.

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); 
} 
Verwandte Themen