如何运行GTEST并确保Sigabrt永远不会发生

How run gtest and make sure sigabrt never happens

本文关键字:永远 Sigabrt 确保 何运行 运行 GTEST      更新时间:2023-10-16

我需要一个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个测试。还有其他想法吗?

不在窗口上:

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

doc

但是,请认真地说,如果您有一次运行代码的Sigbart,则在发布软件之前必须删除代码的问题。


但是,如果您真的想调试代码(使用Googletest),请与您的调试器一起使用:

foo_test --gtest_repeat=1000 --gtest_break_on_failure

您可以在其中添加其他选项,再次:检查doc:)