c++ - C++ 测试用例的基本字符串差异

标签 c++ string unit-testing diff

我有一个返回多行 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/

相关文章:

java - 有没有办法获取 ClassLoader 加载了哪些类?

java - 单元测试定义 - 范围和模拟外部依赖

c++ - 在 Windows XP 和 CodeBlocks 上延迟加载 DWMAPI

ios - View Controller TDD

java - 相当于 Java 中的 vector<T>

string - Python 转换字母数字

java - 如何从 JDatePicker 中提取和重置日期?

c++ - 从字符串中删除重复字符的函数仅部分适用于相邻字符

c++ 两个 tbb::parallel_for 循环效率

android - 使用蓝牙组件将数据从 Android 手机传输到串行设备时出现问题