【问题标题】:Is there a function in boost::test that can return error value?boost::test 中是否有可以返回错误值的函数?
【发布时间】:2014-07-15 11:08:26
【问题描述】:

Boost Test Library 是一个非常有用的单元测试框架。但是,我感到不舒服的一件事是,在单元测试期间,如果发生错误,它会通知用户而不是程序本身。让我以 BOOST_CHECK 为例说明我的观点:

i=3;
j=4;
BOOST_CHECK(i==j);

上面的测试用例会失败。因此,检查细节以找出此测试失败的原因将非常有趣。在这种情况下,如果它知道单元测试失败,则需要在程序中打印一些变量或执行更复杂的操作,例如将文件写入磁盘。但是,BOOST_CHECK 不会返回一个值来表示测试是否成功。一个完美的函数应该是这样工作的:

    i=3;
    j=4;
    if(Enhanced_BOOST_CHECK(i==j) == failed)
    {

        // print some internal varaibles.
        // or write some data to a file in the disk
     }

所以我的问题是:BOOST 测试库是否支持此功能?谢谢。

【问题讨论】:

    标签: c++ unit-testing boost


    【解决方案1】:

    Boost 提供了一个宏BOOST_WARN_MESSAGE(以及BOOST_CHECK_MESSAGEBOOST_REQUIRE_MESSAGE)。在你的情况下,它可以这样使用:

    i=3;
    j=4;
    
    bool isEqual = i==j;
    
    BOOST_CHECK(isEqual);
    BOOST_WARN_MESSAGE(isEqual, "Failure since i = " << i << " and j = " << j);
    

    更多信息见here

    【讨论】:

    • 感谢 cmets。按照您的建议,使用 BOOST_WARN_MESSAGE 打印变量可能就足够了。但是,如果我想执行更复杂的任务,例如在测试失败时将文件写入磁盘,该怎么办。
    • 我为此使用了一种解决方法:测试可执行文件的任何输出都被重定向到一个文件。这一切都封装在一个批处理文件中(操作系统是 Win7)。这样的东西对你来说也足够了吗?
    • 很好的解决方案,但它有时会起作用。但是如果我应该将图像写入文件怎么办?
    • @feelfree 在执行单元测试代码恕我直言时,不应将图像写入文件。它会减慢测试速度。另一方面,boost 文档显示“消息参数可以由支持 std::ostream& 运算符是可能的。
    【解决方案2】:

    Boost Test 提供的不仅仅是BOOST_CHECK

    the docs:

    UTF 测试工具参考

    BOOST_<level>
    BOOST_<level>_BITWISE_EQUAL
    BOOST_<level>_CLOSE
    BOOST_<level>_CLOSE_FRACTION
    BOOST_<level>_EQUAL
    BOOST_<level>_EQUAL_COLLECTION
    BOOST_<level>_EXCEPTION
    BOOST_<level>_GE
    BOOST_<level>_GT
    BOOST_<level>_LE
    BOOST_<level>_LT
    BOOST_<level>_MESSAGE
    BOOST_<level>_NE
    BOOST_<level>_NO_THROW
    BOOST_<level>_PREDICATE
    BOOST_<level>_SMALL
    BOOST_<level>_THROW
    BOOST_ERROR
    BOOST_FAIL
    BOOST_IS_DEFINED
    

    您可能想在您的情况下使用BOOST_CHECK_EQUAL(i, j)

    或者,看看你的第二个例子,对于更复杂的情况,你可以这样做:

    if (!(i==j)) {
      // Complex condition failed - report to boost test and add custom message
      std::string message = ...;
      BOOST_CHECK_MESSAGE(false, message);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-04
      • 2014-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多