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

问题描述:

我们最近开始使用Boost测试框架,就像目前一样。 但是,如果我们可以将自定义消息添加到现有的帮助程序,那么有些测试会很好。BOOST_CHECK_EQUAL(和dervatives)添加自定义消息

例如,我可以得到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宏观如下,希望推动将追加到传递消息的原始宏传递一个空的文字:

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

然而,“世界你好:在某处覆盖在与故障条件下的测试实现。

有没有解决这个问题的任何(易清洁)的方式?

UPDATE看起来好像check_impl()中的实现test_tools.ipp不使用check_descr参数进行相等性检查。

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

好吧,我只是想张贴万一别人参考运行到这一点,我解决它是这样的:

//____________________________________________________________________________// 

#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),似乎通过这个规定,其中可能需要额外的消息少数情况下,一个合理的清洁和非侵入性的解决方案

UPDATE 2017-08

对于较新的提升测试版本中,我们可以使用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); } 

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

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