【问题标题】:BOOST_CHECK_EQUAL (and dervatives) Add custom messageBOOST_CHECK_EQUAL(和衍生物)添加自定义消息
【发布时间】:2014-12-26 11:43:38
【问题描述】:

我们最近开始使用 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);
    }
}

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

我试图“复制” 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: 在测试实现中的某处被覆盖,出现了失败的情况。

有什么(简单而干净的)方法可以解决这个问题吗?

UPDATE 似乎 test_tools.ipp 中的 check_impl() 实现没有使用 check_descr 相等性检查的参数。

2020 年更新 BOOST_TEST_CONTEXT()BOOST_TEST_INFO() ,如果您可以使用合理的最新 boost 版本,现在应该是首选方法,因为框架提供的操作当然要干净得多。

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

【问题讨论】:

    标签: c++ unit-testing testing boost boost-test


    【解决方案1】:

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

    //____________________________________________________________________________//
    
    #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 年 8 月更新

    对于较新的 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); }
    

    【讨论】:

    【解决方案2】:

    对于您所描述的需求,您应该使用context 的概念。

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

    【讨论】:

      猜你喜欢
      • 2012-03-19
      • 1970-01-01
      • 1970-01-01
      • 2012-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-13
      • 2019-03-12
      相关资源
      最近更新 更多