我有一个C++函数,该函数返回多行std::string。在测试用例中,我将每一行与已知值进行比较-类似于:

std::string known = "good\netc";
std::string output = "bad\netc";

std::vector<std::string> knownvec;
pystring::splitlines(known, knownvec); // splits on \n

std::vector<std::string> outvec;
pystring::splitlines(output, outvec);

CHECK_EQUAL(osvec.size(), resvec.size());

for(unsigned int i = 0; i < std::min(outvec.size(), knownvec.size()); ++i)
    CHECK_EQUAL(pystring::strip(outvec[i]), pystring::strip(knownvec[i]));

此方法有效,但是说添加了一个新行,则所有后续的CHECK_EQUAL断言均失败,这使输出难以读取

有没有更好的方法来比较两个字符串,理想情况下是一种很好的,自包含的方式(即不链接Giantdifflib,或不将字符串写入文件并调用diff命令!)

[编辑]我正在使用OpenImageIO's rather simple unittest.h

被比较的数据主要是YAML或颜色查找表。 Here's an example test case-基本上是几行标题,然后是很多数字:
 Version 1
 Format any
 Type ...
 LUT:
 Pre {
   0.0
   0.1
   ...
   1.0
 }
 3D {
   0.0
   0.1
   ...
   1.0
 }

最佳答案

最简单的方法是在字符串不再匹配时退出循环:

for(unsigned int i = 0; i < std::min(outvec.size(), knownvec.size()); ++i)
{
    bool areEqual = pystring::strip(outvec[i]) == pystring::strip(knownvec[i]);
    CHECK_EQUAL(pystring::strip(outvec[i]), pystring::strip(knownvec[i]));
    if (!areEqual)
        break;
}

如果CHECK_EQUAL返回一个 bool(boolean) 值,那么显然可以简化上述示例。

如果希望您的单元测试框架在比较多行字符串时提供与diff相同的输出,那么恐怕您期望单元测试框架中的内容太多。如果您不想链接到外部库,或者不想在测试程序中执行diff,则必须自己编写某种diff算法。

查看关于diff算法和库信息的其他question

如果您发现自己实现diff算法不值得麻烦(可能不值得),那么请查看Google Diff-Match-Patch库。

07-24 09:50
查看更多