我正在通过一种特定类型的代码测试,这种测试相当麻烦并且可以自动化,但我不确定最佳实践。在描述问题之前,我想明确表示我正在寻找适当的术语和概念,以便我可以阅读更多关于如何实现它的信息。当然,欢迎就最佳实践提出建议,但我的目标很明确:这种方法叫什么?
在最简单的情况下,我有两个程序接收一堆数据,生成各种中间对象,然后返回最终结果。当端到端测试时,最终结果会有所不同,因此需要找出差异发生在哪里。不幸的是,即使是中间结果也可能会有所不同,但并不总是以显着的方式存在(即某些差异是可以容忍的)。最后一个问题是,两个程序之间的中间对象可能不一定具有相同的名称,并且两组中间对象可能不完全重叠(例如,一个程序可能比另一个程序具有更多的中间对象)。因此,我不能假设在两个程序中创建的对象之间存在一对一的关系。
我正在考虑自动进行对象比较的方法如下(它大致受到文本语料库中的频率计数的启发):
- 对于每个程序,A 和 B:创建一个在整个执行过程中创建的对象的列表,可以以非常简单的方式对其进行索引,例如 a001、a002、a003、a004,...,对于 B(b001,.. .)。
- 令 Na = 在 A 中遇到的唯一对象名称的数量,类似地对于 Nb 和 B 中的对象名称。
- 创建两个表,TableA 和 TableB,分别包含 Na 和 Nb 列。条目将在每个触发器处为每个对象记录一个值(即,为每一行,接下来定义)。
- 对于 A 中的每个赋值,最简单的方法是获取所有 Na 项的哈希值;当然,对于那些没有变化的项目,可以使用 LOCF(最后一次观察结转),并且任何尚未观察到的对象都被简单地赋予一个 NULL 条目。对 B 重复此操作。
- 通过它们的哈希值匹配 TableA 和 TableB 中的条目。理想情况下,对象将以大致相同的顺序进入“词汇表”,因此顺序和散列值将允许人们识别值的序列。
- 根据散列值序列何时针对具有发散序列的任何对象发散,查找 A 和 B 之间对象中的差异。
现在,这是一种简单的方法,如果数据简单、原子且不易受到数值精度问题的影响,它可以很好地工作。但是,我相信数值精度可能会导致散列值发散,尽管如果差异大约在机器容差水平,则影响是微不足道的。
第一:这类测试方法和概念的名称是什么?答案不一定是上述方法,而是反映用于比较来自两个(或更多)不同程序的对象的方法类。
第二:对于我在步骤 3 和 4 中描述的内容,存在哪些标准方法?例如,“值”不仅需要是一个哈希值:还可以存储对象的大小——毕竟,如果两个对象的大小差异很大,它们就不可能相同。
在实践中,我倾向于比较少量的项目,但我怀疑当自动化时这不需要来自用户的大量输入。
编辑1:本文与比较执行痕迹有关;它提到了“代码比较”,这与我的兴趣有关,尽管我关心的是数据(即对象)而不是生成对象的实际代码。我只是略读它,但会更仔细地审查它的方法。更重要的是,这表明比较代码跟踪可以扩展到比较数据跟踪。 本文分析了代码跟踪的一些比较,尽管是在一个完全不相关的安全测试领域。
也许数据跟踪和堆栈跟踪方法是相关的。检查点有点相关,但它的典型用途(即保存所有状态)是多余的。
编辑 2:其他相关概念包括差异程序分析和远程系统监控(例如太空探测器),其中尝试使用本地实现重现计算,通常是克隆(想想 HAL-9000 与其地球上的克隆相比) . 我查看了单元测试、逆向工程、各种取证等等的路线。在开发阶段,可以确保与单元测试一致,但这似乎对仪器分析没有用处。对于逆向工程,目标可以是代码和数据一致性,但评估重新设计代码保真度的方法似乎并不容易找到。每个程序的取证很容易找到,但程序之间的比较似乎并不常见。