使用boost.test进行复杂的检查方法

时间:2012-08-24 10:12:56

标签: testing boost

我想测试字符串类的不同构造函数。因此,我给自己写了一个检查几个标准事物的测试方法:

void checkStringStandards(String& s, size_t length, const char* text){
    BOOST_CHECK_EQUAL(s.length(), length);
    ...
}

然后我添加了一个测试方法

BOOST_AUTO_TEST_CASE(String_construct){
    String s1;
    checkStringStandards(s1, 0, "");

    String s2("normal char");
    checkStringStandards(s2, 11, "normal char");
}

问题是,当它失败时,我只从checkStringStandards中获取行和文件信息!我无法通过输出知道第一次或第二次调用是否导致了这种情况。

对此有什么共同的解决方法?

干杯!

2 个答案:

答案 0 :(得分:2)

此问题的解决方案是编写执行检查的自定义谓词,并在不同的测试用例中使用BOOST_REQUIRE(custom_predicate(args))。自定义谓词可以接受您想要的任何参数并返回boost::test_tools::predicate_result,这是一种与Boost.Test中的断言宏兼容的类型,您可以在失败期间构建详细的诊断消息。

使用您的示例:

using namespace boost::test_tools;
predicate_result checkStringStandards(String& s, size_t length, const char* text) {
    predicate_result result{true};
    if (s.length() != length) {
        result = false;
        result.message() << "\nString " << s
            << " differs in length; expected: "
            << length << ", actual: " << s.length();
    }
    ...
    return result;
}

BOOST_AUTO_TEST_CASE(String_construct){
    String s1;
    BOOST_REQUIRE(checkStringStandards(s1, 0, ""));

    String s2("normal char");
    BOOST_REQUIRE(checkStringStandards(s2, 11, "normal char"));
}

消息开头的好奇\n是这样的,当打印诊断时,“String ...长度不同”的文本将在它自己的行上发出。如果谓词失败,则会导致其失败,直至BOOST_REQUIRE,这将触发测试失败,并在调用BOOST_REQUIRE而不是自定义谓词内的行中报告失败。

另外还有另一个更加笨拙的选择,通过使你的自定义断言成为巨大的巨型宏来实现相同的结果,但我发现这么可怕我甚至不会展示如何做到这一点的例子:)。

答案 1 :(得分:0)

对此没有共同的解决方法。这些BOOST_CHECK _...宏的存在是为了避免行号丢失的函数调用(除非明确地作为参数传递)。

你可以通过循环测试用例中的参数集来解决这个问题。