Page 47 - 《软件学报》2025年第4期
P. 47
沈阚 等: 基于静态分析的 Python 第三方库 API 兼容性问题检测方法 1453
第 2.2.1 节的标准选取了跨 major、minor、patch 的 6 个版本对, 分别为 sklearn 0.24.2→1.0.0、sklearn 1.1.3→1.2.0、
sklearn 1.1.0→1.1.3、numpy 1.26.4→2.0.0、numpy 1.25.2→1.26.0 以及 numpy 1.26.0→1.26.4. 然后, 采用与 flask
库和 pandas 库相同的方法在这 6 个版本对上进行正样本 (不兼容 API 对) 和负样本 (兼容 API 对) 的收集, 一共收
集到 88 个正样本和 71 个负样本. 具体来说, 在 sklearn 库上收集到 58 个正样本和 34 个负样本, 在 numpy 库上收
集到 30 个正样本和 37 个负样本. 正样本的具体分布如表 7 所示. 此外, 与 RQ3 相同, 评估时指定方法检测这 6 个
版本对上的共计 159 个 API.
表 7 sklearn 库和 numpy 库上的 API 兼容性问题数据
序号 兼容性问题产生原因 总计 (个) sklearn库不兼容API数量 (个) numpy兼容API数量 (个)
CI1 参数的增删 19 17 2
CI2 关键字参数的键增删 7 7 0
CI3 参数的重命名 3 2 1
CI4 参数默认值的改变 13 13 0
CI5 参数的范围改变 17 15 2
CI6 抛出不同的异常 1 0 1
CI7 输出不同的返回值 32 8 24
总计 88 58 30
注: 由于一个API可能由多种原因导致不兼容, 总计数据小于各项加和
4.2.2.2 评价指标
与 RQ3 相同, 本文使用精准率和召回率来评估方法的泛化性.
4.2.3 时间性能和空间性能评估 (RQ5)
4.2.3.1 实验数据
为充分评估方法的时间性能和空间性能, 一方面, 本文指定方法检测上文在 flask 库、pandas 库、sklearn 库、
numpy 库的 12 个版本对上收集到的 196 个不兼容 API 对和 179 个兼容 API 对; 另一方面, 使用方法直接检测 12
个版本对中的所有变更 API. Python
4.2.3.2 评价指标
本文使用对 API 进行检测的平均耗时来评估方法的时间性能, 单位为 s; 本文使用检测时的内存占用来评估
方法的空间性能, 单位为 MB. 由于检测时的时间消耗和内存占用有一定的随机性, 本文使用运行 3 次的平均值.
4.2.4 易用性评估 (RQ6)
评估易用性是探讨本文检测方法是否能帮助开发者简便地理解 API 兼容性问题, 从而避免上层应用异常终止
或产生不一致的结果. 一方面, 本文从理解时间的缩短以及理解正确率的提升这两个角度进行定量评估; 另一方
面, 本文从对定位不兼容代码元素的帮助以及对理解问题产生原因的帮助这两个角度进行定性评估.
4.2.4.1 实验数据
本文检测方法的应用场景是从第三方库两个版本的源代码中为开发者检测不兼容 API, 并提供兼容性问题产
生原因. 因此, 本文邀请了 10 名具有 3 年以上 编程经验的开发者在不兼容 API 上进行人工实验, 其中不包
含本文的作者. 本文从收集到的 196 个不兼容 API 对中随机抽取 14 个, 记为 API 1 –API 14 . 7 种兼容性问题产生原
因 (CI1–CI7) 在 API 1 –API 1 中均有 2 个. 本文将 10 名参与者平均分成两组, 为他们提供 API 前后两个版本的代码
4
差异对比, 他们需要从 API 1 开始对 API 1 –API 1 进行标注. 第 1 组需要标注的前 7 个 API 被提供了本文检测方法
4
的结果, 而后 7 个没有; 第 2 组以相反的形式被提供检测方法结果.
4
具体来说, 10 名实验参与者需要理解 API 1 –API 1 的兼容性问题产生原因, 然后分别进行标注, 并记录对每个
API 进行标注的时间. 在完成上述任务后, 参与者还需要对 2 个定性问题打分, 分数区间为 0–5, 具体问题如下.
● 问题 1: 与直接看 API 的代码差异相比, 我们的工具更能帮助定位造成兼容性问题的代码元素吗?
● 问题 2: 与直接看 API 的代码差异相比, 我们的工具更能帮助理解造成兼容性问题的产生原因吗?