北方企业网
您的位置:北方企业网首页 > 企业 > 正文

伏戎:融合多设备上的安卓自动化测试报告


南京大学智能软件工程实验室

iselab.cn

摘要

自动化测试已被广泛用于保障Android应用程序的质量。但晦涩难懂的测试结果使得开发和测试人员难以理解和修复应用潜在的Bug。本文提出了一种新颖的工具FuRong(“伏戎”一词源自《易经》,代表征服异族),它可以通过分析多设备上的自动化测试结果来融合高可读性和强引导性的Bug报告。FuRong通过完整的上下文信息(例如屏幕截图、操作序列和日志)来构建Bug模型,然后利用预先训练的决策树分类器(带有18个Bug类别标签)对Bug进行分类。FuRong利用Levenshtein距离对分类后的Bug进行去重,并最终生成易于理解的报告,该报告不仅提供了Bug的上下文信息,还提供了每种Bug类别可能的发生原因和修复建议。本文基于8个开源Android应用程序进行了一项实证研究,在20台Android设备上进行了自动化测试并利用FuRong为自动化测试结果生成易理解的报告。实验结果充分说明了FuRong的有效性,其Bug分类准确率(Precision)为93.4%,正确率(Accuracy)为87.9%。

引言

Android平台的移动设备和操作系统版本正在快速变化,保障应用程序质量需要更有效的技术。移动应用自动化测试技术开销小,且容易复现,可以有效地提高软件质量和测试效率。因此,其逐渐成为主流的测试方法。

为了解决移动应用程序测试结果可读性差的问题,学术研究人员也做出了大量努力。一款名为ODBR的工具可以生成包含有关应用程序Bug的详细信息的报告,但需要在测试设备上安装ODBR来记录手动的测试操作(用于生成报告),无法支持自动化测试过程。FUSION是一款工具,可帮助测试人员构建详细的Bug报告,但仅侧重于手动Bug报告过程。 CRASHSCOPE是第一个基于自动化测试结果生成富有表现力的详细崩溃报告的工具。但其只关注应用崩溃,导致一些无法触发崩溃的Bug被忽略。此外,上述技术都没有考虑到可能在多设备测试环境中暴露的特定于设备的Bug,并且对于测试和开发人员来说很难人工去合并来自不同来源和不同结构的自动化测试结果。因此,现有的自动化测试技术始终无法充分利用测试结果中与Bug相关的信息,导致生成的报告中缺少完整的Bug上下文。上述因素共同作用,导致测试和开发人员无法快速、准确地定位和修复Bug。

我们设计并实现了一种新颖的工具——FuRong,用于融合多设备上的Android自动化测试结果以生成易理解的Bug报告。移动应用程序开发人员或测试人员是FuRong的目标用户,他们可以在FuRong的帮助下大幅度减少审查测试结果和定位Bug的时间。 移动应用云测试平台也可以集成FuRong,从而向其用户提供完整且直观的Bug报告,相较于仅提供大量冗余原始日志信息的其他平台,这将成为其竞争优势。

为了构建FuRong的分类器,我们从20个开源应用的自动测试结果中手动标记了130个Bug(分为18个类别)作为训练集。值得注意的是FuRong的分类器是可替换和可扩展的。所有实现抽象分类器接口的自定义分类器都是可接受的。为了充分展示FuRong的工作流程,我们初步训练了决策树分类器和朴素贝叶斯分类器。 FuRong处理Bug的上下文数据,使用完整的上下文信息(包括操作序列,堆栈信息等)构建Bug模型。使用预先训练的分类器对Bug进行分类,然后通过Levenshtein距离计算Bug相似度,通过Bug去重来降低开发人员审查重复Bug的工作量。经过分类和去重后,FuRong会根据Bug类别向开发人员推荐可能的产生原因及其修复建议,并通过网页将融合的信息可视化,生成可读性高且具有指导意义的Bug报告,以帮助开发人员查找和修复Bug。此外,用于构建分类器的训练集会不断更新:当用户查看报告时,他们可以上传Bug以及他们指定的产生原因和解决方案,这些Bug和解决方案将由系统管理员进行审核,然后用于对分类器进行迭代的训练。

