我正在进行一种特定类型的代码测试,该测试相当麻烦并且可以自动化,但我不确定最佳实践。在描述问题之前,我想澄清一下,我正在寻找合适的术语和概念,以便我可以阅读有关如何实现它的更多信息。当然,欢迎就最佳实践提出建议,但我的目标很具体:这种方法叫什么?
在最简单的情况下,我有两个程序,它们接收一堆数据,生成各种中间对象,然后返回最终结果。当端到端测试时,最终结果会有所不同,因此需要找出差异发生在哪里。不幸的是,即使是中间结果也可能有所不同,但并不总是有很大差异(即一些差异是可以容忍的)。最后的问题是,两个程序之间的中间对象不一定具有相同的名称,并且两组中间对象可能不完全重叠(例如,一个程序可能比另一个程序具有更多的中间对象)。因此,我不能假设两个程序中创建的对象之间存在一对一的关系。
我正在考虑采用的自动比较对象的方法如下(它大致受到文本语料库中频率计数的启发):
- 对于每个程序,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 中描述的标准方法有哪些?例如,“值”不仅需要是散列:还可以存储对象的大小 - 毕竟,如果两个对象的大小相差很大,那么它们就不可能相同。
在实践中,我倾向于比较少量项目,但我怀疑当自动化时,这不需要涉及用户的大量输入。
Edit 1: 在比较执行轨迹方面是相关的;它提到了“代码比较”,这与我的兴趣有关,尽管我关心的是数据(即对象)而不是生成对象的实际代码。我只是浏览了一下,但会更仔细地审查它的方法。更重要的是,这表明比较代码跟踪可以扩展到比较数据跟踪。这张纸 http://www.ieee-security.org/TC/SP2011/PAPERS/2011/paper022.pdf分析了代码跟踪的一些比较,尽管是在完全不相关的安全测试领域。
也许数据跟踪和堆栈跟踪方法是相关的。检查点有点相关,但它的典型用途(即保存所有状态)有点矫枉过正。
编辑2:其他相关概念包括微分程序分析 http://www.cs.virginia.edu/~evans/pubs/woda.pdf远程系统(例如太空探测器)的监控,其中尝试使用本地实现(通常是克隆)重现计算(将 HAL-9000 与其地球上的克隆进行比较)。我研究了单元测试、逆向工程、各种取证等等的途径。在开发阶段,可以确保与单元测试的一致性,但这对于仪器分析似乎没有用。对于逆向工程,目标可以是代码和数据一致,但评估重新设计的代码保真度的方法似乎并不特别容易找到。基于每个程序的取证很容易找到,但程序之间的比较似乎并不常见。