1

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

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 中获取行和文件信息!我无法通过输出知道是第一次调用还是第二次调用导致了这种情况。

对此有什么常见的解决方法?

干杯!

4

2 回答 2

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消息开头的奇怪之处在于,当打印诊断时,带有“字符串...长度不同”的文本将在它自己的行上发出。如果谓词失败,它会将其失败冒泡到BOOST_REQUIRE这将触发测试失败并在调用行BOOST_REQUIRE而不是在您的自定义谓词中报告失败。

还有另一种更糟糕的替代方案,它也可以通过将您的自定义断言作为巨大的 megamacros 来实现相同的结果,但我发现这太可怕了,我什至不打算展示如何做到这一点的示例 :)。

于 2014-08-08T20:10:47.357 回答
0

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

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

于 2012-12-07T19:11:05.850 回答