论文部分内容阅读
近年来,随着软件项目数量爆发式增长与敏捷开发实践的广泛使用,大量项目之间存在复杂的依赖关系,不同项目的不同模块和方法之间产生了复杂且快速更新的关联,软件生态系统的概念应运而生。软件生态系统藉由软件之间存在的复杂的依赖和需求,产生快速的迭代更新。Python作为一种动态语言,以其代码简洁、开发敏捷、第三方库丰富、社区活跃等特点,在工业界的项目开发中被广泛使用。随着Python项目的不断增多,Python软件生态系统也在开源社区得到越来越多的关注。软件生态系统的发展为软件演化带来了发展和挑战。一方面,开源、透明的特性提供了充足的使用、维护、调试等信息的来源,易于分析和利用来自不同项目的知识,为项目的缺陷检测和维护提供数据保障;另一方面,软件项目的开发人员需要对使用、维护、调试等信息进行审查和分析,进而对软件中存在的缺陷进行定位和修复。然而软件生态系统中迅速产生大量此类来自不同源、不同类且异构的信息,增加了软件调试的时间开销和难度,会延后软件缺陷的修复工作。本文的工作致力于改进Python软件在软件生态系统场景下的迭代开发和维护流程,辅助开发者发现和修复项目在生命周期中存在的缺陷,保障项目演化过程中的软件质量,从上游项目接口参数类型不一致缺陷检测和跨项目缺陷的识别两方面展开,主要贡献如下:针对下游项目调用上游项目接口时实参与形参期望的类型不一致问题,提出了一种基于接口文档分析的缺陷检测方法CARD。首先,提取软件源代码文本信息和运行时类型信息构建训练集,训练多标签多输出模型识别参数类型;之后使用训练完成的模型对参数的描述文本进行理解,识别参数的可接收类型;最后将识别的可接收类型与参数实际运行时类型对比,检测潜在的类型不一致缺陷。为评估类型不一致缺陷检测方法的有效性,本文在10个Python上游软件项目上进行实验,提取得到包含345条接口参数信息的数据集。实验结果表明,CARD识别类型的精确率、召回率、F1度量、准确率、Jaccard损失和Hamming损失分别为76%、76%、73%、57%、0.69和0.73,且在各项指标上优于使用k近邻模型和随机森林模型的基线方法。针对下游项目难以识别本项目的测试失败是否由上游项目缺陷触发的问题,提出了跨项目缺陷的识别方法CDD-H和CDD-E。方法首先解析软件项目在测试阶段生成的测试日志,提取其中的失败测试用例的相关信息;之后利用回溯路径、测试方法名称和异常描述文本等信息,提出基于启发式的模型和基于长短期记忆网络的集成模型对测试用例触发的缺陷类型进行识别。为评估跨项目缺陷识别方法的有效性,本文在包含133个开源Python软件的Python软件生态系统中进行实验,共提取得到12885条失败测试用例信息,构建包含413条标记完成的测试用例数据集。实验结果表明,CDD-H和CDD-E的识别精确率分别达到77.8%和91.3%,识别的准确率分别为73.1%和78.8%;对于一条失败测试用例数据,完成完整的识别流程平均耗时仅为0.02秒和0.03秒,与人工识别所需的平均用时506秒相比,时间开销大大减少。我们提出的跨项目缺陷识别方法兼顾了有效性和高效性。