![872e0c558b72d89a9c331f2500fa5c47.png](https://i-blog.csdnimg.cn/blog_migrate/c7b8c4447c1ba3f679884aeb06b64ced.jpeg)
图 1 Bug 报告生成流程
1. 研究意义
近年来,随着智能设备的普及,移动应用已成为人们日常生活中不可或缺的一部分。Android应用因其灵活开源的特性和功能多样的第三方库备受开发者青睐,而其碎片化的生态也同样影响着数十亿用户。不同移动设备软硬件环境存在差异,使得未经充分测试的应用暴露出许多潜在的Bug,造成用户流失,开发商声誉受损,最终导致应用在竞争激烈的市场中被用户抛弃。为保障应用质量,减少用户损失,开发者需要及时地进行Bug修复,包含了详细Bug描述信息的应用Bug报告则是修复阶段的重要参考。
但现有Bug报告无论是在其展现形式还是生成效率方面都存在一些不足。常见的手工测试报告中通常包含了具备领域知识的众包测试工人对Bug的理解和分析,但手工测试效率低,人工成本较高。现有自动化测试工具大幅提升了测试效率,降低了开销,但其生成的Bug报告通常是对测试数据的简单罗列和展示,缺乏对于Bug特性的洞察,如类别信息、修复建议,导致其结果仍依赖人工审核。虽然自动化测试可在多设备上批量执行,以模拟应用真实运行场景,但在生成Bug报告时,应用在不同设备上产生的重复Bug未被有效去除,冗余的报告致使Bug审核和修复的人工成本剧增。此外,现有手工测试和自动化测试Bug报告均未考虑多设备场景下引入的不一致性,即应用GUI特性和设备碎片化导致相同应用在不同设备上的行为和表现存在差异。上述种种原因,使得现有报告对开发者在Bug理解和修复阶段起到的帮助十分有限,缺少全面且易理解的Bug报告。因此,结合了不一致性信息,包含对于Bug特性的洞察,去除了重复Bug,能够提升开发者理解和修复Bug效率的易理解Bug报告显得尤为必要。
2. 研究内容
为结合自动化测试和手工测试Bug报告的优点,填补现有易理解自动化测试Bug报告研究存在的空白,针对Android应用自动化测试结果,我们提出了一种基于不一致性分析的移动应用Bug报告生成技术—BREGAT(Bug Report Generation for Mobile App Testing)。我们首次对自动化测试结果中存在的不一致性进行了形式化定义,并讨论了Bug和不一致性之间关系,如GUI不一致性相关Bug说明是应用自身问题所致,与设备无关,这对提升最终Bug报告可理解性十分关键。通过对真实自动化测试结果中Bug的审查和分析,我们定义了一个可扩展的带不一致性标签的Bug分类法,各类别均标注了不一致性标签,收集了产生原因和通用修复建议。BREGAT实现了该分类法,用于对自动化测试结果中检测到的结构化Bug进行分类、去重,并结合截图、操作、设备信息等异构数据生成易理解Bug报告,加速Bug理解和修复。图2为BREGAT 工作流程。
![ae7be0a0b41ba0b0a83029341c2f4e46.png](https://i-blog.csdnimg.cn/blog_migrate/a5a219418059ead1e3b458ba3a81fae0.jpeg)
图 2 BREGAT 工作流程
Bug检测。相比于截图和操作等GUI数据,测试设备日志详细记录了应用程序的真实运行状态和生命周期,可以发现更多源码级别的Bug,其中一些Bug用户仅从GUI层级甚至无法感知。日志也是开发者分析应用运行状态,调试应用功能的关键参考信息。因此,对于应用测试过程中在Android设备AP(Application Processor)端main,system,events,radio,crash缓冲区打印的设备日志,BREGAT通过“fatal”,“error”,“exception”和“ANR”等Bug关键字来定位设备日志中Bug相关报错信息。对于打印了异常堆栈的Bug,即对应日志中多行结构化输出,通过相应的日志模式匹配筛选出完整的Bug日志。BREGAT最终从设备日志中过滤出UncaughtException,ANR(Application Not Response)以及包含了常见Bug关键字的开发者自定义日志输出,或疑似Bug的日志片段。
结构化Bug生成。为结合自动化测试过程产生的截图、操作、设备信息等异构数据来对Bug进行不一致性分析,同时也为提升现有研究中Bug描述单一,难以理解的短板,增加最终Bug报告的可读性,我们定义了一个结构化Bug模型。BREGAT在传统工具仅基于日志报错信息进行Bug描述的基础上,通过解析测试操作序列,得到应用完整的测试路径和页面跳转图,结合截图序列为日志中检测到的原始Bug片段绑定相应的截图、操作和应用页面路径,并加入便于分析兼容性Bug的设备品牌、型号、系统版本等信息,生成了完备的结构化Bug。
Bug分类和去重。通过对来自16个类别的50个Android应用在20台不同设备(覆盖9个主流品牌、5个常用系统版本)上的自动化测试结果中46002个结构化Bug实例进行不一致性分析,人工审查并确认Bug和不一致性之间关系,从Stack Overflow、GitHub等问题讨论区确认并收集Bug产生的根本原因和通用修复建议,我们定义了一个可扩展的带不一致性标签Bug分类法,共包含67个类别。分类法中每个Bug类别都具有唯一的类别特征三元组(不一致性标签、根本原因、通用日志模式)。BREGAT基于该分类法来指导Bug分类和去重,对于结构化Bug实例,用分类法Bug类别定义中的通用日志模式尝试匹配结构化Bug的设备日志片段,匹配成功则为Bug实例标注相应类别编号,失败则归为未分类Bug,在最终Bug报告中交由开发者进一步审查。对于同类别下的多个Bug实例,BREGAT基于Bug实例在该类别不一致性标签上的取值对Bug进行分组,位于同类别、同分组下且日志片段相同的Bug实例被识别为重复Bug进行剔除。按类别不一致性标签取值对同类别下Bug进行分组,在去重的同时还保留了Bug和不一致性的关系。如同类别下两个Bug实例分别产生于系统版本为6.0和7.0设备上,所属Bug类别不一致性标签为系统版本不一致性,按不一致性标签取值进行分组后这两个Bug实例都被保留,这对保证Bug报告的完备性至关重要。
Bug报告生成。BREGAT从多个维度统计分类、去重后的结构化Bug分布情况,从不同视角生成了可复现、易理解的Bug报告,图3为报告示例。报告包含了应用Bug在设备、机型、品牌、Bug类型、Bug严重等级上的分布情况。同时从Bug视角为每个Bug展现了包含结构化数据的详情页,除复现步骤、截图、Bug日志片段等基本信息外,Bug类别信息、通用修复建议及我们首次引入的不一致性信息使报告具备了对Bug特性的洞察。此外,还从设备视角,展示了每个设备在测试过程中的完整日志、截图序列,便于开发者快速理解、定位和修复Bug。
3. 研究效益
移动应用测试需求方在云测平台上发布自动化测试任务,测试结束后BREGAT自动对多设备测试结果进行Bug检测,生成结构化Bug集合,并对结构化Bug进行分类、去重,最终生成一份具有良好可读性,可复现、易理解的Bug报告。开发者通过查看报告可以掌握应用整体的Bug分布情况,可针对主流机型或Bug严重等级优先修复相应Bug。报告中每个Bug均提供了完整的复现步骤、类别信息、日志片段以及不一致性信息,帮助开发者快速理解和修复Bug。
![aa1ac2ec33581407758f14c61297233f.png](https://i-blog.csdnimg.cn/blog_migrate/aa4466c604c9352d302a892291434ac0.jpeg)
图 3 Bug 报告示例
为评估BREGAT对自动化测试结果中Bug的分类和去重能力,我们将其与Bug报告融合工具FuRong(该工具采用决策树来分类Bug,莱文斯坦距离进行去重)进行了对比。在对30个应用在20台设备上的自动化测试结果进行Bug分类和去重时,BREGAT覆盖了结果中83%的真实Bug,且分类精确率为86%,分类能力显著优于FuRong。BREGAT去除了结果中97%的重复Bug,在去重准确率、召回率、精确率等指标上均优于FuRong。在16名开发者代表参与,涉及9种不同类别的Bug复现实验中,BREGAT所生成Bug报告的平均复现速率为17.4秒/个,成功率为100%。而作为对照的可理解崩溃报告生成工具—CrashScope,其平均复现速率为78.4秒/个,成功率为85%。参与者在复现实验后填写了匿名报告调查问卷,其中Bug可读性问题得分的Friedman检验结果表明,BREGAT报告可读性显著优于CrashScope报告。
目前BREGAT已上线使用。作为自动化测试的下游服务,对应用自动化测试过程中在多台设备上产生的Bug进行精确地分类、高效地去重,最终生成可读性高,可复现的易理解Bug报告,全面加速开发者Bug理解和修复过程。
4. 致谢
本文由南京大学软件学院 2017 级硕士生田元汉撰写。
感谢国家自然科学基金(61690201,61802171)支持!