使用 quickCheck 为 levenshtein 距离实现生成测试用例

Generate test cases for levenshtein distance implementation with quickCheck

作为我学习 quickCheck 的一部分,我想为 levenshtein 编辑距离实现构建一个测试生成器。我认为明显的方法是从两个相等的字符串和一个随机的不可缩减的 insert/delete/traspose 动作系列开始,将其应用于其中一个字符串并断言编辑距离是随机系列的长度。

我对此很困惑,有人可以帮忙吗?

"non-reducible" 正确听起来很难。我会尝试找到更多不那么复杂的不变量。以下是一些想法:

  1. 任意字符串与其自身的编辑距离为0
  2. 没有两个字符串具有负编辑距离。
  3. 对于任意字符串 x,如果您恰好对其应用一个更改,生成 yxy 之间的编辑距离应为 1。
  4. 给定两个字符串 xy,计算它们之间的距离 d。然后,改变 y,产生 y',并计算它与 x 的距离:它应该与 d 最多相差 1.
  5. 对字符串 x 应用 n 编辑后,编辑的字符串与 x 之间的距离最多应为 n。请注意,情况 (1) 是这种情况的一种特殊情况,其中 n=0,因此如果您愿意,可以省略该情况以求简洁。或者,保留它,因为情况 (1) 可能会生成更简单的反例。
  6. 函数应该是对称的:从xy的编辑距离应该与从yx的编辑距离相同。

如果您有另一个已知良好的算法实现来测试,您可以与它进行比较,并断言您总是得到与它相同的答案。

以上都是没有经过研究就打动我的东西。您可以做更多:例如,对 lower and upper bounds as defined by wikipedia.

进行编码