两个程序对象的运行时比较方法

时间:2011-09-27 17:29:00

标签: debugging language-agnostic stack-trace data-tracing

我正在进行一种特殊类型的代码测试,这种代码测试非常麻烦且可以实现自动化,但我不确定最佳实践。在描述问题之前,我想说清楚我正在寻找合适的术语和概念,以便我可以阅读更多关于如何实现它的内容。当然欢迎对最佳实践的建议,但我的目标是具体的:这种方法叫做什么?

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

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

  1. 对于每个程序,A和B:创建在整个执行过程中创建的对象列表,可以以非常简单的方式编制索引,例如a001,a002,a003,a004,......以及类似的B(b001) ,...)。
  2. 设Na = A中遇到的唯一对象名称的#,类似于B中的Nb和#对象。
  3. 分别使用Na和Nb列创建两个表TableA和TableB。条目将在每个触发器处记录每个对象的值(即,对于每一行,在下面定义)。
  4. 对于A中的每个赋值,最简单的方法是捕获所有Na项的哈希值;当然,可以使用LOCF(最后一次观察结果)用于那些不改变的项目,并且任何尚未观察到的对象都被简单地给予NULL条目。对B。重复此操作。
  5. 通过哈希值匹配TableA和TableB中的条目。理想情况下,对象将以大致相同的顺序到达“词汇表”,因此顺序和哈希值将允许人们识别值的序列。
  6. 根据具有不同序列的任何对象的散列值序列发散的时间,查找A和B之间对象的差异。
  7. 现在,这是一种简单的方法,如果数据简单,原子,并且不易受数值精度问题的影响,它可以很好地工作。但是,我认为数值精度可能会导致哈希值发散,但如果差异大致达到机器容差水平,则影响可能无关紧要。

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

    第二:我在步骤3和4中描述的标准方法是什么?例如,“值”不仅需要是一个哈希:一个人也可能存储对象的大小 - 毕竟,如果两个对象的大小差异很大,则它们不能相同。

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


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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

虽然数据流编程通常与并行或分布式计算有关,但似乎与Reactive Programming相吻合,这就是如何实现对象监视(例如散列)。

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

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


注1:Henrik Nilsson和Peter Fritzson have a number of papers关于惰性函数语言的调试,它们有些相关:调试目标是评估值,而不是代码的执行。 This paper似乎有几个好主意,他们的工作部分激发了this paper调试器的一个名为Lustre的被动编程语言。这些参考文献没有回答原始问题,但是面对同样挑战的任何人都可能感兴趣,尽管是在不同的编程环境中。