Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ BOOST_CHECK_EQUAL(和dervatives)添加自定义消息_C++_Unit Testing_Testing_Boost_Boost Test - Fatal编程技术网

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

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

我们最近开始使用Boost测试框架,到目前为止都很喜欢它。 然而,在某些测试中,如果我们可以将自定义消息添加到现有帮助器中,那将是一件好事

例如,我可以在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()
但是,“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); }