2013-04-10 1 views
7

Fixture를 한 번만 초기화하고 같은 테스트 스위트 내의 여러 테스트 케이스에서 사용할 수 있습니까? 다음 예에서, 고정은 건설하고 여러 번 파괴되어조명기를 한 번만 초기화하고 여러 테스트 케이스에서 사용할 수 있습니까?

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

하지만 난 고정 번만 테스트 스위트를 시작으로 를 건설하고 그 안에 모든 테스트 케이스를 공유 할 싶어요. 가능한가? 소멸자는 테스트 스위트를 종료 한 후 호출됩니다.
Boost Test Framework를 사용하고 있지만 UnitTest ++와 같은 다른 프레임 워크를 사용하여 문제가 없습니다.

+0

모든 테스트 케이스의 환경을 준비하는 것이 픽스처의 의도입니다. 첫 번째 경우에는 준비해야하지만 다른 경우에는 준비하지 않아도되는 이유는 무엇입니까? – harper

+1

@harper 모든 테스트 케이스에서 사용할 소켓을 열고 있다고 가정합니다. 나는 각 테스트 케이스에 대해 소켓을 열고 닫고 싶지 않다. 한 번만 열어 여러 테스트 케이스에서 사용하고 마지막 테스트 케이스가 완료된 후에 닫고 싶습니다. –

+0

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

답변

19

각 테스트 케이스가 완료되면 (두 test_case1 & test_case2F로부터 유도되는 케이스에서) 테스트 케이스의 시작시에 구성되고 소멸되는 테스트 스위트기구로부터 유도된다. Fixture는 각각의 개별 테스트 케이스를 위해 환경을 설정하고 정리합니다.

단위 테스트의 경우 일반적으로이 방법을 사용하는 것이 좋습니다. 각 테스트 사례는 독립적이며 완전히 원자 적입니다.

일부 시나리오 (예 : 통합 테스트)에서는 값 비싼 리소스를 한 번만 가져 와서 모두 테스트 사례 이상으로 유지하는 것이 좋습니다. 이는 테스트 실행의 시작시 생성되고 테스트가 종료 될 때 파괴되는 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); 
} 
관련 문제