2013-06-04 4 views
11

BOOST 단위 테스트를 어떻게 건너 뛸 수 있습니까? 나는 그들을 실행중인 플랫폼 (예를 들어)에 따라 프로그램 적으로 단위 테스트를 건너 뛰고 싶습니다. 현재 솔루션은 다음과 같습니다.BOOST 단위 테스트를 건너 뛰는 방법은 무엇입니까?

#define REQUIRE_LINUX char * os_cpu = getenv("OS_CPU"); if (os_cpu != "Linux-x86_64") return; 

BOOST_AUTO_TEST_CASE(onlylinux) { 
    REQUIRE_LINUX 
    ... 
    the rest of the test code. 
} 

(빌드 환경은 변수 OS_CPU를 설정합니다.) 이것은보기 흉하고 오류가 발생하기 쉽고, 자동 건너 뛰기와 같이 사용자가 모르는 사이에 테스트를 건너 뛸 수 있습니다.

임의의 로직을 기반으로 부스트 유닛 테스트를 깨끗하게 건너 뛸 수 있습니까?

답변

2

스킵하지 않고 등록하는 것을 막을 수 있습니다. 는 boost.test의 수동 테스트 등록을 사용할 수 있음을 달성하기

#include <boost/test/included/unit_test.hpp> 
using namespace boost::unit_test; 

//____________________________________________________________________________// 

void only_linux_test() 
{ 
    ... 
} 

//____________________________________________________________________________// 

test_suite* 
init_unit_test_suite(int argc, char* argv[]) 
{ 
    if(/* is linux */) 
     framework::master_test_suite(). 
      add(BOOST_TEST_CASE(&only_linux_test)); 

    return 0; 
} 

자세한 내용

에 대한 http://www.boost.org/doc/libs/1_53_0/libs/test/doc/html/utf/user-guide/test-organization/manual-nullary-test-case.html를 참조하십시오 또 다른 가능성은 BOOST_AUTO_TEST_CASE와 #ifdef와 ... #endif 다음을 사용하는 것입니다. 대상 플랫폼에서 코드를 컴파일하는 경우 정의 된 정의가 필요합니다.

#ifdef PLATFORM_IS_LINUX 

BOOST_AUTO_TEST_CASE(onlyLinux) 
{ 
    ... 
} 
#endif 

이 정의는 예를 들어 빌드 환경에서 설정할 수 있습니다.

+0

내가 ifdefs를 사용할 수 없습니다, 이러한 기준 중 일부에서 실행 시간을 결정해야합니다. 아마도 당신의 등록 제안과 같은 것을 사용할 것입니다. – dbn

3

수동으로 테스트 케이스를 등록하는 것은 지루하고 오류를 발생시키기 쉽습니다. 테스트 케이스를 구별 할 필요가있는 플랫폼에 의해서만 필요한 경우, 빌드 시스템을 구성하여 관련이없는 플랫폼에서 관련없는 테스트 케이스를 컴파일하지 않아도됩니다. 또는 Boost.Predef을 사용하여 OS, 컴파일러 등에 대해 알고 싶은 모든 것에 필요한 사전 처리기 기호를 정의하여 특정 테스트를 #ifdef 할 수 있습니다.

마지막으로,이 기준은 런타임에만 알 수 있고 실행중인 플랫폼과 관련이없는 경우 특정 기준에 따라 달라지는 테스트를 제품군으로 그룹화하고 빌드에서 사용하는 명령 줄을 조정합니다 런타임 기준에 따라 해당 스위트 만 실행합니다.

4

enable_if/enable/precondition 데코레이터를 사용하십시오.

boost::test_tools::assertion_result is_linux(boost::unit_test::test_unit_id) 
{ 
    return isLinux; 
} 


BOOST_AUTO_TEST_SUITE(MyTestSuite) 

BOOST_AUTO_TEST_CASE(MyTestCase, 
        * boost::unit_test::precondition(is_linux)) 
{...} 

사전 조건은 컴파일 타임에 enable_if를 런타임에 평가합니다.

관련 항목 : http://www.boost.org/doc/libs/1_61_0/libs/test/doc/html/boost_test/tests_organization/enabling.html

+0

좋아요! 이것은 내가 찾고 있었던 바로 그 것이다 (오늘의 뒤). 몇 가지 테스트를 통해 확인해 보겠습니다. – dbn

+0

@Horus, 전제 조건에서 조명기를 사용하는 방법이 있습니까? – mojo

+0

@mojo 내 코드 https://github.com/precice/precice/blob/develop/src/testing/Testing.hpp에서 살펴볼 수 있습니다. 나는 데코레이터를 사용하여 테스트 트리에서 테스트를 제거하고, 조명기에도 사용할 수 있습니다. 내 코드는 비공식적 인 API를 사용하는 것이 좋습니다. – Horus

1

BOOST_AUTO_TEST_CASE(a_test_name,*boost::unit_test::disabled())

{ 
    ... 
} 
+0

설명서에서이 두 번째 매개 변수를 찾을 수 없습니다. 사용 가능합니까? – moodboom

+0

전적으로 예 http : //www.boost.org/doc/libs/1_65_1/libs/test/doc/html/boost_test/tests_organization/enabling.html – Sergei

+0

고맙습니다. 이제 두 번째 매개 변수가 실제로 docs에 대한 링크였습니다. – moodboom

관련 문제