C++ BOOST_CHECK_EQUAL(和dervatives)添加自定义消息
我们最近开始使用Boost测试框架,到目前为止都很喜欢它。 然而,在某些测试中,如果我们可以将自定义消息添加到现有帮助器中,那将是一件好事 例如,我可以在mytest和mytest2中获得输出,但无法在mytest3中获得输出:C++ BOOST_CHECK_EQUAL(和dervatives)添加自定义消息,c++,unit-testing,testing,boost,boost-test,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(mytes
#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()
但是,“hello world:在测试实现中的某个地方被覆盖,并带有失败的条件
有什么(简单而干净的)方法可以解决这个问题吗
更新似乎test_tools.ipp中的check_impl()实现没有将check_descr参数用于相等性检查
更新2020
而且,如果您可以使用合理的最新boost版本,那么现在应该是首选方法,因为框架提供的操作当然要干净得多
有没有一种优雅的方法可以替代/提供我自己的?好的,我只想发表一篇文章以供参考,以防其他人遇到我这样解决的问题:
BOOST_AUTO_TEST_CASE(mytest4)
{
for(int i = 0; i < 10; ++i)
{
BOOST_CHECK_EQUAL_WITH_ADDITIONAL_MESSAGE(i%3, 0, i);
}
}
//____________________________________________________________________________//
#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 )
对于您描述的需求,您应该使用的概念是
否则,断言(和)支持字符串作为第二个参数,可用于显示自定义消息。您也可以使用
BOOST\u TEST\u CONTEXT()
,如下所述:
//____________________________________________________________________________//
#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 )
#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); }