我想测试字符串类的不同构造函数。因此,我给自己写了一个检查几个标准事物的测试方法:
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中获取行和文件信息!我无法通过输出知道第一次或第二次调用是否导致了这种情况。
对此有什么共同的解决方法?
干杯!
答案 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 _...宏的存在是为了避免行号丢失的函数调用(除非明确地作为参数传递)。
你可以通过循环测试用例中的参数集来解决这个问题。