2014-09-15 2 views
4

gtest에서 인라인/테스트 케이스 또는 테스트에 대한 시간 초과가있는 방법이 있습니까? 예를 들어, 다음과 같이하고 싶습니다. EXPECT_TIMEOUT (5 초, myFunction()); googletest의 테스트 케이스 시간 초과

내가 아니라이 문제 googletest 문제 발견이 게시물에서 더 gtest의 방법이없는 것처럼 12월 9일 2010 https://code.google.com/p/googletest/issues/detail?id=348에서 '유형 향상'을

보인다. 저는이 문제를 해결할 방법을 찾아내는 것이 처음이 아닙니다.

내가 생각할 수있는 유일한 방법은 하위 스레드가 함수를 실행하도록하는 것이며, 제한 시간까지 반환하지 않으면 상위 스레드가이를 죽이고 시간 초과 오류를 표시합니다.

스레드를 사용할 필요가없는 방법이 있습니까? 다른 방법이 있습니까?

+0

[테스트 코드 냄새] (http://xunitpatterns.com/Slow%20Tests.html)를 도입하고 테스트를 취약하게 만들 수 있습니다. 정말로 그것을하고 싶다면 assertion 매크로를 위해 자신의 assertion 매크로 –

+0

을 작성할 수 있습니다. 아마도 두 개의 쓰레드가 실행되어야할까요? 자식 스레드가 함수를 실행하고 시간 제한에 의해 반환되지 않으면 주 스레드가 중지되고 false 또는 뭔가를 반환합니다. – Basanta

+0

토론은 구현 토론으로 이어지는 것으로 보입니다. if와 whens가 많이 있기 때문에 googletest 또는 다른 테스트 프레임 워크 문제에 대해 자세히 논의 할 것을 권합니다. 범위가 너무 넓습니다. 그렇습니다. 자식 스레드를 생성하면 도움이 될 수 있지만 강력한 지 여부는 말하기 어렵습니다. 통화가 끝날 때까지 기다렸다가 스톱워치를 사용하여 시간을 지정하십시오. –

답변

3

방금 ​​이런 상황이 발생했습니다.

내 원자로에 대해 실패한 테스트를 추가하고 싶습니다. 반응기가 끝나지 않습니다. (먼저 실패해야합니다). 그러나 나는 그 시험이 영원히 계속되기를 원하지 않는다.

나는 당신의 연결을 따라 갔지만 그곳에는 여전히 기쁨이 없습니다. 그래서 저는 C++ 14 기능 중 일부를 사용하기로 결정했으며 상대적으로 간단합니다.

하지만이 같은 타임 아웃 구현 : 지금은 내 실패 테스트 나 테스트를 해결 코드를 작성할 수 있습니다을 가지고

TEST(Init, run) 
{ 
    // Step 1 Set up my code to run. 
    ThorsAnvil::Async::Reactor      reactor; 
    std::unique_ptr<ThorsAnvil::Async::Handler>  handler(new TestHandler("test/data/input")); 
    ThorsAnvil::Async::HandlerId     id = reactor.registerHandler(std::move(handler)); 

    // Step 2 
    // Run the code async. 
    auto asyncFuture = std::async(
     std::launch::async, [&reactor]() { 
           reactor.run(); // The TestHandler 
               // should call reactor.shutDown() 
               // when it is finished. 
               // if it does not then 
               // the test failed. 
          }); 

    // Step 3 
    // DO your timeout test. 
    EXPECT_TRUE(asyncFuture.wait_for(std::chrono::milliseconds(5000)) != std::future_status::timeout); 

    // Step 4 
    // Clean up your resources. 
    reactor.shutDown();    // this will allow run() to exit. 
            // and the thread to die. 
} 

합니다.

+0

또는 C++ 11 또는 14없이 비슷한 작업을하고 싶다면 ... boost :: asio :: io_service와 비슷한 작업을 수행 할 수 있습니다. –

+0

@ TrevorBoydSmith : Google 테스트에서 타이밍을 수행하려면? –

관련 문제