Page 34 - 《软件学报》2025年第4期
P. 34
1440 软件学报 2025 年第 36 卷第 4 期
证研究的设计, 然后介绍实证研究中分析数据的来源, 最后介绍实证研究的结果.
2.1 实证研究的设计
本文希望通过对 Python 第三方库 API 兼容性问题进行实证研究, 探索 Python 第三方库 API 兼容性问题的表
现形式和产生原因.
RQ1: Python 第三方库 API 兼容性问题的表现形式有哪些? 它们呈现怎样的分布?
RQ2: Python 第三方库 API 兼容性问题的产生原因有哪些? 它们呈现怎样的分布?
首先, 在 flask 库和 pandas 库的 6 组版本对上通过更新日志与回归测试结合的方法收集存在兼容性问题的 API
版本对, 然后对不兼容 API 对逐一分析. 研究 RQ1 是从第三方库使用者的角度出发, 挖掘当其调用不兼容 API
时, 存在兼容性问题的 API 将以怎样的形式在上层应用代码中表现出不兼容, 即兼容性问题的表现形式. 研究 RQ2
是从第三方库开发者的角度出发, 挖掘其对 API 进行的何种更新操作导致 API 不兼容, 即兼容性问题的产生原因.
2.2 实证研究的数据来源
2.2.1 第三方库版本对的选择
上运行异常终止或者产生不一致的结果. 本文收集的不兼容
第三方库的选择: 分别选择了在 Web 开发领域具有代表性的开源第三方库 flask 和在数据分析领域具有代表
性的开源第三方库 pandas 进行分析.
第三方库版本对的选择: Python 第三方库的版本编号遵循语义化版本号 (semantic versioning), 形式为主版本.
次版本. 补丁版本 (major.minor.patch). 本文对每个第三方库选择 3 组版本对来模拟软件版本演化和上层应用代码
更新的适配过程, 包括跨 major 版本对、跨 minor 版本对和跨 patch 版本对. 选择最新的 Python 第三方库版本
major.minor.patch 作为锚定版本, 向前追溯选择版本作为比较, 具体选择方法为:
● 跨 major 版本对: 找到 major-1 为主版本的版本集合, 选择距离锚定版本最近版本作为跨 major 版本.
● 跨 minor 版本对: 找到 major 为主版本, minor-1 为次版本的版本集合, 选择距离锚定版本最近的版本作为
跨 minor 版本.
● 跨 patch 版本对: 找到 major 为主版本, minor 为次版本的版本集合, 选择距离锚定版本最远的版本作为跨
patch 版本.
共选择 6 个版本对, 具体选择结果见表 2 所示.
表 2 第三方库及其版本对的选择集合
第三方库 应用领域 版本对v1→v2
major 1.1.4→2.0.0
flask Web开发 minor 2.1.3→2.2.0
patch 2.1.0→2.1.3
major 0.25.3→1.0.0
pandas 数据分析 minor 1.4.4→1.5.0
patch 1.4.0→1.4.4
2.2.2 不兼容 API 对的收集
对某第三方库版本对 v1→v2, API 兼容性问题指上层应用代码在前一版本 v1 上可以正常运行, 但在后一版
本 v2 API 对包括不兼容的函数以及不兼容的类成员
函数. 本文采用更新日志与回归测试结合的方法收集存在兼容性问题的 API 对. 一方面, 这弥补了单元测试无法覆
盖所有测试场景的缺陷. 一是可能没有针对某些 API 的测试用例; 二是可能某些 API 的兼容性问题需要特殊的输
入才能被触发, 而这些输入并未在测试用例中被覆盖. 另一方面, 本方法可以有效避免更新日志质量不高对数据收
集的干扰.
回归测试: 在第三方库 v2 版本的源代码上运行 v1 版本的测试用例. 如果某些测试用例运行出错, 说明它们所
调用的 API 存在兼容性问题. 本文在表 2 中的 6 个版本对上共找到 2 290 个回归测试文件, 其中 58 个文件运行失