我有一个返回多行 std::string
的 C++ 函数。在这个测试用例中,我将每一行与已知值进行比较——类似于:
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 值,那么您显然可以稍微简化上面的示例。
如果希望您的单元测试框架在比较多行字符串时提供与 diff
相同的输出,那么恐怕您对单元测试框架的期望太高了。如果您不想链接到外部库,或者不想从您的测试程序中执行 diff
,那么您必须自己编写某种diff
算法。
查看其他 question关于 diff 算法和库的信息。
如果您发现自己实现差异算法不值得(很可能不值得),那么请查看 Google Diff-Match-Patch图书馆。
关于c++ - C++ 测试用例的基本字符串差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6832123/