BOOST_CHECK_EQUAL(和衍生物)添加自定义消息

时间:2014-10-30 12:23:49

标签: c++ unit-testing testing boost 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()

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

BOOST_AUTO_TEST_CASE(mytest4)
{
    for(int i = 0; i < 10; ++i)
    {
        BOOST_CHECK_EQUAL_WITH_ADDITIONAL_MESSAGE(i%3, 0, i);
    }
}

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

我试图“复制”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) )

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

有没有(简单而干净的)解决方法?

更新似乎 test_tools.ipp 中的 check_impl()实施不使用 check_descr 等于检查的参数。

有优雅的方式来覆盖/提供我自己的吗?

2 个答案:

答案 0 :(得分:4)

好的,我想发帖以供参考以防其他人碰到这个,我解决了这个问题:

//____________________________________________________________________________//

#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 )

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

更新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); }

答案 1 :(得分:0)

根据您的描述需要,您应该使用context的概念。

否则,断言BOOST_TEST(和here)支持一个字符串作为第二个参数,可用于显示自定义消息。