我使用 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/