我们进行了一项实验以评估FuRong的有效性。我们选择了8个不同类别的开源Android应用程序,在20台移动设备上执行自动化测试。最后,通过FuRong生成Bug报告。测试设备涵盖了不同的品牌,型号和Android版本。通过众包工人的手动验证,FuRong生成的Bug报告的平均Bug分类准确率达到93%,表明了FuRong的有效性。

分类法的构建

伏戎:融合多设备上的安卓自动化测试报告

图1 FuRong工作流程


我们从20个开源应用程序的测试结果中手动标注了130个Bug,分属于18个类别,包括Null Pointer Exception,Timeout Exception,Socket Timeout Exception,Socket Exception,Unknown Host Exception,Error State,Not Granted This Permission,Illegal Argument Exception,File Not Found Exception,Invalid SelectedIndex,Error Finding Static Metadata Entry,JSON Exception,Inter-rupted Exception,Dead Object Exception,SSL Handshake Exception, Read Error,Ignored Problem和Others。在确认Bug类别时,我们基于堆栈信息进行根因分析。但在许多情况下,堆栈信息不能直接反映Bug的真正产生原因,我们还通过以下方式进行确认:Android相关的Stack Overflow问题回答,Github对Android第三方SDK的讨论,特定品牌设备的论坛等。在确认Bug的真正产生原因后,我们手动标注Bug类别。

使用Weka(Java下的机器学习和数据挖掘包)提供的工具,通过提取标签和堆栈信息来预处理标记的Bug,以构建单词向量空间模型,然后将Bug信息转换为统一的Instance对象。值得一提的是,堆栈信息需要进一步处理:我们将Tokenizers, Stemmers和Stop Words设置为将字符串形式的信息转换为单词向量。我们首先执行分词,然后根据Weka的WordTokenizer中定义的常用切字符(例如空格,逗号,分号等)将字符串切开。此处使用Lovins算法,主要策略是基于294个终止词,29个词形成条件和35个转换规则。预处理之后,训练集被转换为单词向量,并用于构建特定的分类器。 FuRong目前有两个内置分类器,分别基于Weka中默认的决策树(C4.5)算法和朴素贝叶斯算法。分类器将Bug的词向量(从其原始堆栈信息转换而来)作为输入,并预测Bug的类别。

我们使用Weka提供的10褶交叉验证来对分类器进行评估,分类器的平均F-Measure分别达到87.6%(决策树)和78.2%(朴素贝叶斯),说明分类器适用于Bug分类,表现更好的决策树分类器也作为了FuRong默认的分类器。

报告融合

包含完整上下文信息(包括Bug前后的操作序列,操作页面,Bug发生的屏幕截图,设备性能信息等)的Bug模型是由自动化测试生成的异构日志构建的。 FuRong主要处理了以下日志信息:

l Logcat日志。Logcat是一款Android框架自带的命令行工具,可用于获取应用程序日志信息。

l 操作日志。由自动化测试工具生成,记录测试过程中的操作类型,操作前后的页面及其操作的Android控件。

l 屏幕截图。屏幕截图日志主要包含三个类别:1)每个应用程序页面首次出现的屏幕截图; 2)按固定的时间间隔截取的屏幕截图,; 3)页面的生成树图,描述了 不同页面之间的关系。

l 性能日志。 设备性能信息,例如CPU使用率,流量消耗,内存使用率等。

Bug分类基于Logcat日志实现。 最初的字符串形式日志首先被解析为结构化的Logcat对象,包含“exception”,“error”,“anr”等关键字的Logcat对象被标记为候选Bug对象,并将在预处理后被用作分类器的输入。

操作日志记录操作发生的页面信息,操作类型,操作坐标,从中可以提取结构化的Action对象,从而获得操作序列图模型。Bug对象和操作序列图模型根据时间戳进行关联,以此可以获取Bug发生前后的信息,例如操作和页面。

为了防止用户重复审查相同的Bug,通过计算文本相似度来对已分类的Bug进行去重。FuRong使用Levenshtein距离计算Bug堆栈信息的相似度。如果相似度高于预设阈值,则将其视为重复Bug。Levenshtein距离最初是由Levenshtein提出的,它是指在编辑操作期间将一个字符串转换为另一字符串所需的最小操作数,包括替换,删除或插入字符。

报告呈现

伏戎:融合多设备上的安卓自动化测试报告

图2 FuRong生成的报告


