4

我正在通过一种特定类型的代码测试,这种测试相当麻烦并且可以自动化,但我不确定最佳实践。在描述问题之前,我想明确表示我正在寻找适当的术语和概念,以便我可以阅读更多关于如何实现它的信息。当然,欢迎就最佳实践提出建议,但我的目标很明确:这种方法叫什么?

在最简单的情况下,我有两个程序接收一堆数据,生成各种中间对象,然后返回最终结果。当端到端测试时,最终结果会有所不同,因此需要找出差异发生在哪里。不幸的是,即使是中间结果也可能会有所不同,但并不总是以显着的方式存在(即某些差异是可以容忍的)。最后一个问题是,两个程序之间的中间对象可能不一定具有相同的名称,并且两组中间对象可能不完全重叠(例如,一个程序可能比另一个程序具有更多的中间对象)。因此,我不能假设在两个程序中创建的对象之间存在一对一的关系。

我正在考虑自动进行对象比较的方法如下(它大致受到文本语料库中的频率计数的启发):

  1. 对于每个程序,A 和 B:创建一个在整个执行过程中创建的对象的列表,可以以非常简单的方式对其进行索引,例如 a001、a002、a003、a004,...,对于 B(b001,.. .)。
  2. 令 Na = 在 A 中遇到的唯一对象名称的数量,类似地对于 Nb 和 B 中的对象名称。
  3. 创建两个表,TableA 和 TableB,分别包含 Na 和 Nb 列。条目将在每个触发器处为每个对象记录一个值(即,为每一行,接下来定义)。
  4. 对于 A 中的每个赋值,最简单的方法是获取所有 Na 项的哈希值;当然,对于那些没有变化的项目,可以使用 LOCF(最后一次观察结转),并且任何尚未观察到的对象都被简单地赋予一个 NULL 条目。对 B 重复此操作。
  5. 通过它们的哈希值匹配 TableA 和 TableB 中的条目。理想情况下,对象将以大致相同的顺序进入“词汇表”,因此顺序和散列值将允许人们识别值的序列。
  6. 根据散列值序列何时针对具有发散序列的任何对象发散,查找 A 和 B 之间对象中的差异。

现在,这是一种简单的方法,如果数据简单、原子且不易受到数值精度问题的影响,它可以很好地工作。但是,我相信数值精度可能会导致散列值发散,尽管如果差异大约在机器容差水平,则影响是微不足道的。

第一:这类测试方法和概念的名称是什么?答案不一定是上述方法,而是反映用于比较来自两个(或更多)不同程序的对象的方法类。

第二:对于我在步骤 3 和 4 中描述的内容,存在哪些标准方法?例如,“值”不仅需要是一个哈希值:还可以存储对象的大小——毕竟,如果两个对象的大小差异很大,它们就不可能相同。

在实践中,我倾向于比较少量的项目,但我怀疑当自动化时这不需要来自用户的大量输入。


编辑1:本文与比较执行痕迹有关;它提到了“代码比较”,这与我的兴趣有关,尽管我关心的是数据(即对象)而不是生成对象的实际代码。我只是略读它,但会更仔细地审查它的方法。更重要的是,这表明比较代码跟踪可以扩展到比较数据跟踪。 本文分析了代码跟踪的一些比较,尽管是在一个完全不相关的安全测试领域。

也许数据跟踪和堆栈跟踪方法是相关的。检查点有点相关,但它的典型用途(即保存所有状态)是多余的。

编辑 2:其他相关概念包括差异程序分析和远程系统监控(例如太空探测器),其中尝试使用本地实现重现计算,通常是克隆(想想 HAL-9000 与其地球上的克隆相比) . 我查看了单元测试、逆向工程、各种取证等等的路线。在开发阶段,可以确保与单元测试一致,但这似乎对仪器分析没有用处。对于逆向工程,目标可以是代码和数据一致性,但评估重新设计代码保真度的方法似乎并不容易找到。每个程序的取证很容易找到,但程序之间的比较似乎并不常见。

4

1 回答 1

0

(制作这个答案社区维基,因为数据流编程和反应式编程不是我的专业领域。)

数据流编程领域似乎是相关的,因此数据流程序的调试可能会有所帮助。 这篇 1981 年的论文给出了几个有用的高级想法。虽然很难将这些转换为立即适用的代码,但它确实提出了一种我忽略的方法:当将程序作为数据流处理时,可以静态或动态识别输入值的变化导致中间处理中其他值变化的位置或在输出中(如果要检查控制流,不仅仅是执行中的更改)。

尽管数据流编程通常与并行或分布式计算有关,但它似乎与响应式编程相吻合,这是可以实现对象监控(例如散列)的方式。

这个答案远远不够,因此是 CW 标签,因为它并没有真正命名我描述的调试方法。也许这是响应式编程范式的一种调试形式。

[另请注意:尽管此答案是 CW,但如果有人对数据流或反应式编程有更好的答案,请随时发布单独的答案,我将删除此答案。]


注 1:Henrik Nilsson 和 Peter Fritzson有许多关于惰性函数式语言调试的论文,它们有些相关:调试目标是评估值,而不是代码的执行。 这篇论文似乎有几个好主意,他们的工作部分启发了这篇论文,该论文开发了一种名为 Lustre 的响应式编程语言的调试器。这些参考资料没有回答最初的问题,但可能对面临同样挑战的任何人感兴趣,尽管在不同的编程环境中。

于 2011-09-28T01:05:20.707 回答