2010-06-28 2 views
1

유닛 테스트를 위해 Boost.Test를 사용 중이며 현재 각 테스트 내에서 시작되는 개별 스레드에서 다양한 모의 서버를 실행 중입니다. 내 코드를보다 정확하게 테스트하기 위해서는 모의 서버가 실제로 별개의 프로세스에 있어야합니다.Boost.Test and Forking

MY_TEST() 
if (fork() == 0) { 
    runMockServer(); // responds to test requests or times out, then returns 
    exit(0); 
} 
// Connect to MockServ and Run actual test here 
END_TEST() 

을하지만이 테스트 프레임 워크를 망치는 것을 걱정 :

나는이 라인을 따라 뭔가를하고 생각했다.

안전한가요? 이런 일을 한 사람 있습니까?

우분투 8.04에서 부스트 1.34.1을 사용하고 있습니다.

답변

3

이것은 실제로 달성하고자하는 단위 테스트와 같지 않습니다. 나는 그것이 안전하지 않은 이유를 알지 못한다. 유닛 테스트가 아직 준비가되지 않았지만 MockServ에 연결할 수 있지만 쉽게 해결할 수있는 경쟁 조건이있을 수 있습니다.

나는 이런 식으로 직접 해본 적이 없지만 fork/exec 하위 프로세스가 완벽하게 작동하는 라이브러리에 대한 단위 테스트를 작성했습니다.

+0

"포크/exec 라이브러리에 대한 서면 단위 테스트"라고 부르면 Boost.Test와 관련이 있다고 생각합니까? –

+0

은 Boost.Test를 사용하여 정확합니다. –

+0

감사합니다. 호기심에서, 왜 이것이 당신을 테스트하는 단위처럼 들리지 않는다고 말합니까? –

3

비슷한 상황에서 부스트 유닛 테스트 라이브러리를 사용하여 긍정적 인 결과를 얻었습니다. 라이브러리를 포크 할 때와 같이 작동하는지 확인하기위한 자동 테스트를 원했습니다. 제 경우에는 시스템 테스트에 더 가깝지만, 당신이 원하는 것을 얻을 수 있다면 사용 가능한 도구를 사용하기위한 것입니다.

그래도 극복해야 할 장애물 중 하나는 부스트 어설 션 매크로를 사용하지 않고 하위 프로세스의 오류를 알리는 것입니다. 예를 들어 BOOST_REQUIRE이 사용되면 시험을 조기에 중단하고 후속 테스트는 상위 프로세스와 하위 프로세스 모두에서 실행됩니다. 대기 종료 프로세스에 오류를 알리기 위해 프로세스 종료 코드를 사용하여 종료되었습니다. 그러나 exit()을 부스트로 사용하지 않는 경우에도 자식 프로세스의 오류를 알리는 atexit() 후크를 사용하지 마십시오. 대신 _exit()을 사용하십시오.

테스트에 사용한 설정은 다음과 같습니다.

BOOST_AUTO_TEST_CASE(Foo) 
{ 
    int pid = fork(); 
    BOOST_REQUIRE(pid >= 0); 
    if(pid == 0) // child 
    { 
    // Don't use Boost assert macros here 
    // signal errors with exit code 

    // Don't use exit() since Boost test hooks 
    // and signal error in that case, use _exit instead. 
    int rv = something(); 
    _exit(rv); 
    }else{ // parent 
    // OK to use boost assert macros in parent 
    BOOST_REQUIRE_EQUAL(0,0); 
    // Lastly wait for the child to exit 
    int childRv; 
    wait(&childRv); 
    BOOST_CHECK_EQUAL(childRv, 0); 
    } 

}