2013-04-10 14 views
7

È possibile inizializzare l'apparecchiatura solo una volta e utilizzarla in più casi di test all'interno della stessa suite di test? Nel seguente esempio, apparecchio è costruito e distrutto più volte:È possibile inizializzare l'apparecchio solo una volta e usarlo in più casi di test?

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

Ma io voglio l'apparecchio per essere costruito solo una volta come inizia la suite di test e condiviso tra tutti i casi di test all'interno di esso. È possibile? Il distruttore verrebbe chiamato dopo essere uscito dalla suite di test.
Sto usando Boost Test Framework ma non ho problemi ad usare altri framework come UnitTest ++.

+0

L'intenzione del dispositivo è di preparare l'ambiente per tutti i test case. Perché dovrebbe essere necessario prepararlo prima del primo caso ma non per gli altri? – harper

+1

@harper Supponiamo di aprire un socket da utilizzare in tutti i casi di test. Non voglio che apra e chiuda il socket per ogni caso di test. Voglio aprirlo solo una volta, usarlo in più casi di test e poi chiuderlo dopo l'ultimo caso di test. –

+0

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

risposta

19

Ogni caso di test è derivato dalla Suite del dispositivo della prova, che è costruito all'inizio di ciascun test case e distrutto quando completa (nel tuo caso sia test_case1 & test_case2 sono derivati ​​da F). L'apparecchiatura configura e pulisce l'ambiente per ogni singolo caso di test.

Per il test dell'unità di solito è la strategia preferita: ogni caso di test è indipendente e completamente atomico.

In alcuni scenari (ad esempio test di integrazione) potrebbe essere preferibile acquisire una risorsa costosa una volta e trattenerla su tutti i casi di test. Questo può essere fatto tramite un GLOBAL FIXTURE, che viene costruito all'inizio dell'esecuzione del test e distrutto quando il test termina.

Se alcuni casi di test richiedono una configurazione/configurazione diversa delle risorse globali, non è possibile utilizzare un GLOBAL FIXTURE e si dovrebbe ripensare la propria strategia di test in modo che ogni test case configuri e pulisca il proprio ambiente.

Purtroppo i casi di test non hanno accesso diretto al dispositivo di prova globale, quindi sarà necessario fornire un meccanismo che consenta loro di accedere alla risorsa (ad esempio tramite una variabile globale o un singleton).

Nell'esempio seguente MyFixture è un singleton che contiene la risorsa. ad es.

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); 
} 
Problemi correlati