如何测试断言?

Posted

技术标签:

【中文标题】如何测试断言?【英文标题】:How to test assertions? 【发布时间】:2011-06-12 23:24:26 【问题描述】:

我正在使用单元测试框架来测试我的库。我在库中有很多断言,以确保在调试版本中捕获程序员错误。现在我想确保我正在测试所有可能的程序员错误。

例如在 Table 类中,我想确保传递的行和列不大于表的行和列。假设我忘记测试 cols。我想让我的单元测试在断言应该触发的地方执行测试,如果没有,则测试失败。这可能吗?

【问题讨论】:

您应该指定您正在使用的单元测试框架,因为答案取决于此。 酷,-1 没有解释 :) @David:我正在使用 CATCH 测试框架。我将接受wheaties的建议,并将断言转换为仅用于单元测试库的异常,并以无抛出的方式进行测试。 【参考方案1】:

那么问题就变成了您是否计划重构您的代码,以便在发生这种情况时抛出异常,而不是依靠<cassert> 功能来提示您解决问题?如果是这样,您只需检查是否引发了异常。如果不是,那么测试来自<cassert> 的断言语句将更加困难。像 CUTE 这样的单元测试框架有一个 ASSERT_THROWS 宏,仅用于异常测试。我会检查你的框架。

此外,我工作过的商店就是这种情况,他们对assert 不屑一顾,更喜欢例外情况。调用abort 无助于自动化测试。实际上,它禁止它。只是我的两分钱。

【讨论】:

我在编译时没有异常,所以只能使用断言。我将考虑将断言宏转换为仅用于单元测试项目的断言【参考方案2】:

有三种可能的方式:

将断言转换为异常,或

运行每个测试一个单独的程序,您(或者更确切地说,测试框架)检查其退出代码,或者

让一个触发的断言写入关于自身的信息,然后测试框架可以获取这些信息。

据我所知,没有商业或广泛使用的单元测试框架支持最后两种方式。我已经使用检查进程退出代码来进行爱好编程,但只使用了一个用 Python 和 C++ 实现的小型个人单元测试框架(“爱好编程”:这意味着我没有关于它如何扩展到大规模编程的良好数据)。进程退出代码测试的主要情况是代码具有静态断言,您希望确保它们在预期时被触发。

总结起来,在现有的测试框架中,转换为异常是 AFAIK 你唯一的选择。

干杯&hth。

【讨论】:

谢谢,将它们转换为例外是我要做的 (+1)【参考方案3】:

答案取决于您使用的特定测试框架,并且很可能在 google 中很少搜索就可以找到答案。

“boost unittest test assert”的第一次点击指向 *** 中的这个问题:Testing for assert in the Boost Test framework

“cppunit test assert”的第二次点击指向此文档页面: Making Assertions

尝试在互联网上搜索您的具体框架。

【讨论】:

我尝试依赖 SO 的搜索,但我想这是个坏主意(很多时候人们也会输入错误的搜索字词)

以上是关于如何测试断言?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Google 测试捕捉断言?

如何单元测试继续断言

如何断言在selenium测试用例的登录成功

如何测试在断言之前阻塞线程的 View Model 协程?

如何单元测试断言

在 MS C# 单元测试中,如何断言发生了 ArgumentException?