BOOST_CHECK_EQUAL(及其衍生品)如何添加自定义消息

10

我们最近开始使用Boost Test框架,并且到目前为止很喜欢它。然而,有些测试需要在现有辅助函数中添加自定义消息,这将非常有用。

例如,我可以在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);
    }
}
在这种情况下,无法知道哪个 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参数进行相等性检查。

2020年更新: BOOST_TEST_CONTEXT()BOOST_TEST_INFO() ,如果您使用的是一个比较新的boost版本,这应该是首选的方法,因为框架提供的操作显然更加干净。

有没有一种优雅的方法来覆盖/提供我的方法?

2个回答

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 )

虽然这可能不是最佳方法(主要是因为在上面的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); }

1
您也可以根据此处提供的文档使用BOOST_TEST_CONTEXT():https://www.boost.org/doc/libs/1_65_0/libs/test/doc/html/boost_test/test_output/test_tools_support_for_logging/contexts.html - John Zwinck

1

针对您所描述的需求,您应该使用上下文的概念。

否则,断言BOOST_TEST(以及这里)支持将字符串作为第二个参数,用于显示自定义消息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接