2016-12-08 2 views
0

sigabrt가 발생하지 않을 경우 통과 할 gtest가 필요합니다. 그러나 발생했는지 또는 테스트가 실패했는지 알아야합니다. 내가 어떻게 그럴 수 있니?어떻게 gtest를 실행하고 sigabrt가 발생하지 않는지 확인하십시오

나는 이런 종류의 생각 :이 발생하면

TEST_F(TestTest, testSigabrtDoesntHappen) 
{ 
    MyObject &myObject = MyObject::instance(); 
    for(int i=0; i<2; i++){ 
     myObject.doWork(); //this will sigabrt on the second try, if at all 
     ASSERT_TRUE(myObject); 
    } 
    ASSERT_TRUE(myObject); 
} 

는 그래서 SIGABRT 가정하면 시험을 종료 것입니다, 우리는 3 시험 그렇지 않으면 통과 얻을 것입니다. 다른 아이디어? 창에

답변

1

하지 :

::testing::KilledBySignal(signal_number) // Not available on Windows. 

당신은 guide을 보일 것입니다.

그것은 나 (테스트하지)를 위해 그런 것 같다

:

창에
TEST_F(TestTest, testSigabrtDoesntHappen) 
{ 
    MyObject &myObject = MyObject::instance(); 
    for(int i=0; i<2; i++){ 
     EXPECT_EXIT(myObject.doWork(), ::testing::KilledBySignal(SIGBART)), "Regex to match error message"); 
     ASSERT_TRUE(myObject); 
    } 
    ASSERT_TRUE(myObject); 
} 

:

// crt_signal.c 
// compile with: /EHsc /W4 
// Use signal to attach a signal handler to the abort routine 
#include <stdlib.h> 
#include <signal.h> 
#include <tchar.h> 

void SignalHandler(int signal) 
{ 
    if (signal == SIGABRT) { 
     // abort signal handler code 
    } else { 
     // ... 
    } 
} 

int main() 
{ 
    typedef void (*SignalHandlerPointer)(int); 

    SignalHandlerPointer previousHandler; 
    previousHandler = signal(SIGABRT, SignalHandler); 

    abort(); //emit SIGBART ? 
} 
:

당신은 이러한 종류의 코드와 함께 자신을 신호 처리해야합니다

doc

하지만 당신이 한 번 SIGBART에 코드를 실행 시키면, 소프트웨어를 릴리스하기 전에 제거해야하는 코드에 몇 가지 문제가 있습니다.


하지만 당신이 정말로 (googletest과) 코드를 디버깅 할 경우, 디버거와 함께 이것을 사용 : 당신은 다시 그것을 다른 옵션을 추가 할 수 있습니다

foo_test --gtest_repeat=1000 --gtest_break_on_failure 

다음 문서를 확인 :)

+0

광산은 windows, mac, linux이므로 KilledBySignal을 할 수 없습니까? – Michele

+0

@Michele 신호가 창에 표시되면 엉망입니다 (실제로는 존재하지 않는다고 생각했습니다). GoogleTest가 Window에서 해당 코드를 절대 지원하지 않을 것이라고 생각합니다. –

+0

우리가 창문이 아니라면 그냥 시험을 볼 수 있습니다. 그래도 나는 너의 생각을 좋아한다. 나는 가이드의 링크를 보았지만, 내가하고있는 것에 적용하는 것은 어렵다. – Michele

관련 문제