c++ - BOOST_CHECK_EQUAL(和衍生品)添加自定义消息

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

我们最近开始使用 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: 在测试实现中的某个地方被失败条件覆盖。

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

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

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

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

最佳答案

好的,我只是想发布以供引用,以防其他人遇到我这样解决的问题:

//____________________________________________________________________________//

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

关于c++ - BOOST_CHECK_EQUAL(和衍生品)添加自定义消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26652904/

相关文章:

c++ - 类似 Parse 的 CSV(空白分隔符和 boost )

c++ - 正确退出 gtkmm 应用程序

c++ - Gtk::Grid 中的子部件包装

unit-testing - VS2012 单元测试 : How to change the location of the TestResults folder

c# - 在 Visual Studio 2012 中保存测试

java - Mockito 和 JUnit : Which is the best to use Runner or TestRule?

node.js - 无法在 Node js 上使用 mocha 运行 PhantomJS

c++ - 是否喜欢更长的生命周期/更大范围的局部变量?

java - Spring Controller 的 catch block 中的单元测试代码

javascript - 如何测试 Angular 中嵌入的内容?