c++测试用例的基本字符串-diff

Basic string-diff for C++ test case

本文关键字:字符串 -diff 测试用例 c++      更新时间:2023-10-16

我有一个c++函数,它返回多行std::string。在测试用例中,我将每行与已知值进行比较——例如:

std::string known = "goodnetc";
std::string output = "badnetc";
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的相当简单的unittest.h

比较的数据主要是YAML或颜色查找表。下面是一个示例测试用例——基本上是几行标题,然后是许多数字:

 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返回一个布尔值,那么显然可以将上面的示例简化一点。

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

查看另一个关于diff算法和库的信息的问题。

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

简体:

为了单元测试的目的,您只需要标记它们是不同的。单元测试不修复失败的单元测试,程序员修复失败的单元测试。

:

如果你的序列大小可能不同,没有一个简单的,通用的方法来比较它们。我认为你需要一个巨大的困难才能做得很差,更不用说充分了。

我认为如果你不能说序数不是一个单位,那么你将不得不使用搜索来添加信息。

考虑这个退行性病例:

a b c d e f
d e f a b c

您是否选择这些解决方案中的任何一个都将归结为对结果或实现的某些工件进行评分:

      a b c d e f
d e f a b c
a b c d e f
      d e f a b c

我的观点是,如果你必须给一个结果分配一个分数,那么单元测试就不太可能适用。

比较容器通常不是很容易,如果结果不能按字典顺序排序,我不确定任何计算结果除了告诉您它的不同之外还能提供信息。

这显然是一个有趣的问题,但它可能超出了单元测试的范围。

基本的diff算法很容易实现,如果不是非常高效的话。这篇维基百科文章是一个很好的起点。