Как запустить 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
Вы можете добавить другие опции, опять же: проверьте документ:)