我对测试一些包含来自assert.h的 assert 宏的函数有一些担忧。
如果断言失败,则测试也失败。这给我留下了一些永远不会工作的测试用例。
例如,一个函数而不是指示失败(返回 false 或类似的东西)断言。
是否有解决方案(包含断言的单元测试函数)?
我对测试一些包含来自assert.h的 assert 宏的函数有一些担忧。
如果断言失败,则测试也失败。这给我留下了一些永远不会工作的测试用例。
例如,一个函数而不是指示失败(返回 false 或类似的东西)断言。
是否有解决方案(包含断言的单元测试函数)?
您可能正在测试该断言在您期望它时中止的事实(在错误输入时)。
测试框架Google Test作为一个 ASSERT_DEATH 宏,它将测试程序是否在您期望的位置中止(如断言)。
您还可以使用定义的 NDEBUG( -DNDEBUG 与 gcc)进行编译,以禁用单元测试的断言。
也许只有我一个人,但我认为如果你有断言失败,你甚至不应该考虑更高级别的单元测试,直到你修复它们。这个想法是,如果代码编写正确,断言在任何情况下都不应该失败,包括单元测试。或者至少这就是我编写代码的方式。
不,单元测试是你在开发过程中所做的。断言是一个运行时构造。
根据我的经验,大多数时候断言在生产中是关闭的。但是您应该始终进行测试。
CppUnit 是一个很好的测试框架。它是 C++ 的 nUnit 系列的一部分。
断言在任何情况下都不应失败。如果它们在您的测试中失败,则表明存在逻辑错误。基本上,如果您的函数正在执行“assert(0)”而不是返回错误代码,那么应该重写该函数。如果中止是所需的行为,则 exit() 是合适的,但不是 assert()。
如果在测试期间断言失败,则代码有误,必须更改。代码“assert(x)”应该被解释为“程序的逻辑要求x为真。在任何情况下都不能为假”。如果您有一个导致断言失败的单元测试,那么该语句显然是无效的,必须进行修改。
基本上听起来你的测试框架不是为了测试你的断言而构建的。
使用将停止进程的断言,您需要一些可以监视执行状态的东西。
boost-test 如何执行此操作的示例:http: //www.boost.org/doc/libs/1_34_0/libs/test/doc/components/prg_exec_monitor/index.html
我已经有一段时间没有做过 C 或 C++ 编码了,但是,我会从类似的技术开始。