Gtest EXPECT_DEATH()失败,返回SIGABRT



我正在用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;

有关于修复的建议吗?

两件事:

  1. 您应该使用SIGABRT,而不是SIGBART
  2. 看起来您正在使用的google测试版本是旧的,并且还没有GTEST_FLAG_SET宏。您可以使用此选项:
(void)(::testing::GTEST_FLAG(death_test_style) = "threadsafe");

工作示例:https://godbolt.org/z/15azKeMG4

来自谷歌测试文档

在谷歌测试中,死亡测试是在子进程中运行的工作很精细。要写死亡测试,你真的需要了解它们是如何工作的——请参阅断言中死亡断言的详细信息参考

特别是,死亡测试不喜欢在父进程。所以你可以尝试的第一件事就是消除正在EXPECT_DEATH((之外创建线程。例如,您可能需要在测试中使用模拟对象或伪对象,而不是真实对象。

有时这是不可能的,因为你必须使用的某些库可能在main((之前创建线程。在这种情况下,您可以尽量减少冲突的可能性EXPECT_DEATH((中尽可能多的活动(在极端情况下想把所有东西都搬进去(,或者尽可能少地留下东西此外,您可以尝试将死亡测试样式设置为";"线程安全";,这更安全但更慢,看看是否有帮助。

所以我想说,首先要确保您使用的是最新版本,然后尝试使用threadsafe

最新更新