BOOST_CHECK_EQUAL(和dervatives)添加自定义消息

nam*_*ero 5 c++ testing boost unit-testing boost-test

我们最近开始使用Boost测试框架,并且到目前为止都喜欢它.但是,如果我们可以向现有帮助程序添加自定义消息,那么某些测试会很棒.

例如,我可以在mytest和mytest2中获取输出,但是找不到在mytest3中获取输出的方法:

#define BOOST_TEST_MODULE mytests
#include <boost/test/unit_test.hpp>


BOOST_AUTO_TEST_SUITE(myunit)

BOOST_AUTO_TEST_CASE(mytest)
{
    // This give a nice output [2+2 != 5]
    BOOST_CHECK_EQUAL(2+2, 5);
}

BOOST_AUTO_TEST_CASE(mytest2)
{
    // This give only a custom output
    BOOST_CHECK_MESSAGE(2+2 == 5, "comparison error");
}

BOOST_AUTO_TEST_CASE(mytest3)
{
    // Ideally, it should output [2+2 != 5] comparison error
    BOOST_CHECK_EQUAL_WITH_ADDITIONAL_MESSAGE(2+2, 5, "comparison error");
}

BOOST_AUTO_TEST_SUITE_END()
Run Code Online (Sandbox Code Playgroud)

我想要这个的原因是因为如果我希望有这样的测试用例:

BOOST_AUTO_TEST_CASE(mytest4)
{
    for(int i = 0; i < 10; ++i)
    {
        BOOST_CHECK_EQUAL_WITH_ADDITIONAL_MESSAGE(i%3, 0, i);
    }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,无法知道测试失败的原因.

我试图"复制"BOOST_CHECK_EQUAL宏,如下所示希望boost会附加到传递的消息,因为原始宏传递一个空的文字:

#define BOOST_CHECK_EQUAL2( L, R ) \
    BOOST_CHECK_WITH_ARGS_IMPL( ::boost::test_tools::tt_detail::equal_impl_frwd(), "hello world", CHECK, CHECK_EQUAL, (L)(R) )
Run Code Online (Sandbox Code Playgroud)

但是,"hello world:在测试实现中的某个地方被覆盖失败的条件.

有没有(简单和干净)的方法来解决这个问题?

UPDATE看起来好像check_impl()实施test_tools.ipp不利用check_descr的平等检查参数.

是否有一种优雅的方式来覆盖/提供我自己的?

nam*_*ero 5

好吧,我只是想发帖供参考,以防其他人遇到这个问题,我是这样解决的:

//____________________________________________________________________________//

#define BOOST_TEST_REL_EQ_MESSAGE_EXTENSION(L, R, M, CMP, ICMP, CT)         \
    {                                                                       \
        auto _1(L);                                                         \
        auto _2(R);                                                         \
        std::stringstream ss;                                               \
        ss << "check " << BOOST_TEST_STRINGIZE(L) << " " << BOOST_TEST_STRINGIZE(CMP) << " " << BOOST_TEST_STRINGIZE(R) << " failed [" << _1 << " " << BOOST_TEST_STRINGIZE(ICMP) << " " << _2 << "] : " << M;\
        BOOST_CHECK_IMPL( (_1 CMP _2), ss.str(), CT, CHECK_MSG );           \
    }                                                                       \
/**/

#define BOOST_CHECK_EQUAL_MESSAGE(L, R, M)      BOOST_TEST_REL_EQ_MESSAGE_EXTENSION(L, R, M, ==, !=, CHECK )
#define BOOST_WARN_EQUAL_MESSAGE(L, R, M)       BOOST_TEST_REL_EQ_MESSAGE_EXTENSION(L, R, M, ==, !=, WARN )
#define BOOST_REQUIRE_EQUAL_MESSAGE(L, R, M)    BOOST_TEST_REL_EQ_MESSAGE_EXTENSION(L, R, M, ==, !=, REQUIRE )
Run Code Online (Sandbox Code Playgroud)

虽然这可能不是最佳的(主要是由于上面 mytest4 中的每次迭代都使用了 stringstream),但似乎通过这为可能需要额外消息的少数情况提供了一个相当干净且非侵入性的解决方案

更新2017-08

对于较新的 boost 测试版本,我们可以使用 BOOST_TEST_INFO() 来输出消息,这更清晰:

#define BOOST_CHECK_EQUAL_MESSAGE(L, R, M)      { BOOST_TEST_INFO(M); BOOST_CHECK_EQUAL(L, R); }
#define BOOST_WARN_EQUAL_MESSAGE(L, R, M)       { BOOST_TEST_INFO(M); BOOST_WARN_EQUAL(L, R); }
#define BOOST_REQUIRE_EQUAL_MESSAGE(L, R, M)    { BOOST_TEST_INFO(M); BOOST_REQUIRE_EQUAL(L, R); }
Run Code Online (Sandbox Code Playgroud)