用户只需上传目标应用程序的.apk文件,经过自动化测试后,FuRong将自动生成详细且用户友好的高可读性报告(具体流程请参见图1)。本文以应用 “记乐部”为例来说明FuRong生成的易理解报告。

基本信息(图2-A)。此页面展示测试任务的基本信息,包括应用程序名称,测试时间,测试设备数量等。测试概述显示了由FuRong识别的Bug的分布,包括Bug类别分布和Bug严重性等级分布。可以直观地看到目标应用程序的6种Bug,其中数量最多的Bug是JSON Parsing Exception。点击图中类别的相应部分,用户可以查看Bug的详细信息。

问题机型聚类(图2-B)。此页面展示各类别Bug的不同分布情况,包括设备品牌分布,系统版本分布和设备分辨率分布。在此图中,该应用程序在7款移动设备上发生了FileNotFoundException,其中Android 6.0设备占最高比例,因此开发人员可以使用此信息对特定移动设备进行针对性的测试,以提高应用程序兼容性并确定潜在的应用程序Bug。

Bug列表(图2-C)。此页面展示了FuRong检测到的所有Bug,并提供了过滤条件,例如Bug严重性级别,Bug类别,Bug描述和设备版本,可快速轻松地定位Bug。FuRong还提供了将应用Bug转换为众包测试任务以进行验证的功能。

Bug详情(图2-D)。用户单击Bug列表中的“查看详细信息”按钮以查看相应Bug的详细信息。在Bug上下文信息包含的操作序列中,记录了Bug发生前后的操作,操作控件,操作类型等信息,方便用户验证Bug。Bug详细信息包含Bug堆栈信息,发生时间,输出Bug信息Android组件等。此外,Bug发生时的屏幕截图也会和Bug详细信息关联起来,从而形成详细的Bug上下文信息。

产生原因和解决方案(图2-E)。Bug可能的产生原因和解决方案(均在手动标注训练集过程中收集)也将提供给用户参考。应该注意的是,修复建议是通用策略,针对在不同应用程序中发生的同一Bug的实际解决方案可能仍然有所不同。为了丰富Bug解决方案库,用户可以提交其自定义的解决方案,管理员将审核并向该库中添加新的解决方案。

实验评估


伏戎:融合多设备上的安卓自动化测试报告

表1 实验结果

为了验证FuRong的可用性和有效性,我们进行了一项实验。 我们选择8个不同类别的应用程序,包括视频类,游戏类,工具类等。这些应用程序首先在20款不同的Android设备上执行自动化测试。 自动化测试结果作为FuRong的输入,以进行分类,去重并生成Bug报告。为了验证Bug的真实性和分类准确性,所有Bug报告都发布了众包测试任务。众包工人验证Bug的真实性,FuRong对Bug进行去重时是否正确,以及FuRong分类结果的准确性。

FuRong从8个Android应用程序的测试结果中检测到91个Bug(参见表1)。 我们引入了标准评估方法来评估FuRong,最终结果显示其Bug分类的平均准确率(Precision)为93.4%,平均正确率(Accuracy)为87.9%。Bug报告的自动生成过程平均需要17分钟(该时间包括测试过程)。

结果表明,FuRong可以在短时间内自动融合高精度的Bug报告,可以稳定地支持云测试平台的移动应用自动化测试过程,并提高移动应用程序的Bug定位效率。

总结

本文我们介绍了FuRong,这是一种新颖实用的工具,可融合Android多设备上自动化测试的Bug报告。FuRong会自动对自动化测试结果中的Bug进行分类和去重,并融合与Bug相关的上下文信息,以生成具有指导性且易于理解的Bug报告,提供可能的Bug产生原因和修复建议,从而方便开发人员或测试人员查找和修复Bug。FuRong的分类器是可替换的,并且支持自定义,目前内置了决策树(C4.5)和朴素贝叶斯两种算法。

未来我们计划(1)研究更复杂的Bug去重方法,例如上下文Bug去重方法,(2)对FuRong生成的Bug报告向真实Android开发者进行用户调研,(3)将FuRong开发为一个全面的可定制框架,用于融合多设备上的自动化测试结果以生成易读的Bug报告。

致谢

本文由南京大学软件学院 2018 级硕士田元汉翻译转述。

感谢国家自然科学基金(61932012,61802171,61772014)支持!

来源:

推荐阅读:小米2