c++ - 在 Boost Test 框架中测试 assert

标签 c++ unit-testing boost assert boost-test

我使用 Boost Test 框架对我的 C++ 代码进行单元测试,并想知道是否可以测试一个函数是否会断言?是的,听起来有点奇怪,但请耐心等待!我的许多函数在输入时检查输入参数,断言它们是否无效,对此进行测试会很有用。例如:

void MyFunction(int param)
{
    assert(param > 0); // param cannot be less than 1
    ...
}

我希望能够做这样的事情:

BOOST_CHECK_ASSERT(MyFunction(0), true);
BOOST_CHECK_ASSERT(MyFunction(-1), true);
BOOST_CHECK_ASSERT(MyFunction(1), false);
...

您可以使用 Boost Test 检查抛出的异常,所以我想知道是否也有一些断言魔法......

最佳答案

遇到同样的问题,我翻阅了文档(和代码)并 找到了“解决方案”。

Boost UTF 使用 boost::execution_monitor (在 <boost/test/execution_monitor.hpp> )。这是为了捕捉 测试执行期间可能发生的一切。找到断言时 execution_monitor 拦截它并抛出 boost::execution_exception .因此, 通过使用 BOOST_REQUIRE_THROW你可以断言断言失败。

所以:

#include <boost/test/unit_test.hpp>
#include <boost/test/execution_monitor.hpp>  // for execution_exception

BOOST_AUTO_TEST_CASE(case_1)
{
  BOOST_REQUIRE_THROW(function_w_failing_assert(),
                      boost::execution_exception);
}

应该做的伎俩。 (它对我有用。)

但是(或免责声明):

  • 它对我有用。也就是说,在 Windows XP、MSVC 7.1 上,boost 1.41.0。它可能 设置不合适或损坏。

  • 这可能不是 Boost Test 的作者的本意。 (虽然它似乎是 execution_monitor 的目的)。

  • 它将以同样的方式对待每一种形式的 fatal error 。我可能是 除了你的断言之外的东西正在失败。在这种情况下,您 可能会错过例如内存损坏错误,和/或错过失败的失败断言。

  • 它可能会在未来的 boost 版本中中断。

  • 我预计如果在发布配置中运行它会失败,因为断言将是 禁用并且断言设置为阻止的代码将 跑。导致非常不确定的行为。

  • 如果,在 msvc 的发布配置中,出现一些类似断言或其他 fatal error 无论如何都会发生它不会被捕获。 (参见 execution_monitor 文档)。

  • 是否使用断言取决于您。我喜欢他们。

见:

另外,感谢 Gennadiy Rozental(Boost Test 的作者),如果您碰巧 阅读本文,伟大的工作!

关于c++ - 在 Boost Test 框架中测试 assert,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/270542/

相关文章:

c++ - 如何从 vector 打印嵌套结构对象?

c++ - 创建一个用于 spirit 规则的凤凰函数

在单元测试中从 ngrx 存储中选择时,Angular .pipe 和 .subscribe 未定义

c++ - boost::split 在字符串的开头和结尾留下空标记——这是期望的行为吗?

c++ - 在 C++ 中解析 HTTP header

c++ - 在没有线程支持的程序加载的共享库中使用 C++11 多线程

c++ - 从 *nix 系统获取 C++ 代码中的特定文件

c++ - 为什么人们在 C++ 中如此多地使用 __(双下划线)

java - 每个 @InjectMocks 调用都没有考虑 PowerMock 静态方法模拟

java - 如何使用 JMockit 模拟实例化具有任何非空参数的新对象