在Boost测试框架中测试assert 我使用Boost测试框架来对我的C++代码进行单元测试,并想知道是否有可能测试函数是否会断言。是的,听起来有点奇怪,但请容忍我!我的许多函数会在输入时检查输入参数,判断它们是否无效,对此进行测试将非常有用。例如: void MyFunction(int param) { assert(param > 0); // param cannot be less than 1 ... }
我希望能够做到以下几点:在Boost测试框架中测试assert 我使用Boost测试框架来对我的C++代码进行单元测试,并想知道是否有可能测试函数是否会断言。是的,听起来有点奇怪,但请容忍我!我的许多函数会在输入时检查输入参数,判断它们是否无效,对此进行测试将非常有用。例如: void MyFunction(int param) { assert(param > 0); // param cannot be less than 1 ... },c++,unit-testing,boost,assert,boost-test,C++,Unit Testing,Boost,Assert,Boost Test,我希望能够做到以下几点: BOOST_CHECK_ASSERT(MyFunction(0), true); BOOST_CHECK_ASSERT(MyFunction(-1), true); BOOST_CHECK_ASSERT(MyFunction(1), false); ... 您可以使用Boost测试检查抛出的异常,所以我想知道是否也有一些断言魔法…我不这么认为。您可以编写自己的断言,抛出异常,然后使用BOOST\u CHECK\u NOTHROW()处理该异常。对不起,您的问题解决方法
BOOST_CHECK_ASSERT(MyFunction(0), true);
BOOST_CHECK_ASSERT(MyFunction(-1), true);
BOOST_CHECK_ASSERT(MyFunction(1), false);
...
您可以使用Boost测试检查抛出的异常,所以我想知道是否也有一些断言魔法…我不这么认为。您可以编写自己的断言,抛出异常,然后使用BOOST\u CHECK\u NOTHROW()处理该异常。对不起,您的问题解决方法不对 “assert”是魔鬼(又称“C”)的产物,对于任何有适当例外的语言都是无用的。最好是重新实现类似断言的功能,但有例外。通过这种方式,您实际上有机会以正确的方式处理错误(包括正确的清理过程)或随意触发错误(用于单元测试) 此外,如果您的代码曾经在Windows中运行,当您的断言失败时,您会得到一个无用的弹出窗口,提供您调试/中止/重试。非常适合自动化单元测试 所以,帮你自己一个忙,重新编写一个抛出异常的断言函数。这里有一个:
将它包装在宏中,这样您就可以得到u u文件u u u u u u 不变量是应该始终为真的东西,无论发生什么。对于这些,我使用资产。像这样的事情你不应该给我一个输出缓冲区的零指针。这是代码中的一个bug,简单明了。在调试构建中,它将断言并给我一个更正它的机会。在零售版本中,它将导致访问冲突,并生成一个小型转储(Windows,至少在我的代码中是这样)或一个coredump(Mac/unix)。在处理零指针的解引用时,我没有什么可以做的
catch
。在Windows上,catch(…)
可以抑制访问冲突,让用户产生一种错误的信心,当他们已经犯了可怕的错误时,一切都正常
<>这就是为什么我开始相信但是,我不认为试图通过单元测试强制代码针对不变量进行断言有什么价值。我认为这个问题和一些回答混淆了运行时错误检测和错误检测。它们还混淆了意图和机制 运行时错误是指在100%正确的程序中可能发生的错误。它需要检测,需要适当的报告和处理,并且应该进行测试。bug也会发生,为了方便程序员,最好使用先决条件检查、不变检查或随机断言尽早捕获它们。但这是程序员的工具。对于普通用户来说,错误消息毫无意义,而且在正确编写的程序永远不会传递给它的数据上测试函数行为似乎也不合理
至于意图和机制,应该注意的是,例外并不是什么神奇的东西。不久前,彼得·迪莫夫(Peter Dimov)在Boost邮件列表(大约)上说,“异常只是非本地跳转机制”。这是非常正确的。如果您有应用程序,在某些内部错误之后可能继续,没有修复之前会损坏的风险,您可以实现抛出C++异常的自定义断言。但它不会改变意图,也不会使资产测试变得更加合理。有同样的问题,我翻阅了文档(和代码)并 找到了一个“解决方案” Boost UTF使用
Boost::execution\u monitor
(在
)。这是专为捕捉猎物而设计的
测试执行期间可能发生的一切。当找到断言时
执行监视器截取它并抛出boost::execution\u异常
。因此
通过使用BOOST\u REQUIRE\u THROW
可以断言断言失败
因此:
#包括
#包含//以执行\u异常
增压自动测试案例(案例1)
{
BOOST\u REQUIRE\u THROW(函数\u w\u失败\u assert(),
boost::执行(异常);
}
我们应该做到这一点。(它对我有用。)
但是(或免责声明):
- 它对我有用。也就是说,在Windows XP、MSVC 7.1、boost 1.41.0上。可能吧 您的设置不合适或损坏
- 这可能不是Boost Test作者的意图。 (尽管这似乎是执行监视的目的)
- 它将以同样的方式处理每种形式的致命错误。我想可能是这样 除了你的断言之外,其他东西正在失败。在这种情况下,你 可能会错过例如内存损坏错误和/或错过失败的断言
- 它可能会在未来破裂
#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); }
#if GROKUS_TESTABLE #define GROKUS_ASSERT ... // exception #define GROKUS_CHECK_THROW BOOST_CHECK_THROW #else #define GROKUS_ASSERT ... // assert #define GROKUS_CHECK_THROW(statement, exception) {} // no-op #endif