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 的代码差异相比, 我们的工具更能帮助理解造成兼容性问题的产生原因吗?
   42   43   44   45   46   47   48   49   50   51   52