Как запустить gtest и убедиться, что sigabrt никогда не случится

Мне нужен тест, который пройдет, если 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.

Вы должны посмотреть руководство.

Похоже, что для меня (не проверено):

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 ?
}

доктор

А если серьезно, если у вас есть один раз, когда ваш код запускается SIGBART, есть некоторые проблемы с вашим кодом, которые вы должны удалить перед выпуском программного обеспечения.


Но если вы действительно хотите отладить свой код (с помощью googletest), используйте это с вашим отладчиком:

foo_test --gtest_repeat=1000 --gtest_break_on_failure

Вы можете добавить другие опции, опять же: проверьте документ:)

Другие вопросы по тегам