如何运行gtest并确保sigabrt永远不会发生

时间:2016-12-08 20:21:19

标签: c++ googletest sigabrt

如果sigabrt没有发生,我需要一个gtest,但需要知道它是否确实发生,或者测试失败。我该怎么做?

我在考虑这种事情:

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 个答案:

答案 0 :(得分: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

您可以再次添加其他选项:查看doc:)