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