【发布时间】:2016-03-16 14:42:25
【问题描述】:
我们的 C 代码库正在使用 assert 来检查是否满足前置条件/后置条件。
#include <cstdlib>
#include <cassert>
void Aborting_Function(int n);
int main(){
Aborting_Function(1); //good
Aborting_Function(0); //calls std::abort()
//Is it possible to recover somehow?
//And continue on...
}
void Aborting_Function(int n){
assert(n > 0);
//impl...
}
在单元测试中,我想验证函数是否正确地遵循它们的合同
(当他们应该中止时)。
是否可以从 std::abort 中恢复?
我意识到让单元测试检查断言应该检查的内容似乎有些重复,但这会很有帮助,因为我们可以自动检查不应该工作的特定用例。
【问题讨论】:
-
不要使用
assert(x),而是使用our_assert(x),它有条件地定义为什么都不做(发布)、assert(x)(调试)、做一些花哨的事情(测试)? -
我不明白。对于因输入错误而中止的函数的单元测试,您的预期结果将被中止。有什么问题?
-
@DietmarKühl 这可能是我们最好的路线。这将依赖于我们更新大部分代码库,但这可能是唯一的方法。
-
根据标准
abort():程序终止,不执行自动、线程或静态存储持续时间的对象的析构函数,也不调用传递给 atexit() 的函数 -
@SergeyA 我们想要一个测试用例列表,我们可以在其中确认“是的,这 50 个单独的函数调用将在指定输入的情况下中止。”。但是,当第一个测试用例中止时,似乎没有办法恢复。
标签: c++ unit-testing abort