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

2024-05-16

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

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

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

  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 中描述的标准方法有哪些?例如,“值”不仅需要是散列:还可以存储对象的大小 - 毕竟,如果两个对象的大小相差很大,那么它们就不可能相同。

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


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 与其地球上的克隆进行比较)。我研究了单元测试、逆向工程、各种取证等等的途径。在开发阶段,可以确保与单元测试的一致性,但这对于仪器分析似乎没有用。对于逆向工程,目标可以是代码和数据一致,但评估重新设计的代码保真度的方法似乎并不特别容易找到。基于每个程序的取证很容易找到,但程序之间的比较似乎并不常见。


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

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

尽管数据流编程通常与并行或分布式计算相关,但它似乎与反应式编程 http://en.wikipedia.org/wiki/Reactive_programming,这就是如何实现对象监控(例如哈希)。

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

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


注 1:Henrik Nilsson 和 Peter Fritzson拥有多篇论文 http://www.cs.nott.ac.uk/~nhn/papers.html关于惰性函数式语言的调试,这在某种程度上是相关的:调试目标是评估值,而不是代码的执行。这张纸 ftp://ftp.ida.liu.se/pub/labs/pelab/papers/aadebug93ladb.ps.gz似乎有几个好主意,他们的工作部分受到启发在名为 Lustre 的反应式编程语言的调试器上。这些参考资料并没有回答最初的问题,但可能会引起面临同样挑战的任何人的兴趣,尽管是在不同的编程环境中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

