【问题标题】:How to unit-test for assert() failing?如何对 assert() 失败进行单元测试?
【发布时间】:2020-01-17 20:15:44
【问题描述】:

我想对一些偶尔使用assert() 的代码进行单元测试。具体来说,我想确保某些命令确实触发了断言。但是 - 我实际上并不希望程序被中止。 (如果发生这种情况,我既需要确保从程序外部终止程序,又需要为每个这样的测试用例设置不同的程序。)

我也知道assert() 是一个宏,所以如果我正在测试的代码是仅标头代码,理论上我可以使用我的单元测试库(doctest)编写某种替换宏来触发故障)。

我的问题:

  • 也许 doctest 已经有一些工具可以进行这种测试?
  • 如果没有,是否有一些惯用的方式来实现断言触发测试?也许与我可以适应的其他测试框架/库一起使用?

注意:我注意到 here on SO 谷歌测试有某种相关的设施,ASSERT_DEATH,但我不清楚它是否能做我想做的事情。

【问题讨论】:

  • 您链接到的 ASSERT_DEATH 文档似乎说它完全适合这个目的
  • @JMAA:我不清楚它是如何做的,以及进程是否真的中止,谷歌测试框架可能会做一些神奇的事情来处理它(例如父进程)。但是,如果您能详细说明,我将不胜感激。
  • GoogleTest 死亡测试are indeed executed as a subprocess。我不确定assert() 到底做了什么,但大概它以标准退出代码退出(您可以在死亡测试中测试)并返回错误消息(您也可以测试)。

标签: c++ unit-testing assert idioms doctest


【解决方案1】:

一般来说,你可以做的是产生一个子进程,在那里执行操作,并在父进程中测试子进程是否成功终止,并可能检查子进程生成的任何输出。我认为这就是 Google 的测试所做的。

在 C++ 中没有生成子进程的标准方法。该标准不承认其他流程的存在。多任务操作系统将为此提供 API。在 POSIX 标准中,可以使用 fork 函数创建子进程。

【讨论】:

  • 因此,确实,这将是一种测试“死亡”的可靠方法。但是,在测试仅标头代码时,我的有限情况(assert() 宏)呢?
  • @einpoklum 语言不允许更改标准宏。也就是说,实际上是您负责并创建自己的略有不同的语言实现,在这种情况下,您有责任让它做您想做的事情。
  • eerorkia:这只是一个单元测试,不要那么紧张:-P
  • @einpoklum 这“只是一个单元测试”,您编写它是为了确保您的真实代码正常工作。如果你不确定单元测试是否正常工作,那么编写它是毫无价值的。
  • @einpoklum 我只是告诉你什么标准是不允许的。您可以决定对单元测试的标准一致性有多严格。
猜你喜欢
  • 2021-06-26
  • 1970-01-01
  • 2017-10-25
  • 2012-01-08
  • 2019-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
相关资源
最近更新 更多