You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

回归测试:两种异构格式数据自动化对比的逻辑实现咨询

嘿,我来给你梳理几个可行的逻辑方向,核心思路就是把两个文件都转成统一的、有序的键值对集合列表,这样后续对比就完全不是问题了。针对你的场景,分三个部分来拆解:

第一步:处理File 1(带冗余的JSON)

这个相对简单,核心是提取有效数据并规整:

  • 先解析JSON文件:用标准的JSON处理工具(比如Python的json模块)读取整个文件,拿到字典结构后,直接提取Chan-1对应的列表——这就是你那400个数据块。
  • 剔除冗余键:提前列好需要保留的16个键的固定顺序(比如["key1", "key2", "key3", ...]),然后遍历每个数据块(字典),只保留这些键,生成新的有序结构。比如用collections.OrderedDict,或者直接转成按固定顺序排列的元组列表[(key1, val1), (key2, val2), ...]——用有序结构是为了满足你“顺序一致”的校验要求。
第二步:处理File 2(Python调用语句列表)

这部分是重点,需要把代码字符串转成结构化数据,推荐这样做:

  • 提取参数内容:用正则表达式精准匹配每个spacecraft.telemetry.channel(...)里的参数段。比如用正则r'spacecraft\.telemetry\.channel\((.*?)\)',对整个File 2的字符串做全局匹配,就能直接拿到所有400个参数块的字符串(比如key1=val1,key2="val2",key3=val3)。这个方法比手动字符串分割靠谱得多,能避免各种边界情况。
  • 解析单个参数块:对每个参数字符串,先去掉所有空格(避免key1=val1 , key2="val2"这种带空格的情况干扰),然后按逗号分割成key=value片段。接着对每个片段:
    • 以第一个=为分隔符拆分键和值:左边是键,右边是值内容。
    • 格式化值:如果值带双引号,就去掉首尾的引号;如果是数字(比如val2是数值),转成对应的int或float类型——这一步很重要,要和JSON里的类型保持一致,不然会出现“值相同但类型不同”的误判。
  • 规整为统一结构:把解析后的键值对,按照和File 1完全相同的键顺序,生成一样的有序结构(比如同样的OrderedDict或者元组列表)。这样两个文件的每个数据块结构就完全对齐了。
第三步:统一对比逻辑

当两个文件都转成相同结构的列表后,对比就清晰明了:

  • 先校验总数量:确认两个列表的长度都是400,避免文件读取或解析时丢失数据。
  • 逐元素对比:遍历每个索引位置的两个数据块,依次对比每个键值对的键、值以及顺序。如果某个位置的某个键值对不一致,记录下索引、键、两边的值,方便后续的差异校验处理。
几个关键注意点
  • 类型一致性:JSON里的数值是数字类型,而File 2里的数值是不带引号的字符串,一定要转成相同类型再对比,不然会出现不必要的差异报警。
  • 键顺序严格性:如果你必须校验键的顺序,一定要用显式的有序结构(比如OrderedDict或者固定顺序的元组列表),不要依赖Python 3.7+字典的默认有序性——显式处理更可靠,也更容易维护。
  • 边界情况处理:如果File 2的参数里有带逗号的字符串值(比如key="a,b,c"),那直接按逗号分割会出错,这时候可以用Python的shlex模块,它能智能分割逗号同时忽略引号内的内容。

内容的提问来源于stack exchange,提问作者luci5r

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:08:59