我们应该在C ++单元测试中测试src代码断言(非异常)吗?

时间:2015-01-20 13:32:07

标签: c++ unit-testing testing assertion

我听过几个人在这方面的观点相互矛盾,想看看stackoverflow社区对此的看法。

是的一方的人说:
- 我们应该测试断言,因为它给了我们代码覆盖率 - 如果明天会有一些新的程序员出现并错误地取出断言,如果没有测试可以捕获它,该怎么办?我们应该测试断言。

没有人的人说 - 我不知道测试程序何时退出并且测试相当昂贵是如何有用的。例如,在谷歌测试框架中,我们分叉子进程并在那里运行死亡测试,并使父进程等待子进程的结果。这是相当昂贵的测试。在多线程环境中,测试断言更加昂贵。因此,这种价格最低的昂贵测试是不值得的 - 如果在src中存在导致断言的代码路径,那么在构建/运行期间,我们将捕获并获取堆栈跟踪。因此,我们将获得调试断言为何被命中所需的所有信息。 因此,创建单元测试仅测试基本断言并不是真正有用。

那么,我们应该在C ++单元测试中测试src代码断言(非异常)吗?

2 个答案:

答案 0 :(得分:1)

  

- 我们应该测试断言,因为它为我们提供了代码覆盖

覆盖范围不是测试的目的。目的是在进行重构时感到安全。你也为安装者和吸气者写测试吗?

  

- 如果明天某些新程序员出现并错误地取出断言,如果没有测试可以抓住它,该怎么办。

如果您的合同说代码必须抛出异常,那么您应该测试是否抛出该异常。但断言通常是为了快速失败并且更好地记录代码。如果断言失败,那么断言前的代码就会被破坏。测试完全不同的组件应该发现该bug。

因此,在我看来,您应该测试代码的业务行为/接口,而不是实现细节。这将使您的测试维护成本更低

答案 1 :(得分:0)

在我看来,不是使用只是中止程序的assert,而是抛出异常。你可以轻松进行单元测试。

现在回答这个问题:不,单位测试assert是没有意义的,因为它是一个禁止的案例。如果assert失败,您会立即注意到(程序的执行将停止)。