我正在用EXPECT_DEATH()
测试一个断言,但它在用killed by signal 6 SIGABRT
的Ubuntu(gitlab-ci管道(上失败了。然而,完全相同的代码在Windows上运行良好。
当然,这个宏是专门为处理带有错误代码的退出而设计的。
#include "gtest/gtest.h"
class MyDeathTest : public ::testing::Test {
protected:
...
};
TEST_F(MyDeathTest, TestNegative1) {
EXPECT_DEATH(assert(false), "");
}
我尝试使用EXPECT_EXIT(assert(false), ::testing::KilledBySignal(SIGBART)), "");
和::testing::ExitedWithCode(6)
,以及EXPECT_DEBUG_DEATH()
、EXPECT_DEATH_IF_SUPPORTED()
等,但没有成功。
此外,我试图设置GTEST_FLAG_SET(death_test_style, "threadsafe");
,但得到了error: 'GTEST_FLAG_SET' was not declared in this scope;
有关于修复的建议吗?
两件事:
- 您应该使用
SIGABRT
,而不是SIGBART
- 看起来您正在使用的google测试版本是旧的,并且还没有
GTEST_FLAG_SET
宏。您可以使用此选项:
(void)(::testing::GTEST_FLAG(death_test_style) = "threadsafe");
工作示例:https://godbolt.org/z/15azKeMG4
来自谷歌测试文档
在谷歌测试中,死亡测试是在子进程中运行的工作很精细。要写死亡测试,你真的需要了解它们是如何工作的——请参阅断言中死亡断言的详细信息参考
特别是,死亡测试不喜欢在父进程。所以你可以尝试的第一件事就是消除正在EXPECT_DEATH((之外创建线程。例如,您可能需要在测试中使用模拟对象或伪对象,而不是真实对象。
有时这是不可能的,因为你必须使用的某些库可能在main((之前创建线程。在这种情况下,您可以尽量减少冲突的可能性EXPECT_DEATH((中尽可能多的活动(在极端情况下想把所有东西都搬进去(,或者尽可能少地留下东西此外,您可以尝试将死亡测试样式设置为";"线程安全";,这更安全但更慢,看看是否有帮助。
所以我想说,首先要确保您使用的是最新版本,然后尝试使用threadsafe
。