在开发人员代码中,有许多地方调用assert(xyz):
(来自assert.h)
#define assert(_Expression) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0) )
当我通过gtest运行我的测试并且其中一个断言失败时,我的可执行文件完全关闭。
我希望gtest能够捕获此断言,测试失败以及继续执行。这可能吗?
答案 0 :(得分:1)
从google test's reference documentation
开始如何撰写死亡测试
Google Test有以下宏来支持死亡测试: where语句是一个预期会导致进程死亡的语句,谓词是一个函数或函数对象,用于计算整数退出状态,而正则表达式是一个正则表达式,该语句的stderr输出应该匹配。请注意,语句可以是任何有效语句(包括复合语句),并且不必是表达式。
您可以使用这些测试宏拦截测试代码的原生exit()
或_exit()
次调用,如果它们从0
返回不同的值。
至于你的评论
"如果测试本身并不期望它会怎么样,但它仍然会发生?我不想让我执行的其余部分停止。只是测试失败,然后继续。"
抱歉,您无法阻止。这是assert()
语句的设计目的,并作为测试其实现的输入或条件的某些功能的自我断言。
您可以尝试使用-DNDEBUG
编译器选项编译测试和测试代码,但是这将使您遇到更加模糊的问题,导致未定义的行为等。
如果测试用例可能会出现意外断言,则测试用例输入值或测试代码出现问题。
因此,您应该设置可重现的条件,测试用例失败并使用断言(并且单元测试器可以继续运行),或者整个过程爆炸(退出测试运行程序),这意味着您的测试输入没有传递(你需要更改测试用例,或修复测试中的代码)。
答案 1 :(得分:0)
基本上,如果您正在测试的代码被破坏,则测试无法继续。
为了防止gtest崩溃,请确保您正在测试的代码至少正确编译,并输入它是收集有效。
我说这不是吝啬,而是出于个人经验。我为自己的项目使用gtest和gmock。我最近一直在玩代码,这有点超出了我的联盟(毕竟,增长的唯一方法就是超越你的感知范围)。
代码从数据文件中获取数据,这导致我的测试崩溃,不是因为测试有任何问题,而是因为我没有对从文件中读取的函数进行适当的错误检查
,当程序获得一个字符串时,它会在事物中乱扔东西。信不信由你,例外在测试中是一件好事。你不想只是忽略它们并继续前进,你想要找出导致它们的原因并让它停止。这就是测试的全部原因。