两个程序对象运行时比较的方法 的相关文章

  • 为什么这个 R ggplot2 代码会显示一个空白的显示设备?

    虽然 SO 通常不用于帮助解决错误 但这个显示了特别简单且特别烦人的行为 如果你是一个ggplot2用户 您可以在 10 秒或更短的时间内重现它 正如这个 GitHub 问题 ggplot gtable 创建空白显示 https githu
  • 使用valgrind进行GDB远程调试

    如果我使用远程调试gdb我连接到gdbserver using target remote host 2345 如果我使用 valgrind 和 gdb 调试内存错误 以中断无效内存访问 我会使用 target remote vgdb 启动
  • C语言中如何通过内存地址映射函数名和行号?

    如何用 GCC 中的内存地址映射回函数名称和行号 即假设一个 C 语言原型 void func Get the address of caller maybe this could be avoided MemoryAddress get
  • 优雅降级 - 何时考虑

    在为使用 AJAX 的应用程序设计和构建 UI 时 您何时考虑优雅降级 对于禁用 JavaScript 或正在使用屏幕阅读器的用户 最后 网站的 AJAX 版本完全完成后 在每个发展阶段 I don t 还有别的事 这些日子 渐进增强 ht
  • “对象之间通过传递消息进行通信”到底是如何实现的?

    在几本有关面向对象编程的介绍性文本中 我遇到过上述陈述 来自维基百科 在 OOP 中 每个对象都能够接收消息 处理数据 以及发送消息与其他对象相关 并且可以被视为具有独特角色或责任的独立 机器 该语句在代码中到底意味着什么 class A
  • BPEL Designer for Eclipse:如何调试 BPEL 流程

    我正在尝试调试 BPEL 流程 我使用 BPEL Designer for Eclipse 3 7 2 制作它 我使用 Ode 1 3 作为引擎 我不知道如何调试我的过程 我可以在调试会话中将它部署在 ode 上 但我真的不明白之后我能做什
  • 如何调试 Gulp 任务?

    如何调试我的中定义的 gulp 任务gulpfile js使用诸如 Google Chrome 调试器之类的调试器逐行单步执行任务的代码 对于 Node js 6 3 版本 您可以使用 inspect flag https nodejs o
  • _CrtCheckMemory使用示例

    我试图了解如何使用 CrtCheckMemory追踪我正在开发的 Windows 应用程序中的堆损坏 我似乎无法让它返回false 这是我的测试代码 int test new int 1 for int i 0 i lt 100 i tes
  • Xcode 9 - 框架断点

    在 Xcode 7 和 8 中 我已经能够通过在也包含框架项目的 xcworkspace 中运行包含应用程序来调试我一直在开发的框架 如果我在框架中设置断点 它们就会在运行时被触发 在 Xcode 9 beta 6 中 情况不再如此 到目前
  • 使用 pgAdmin 调试 PostgreSQL 函数

    I refer this http www postgresonline com journal archives 214 Using PgAdmin PLPgSQL Debugger html启用 PostgreSQL 服务器中的调试器
  • Visual Studio 2010 - 在调试期间查看列表导致超时

    我正在尝试调试一个项目 突然遇到一个问题 如果我尝试查看它 枚举任何对象集合都会导致超时 如果我正常运行该程序 就没有问题 如果我尝试查看任何集合 例如列表 我会收到超时错误 整个事情就会崩溃 我认为我的一个更复杂的集合可能出了问题 所以我
  • IE 开发工具断点不起作用

    我正在尝试在 IE 11 中调试一些 javascript 但无法强制它在断点处停止 debugger 行工作正常 停止该行中的调试器 相同的文件没有debugger 行但在同一位置设置断点不会执行任何操作 功能正常 但调试器不会在断点处停
  • Visual Studio 调试器 - 自动变量分配

    我正在开发一个多开发人员项目 正在开发的应用程序是通过启动器应用程序启动的 该应用程序传递登录用户 位置等参数 现在 当我调试应用程序时 我在代码上设置了一个断点解析输入参数 并将用户名变量分配给我的用户名等 我可以对这些值进行硬编码 但是
  • 在 JellyBean 上使用 LogCat

    我有一个非常随机发生的错误 所以我依赖LogCat我从 Play 商店购买的监控应用程序 以查看发生时设备上抛出的异常 自从使用 Jelly Bean 以来 我没有看到任何日志记录 我读过 使用 Jelly Bean 应用程序只能看到Log
  • iOS 4.3 SDK - 在 3G 设备上调试

    目前有关 iOS 4 3 设备支持的信息还很少 然而 由于 iPhone 3G 设备 以及较旧的 iPod touch 设备 缺乏 4 3 Beta 版 许多人认为这可能是旧设备操作系统升级的终结 即使这个假设现在是错误的 但有一天它也不会
  • Debug.WriteLine() 未命中

    我正在调试 Windows 服务 通过点击F5在 Visual Studio 2010 中 使用以下代码 In 程序 cs file static void Main if Environment UserInteractive We ar
  • 有没有办法确定 Firebug 或 Web Inspector 中发出 XHR 的行?

    有没有办法确定 Firebug 或 Web Inspector 可能是 Opera Dragonfly IE 开发人员工具栏 中发出 XHR 的行和文件名 如果没有 找出答案的最佳方法是什么 只是在代码库中搜索调用的 URI 不过 通常它会
  • 未向 HAL 提供足够的数据,预期位置

    我在 Android Studio 中收到此错误 我只想在按下按钮时打印文本 我收到以下错误 每次按下按钮时都会出现该错误 如果我取消注释掉意图 它也可以正常工作 但是我拥有的代码越多 错误更改就越多 我实际上不确定这是真正的错误 我这么说
  • 如何为所有语言创建字母数字正则表达式?

    我今天遇到了这个问题 此正则表达式仅匹配英语 a zA Z0 9 如果我需要支持这个世界上的任何语言 我应该编写什么正则表达式 如果您使用字符类简写和 Unicode 识别正则表达式引擎 您就可以做到这一点 这 wclass 匹配 单词字符
  • Visual Studio C# 2010 Express 调试运行速度比发布速度更快

    我有一个恰好有 2 个线程的 Windows 窗体应用程序 这些线程彼此之间的交互为零 第一个线程运行时不会干扰第二个线程 它们之间没有同步 因为不需要发生这种情况 第一个线程处理应用程序的 UI 更改颜色和标签 并运行一个计时器来捕获一些

随机推荐