我有一个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库。