段虎才 中国信息通信研究院泰尔终端实验室互联网与软件部高级研发工程师
郭 琛 中国信息通信研究院泰尔终端实验室互联网与软件部项目经理
软件测试是为了确保用户对于应用程序的满意度而进行的必要程序——通过对软件产品进行验证和确认,尽早尽快地发现软件产品在整个开发生命周期中存在的各种缺陷,从而评估软件的质量是否达到可发布水平。随着信息技术的高速发展,软件产品更加趋向大型化、复杂化发展,软件开发也逐渐由混乱无序的开发过程向结构化开发过程发展,人们对软件的质量要求越来越高。随着软件开发的发展演进,软件测试相关的一些基础理论和实用技术亦逐渐开始形成,“质量”的概念也开始融入软件测试中,测试不再是单纯的发现错误的过程,而是作为软件质量保证的主要职能而存在。
然而与软件在各行各业的广泛应用所带动的软件工业快速发展相比,软件测试技术的发展仍然处于一个较低的水平。现有的软件测试技术及理论和软件测试工具还无法完全适应现代软件工业的开发需要。软件测试技术的滞后严重影响了软件项目的开发进度。很多大型的开发项目,测试会占据项目周期一半以上的时间。以微软的IE4.0为例,代码开发时间为6个月,而稳定程序花去了8个月的时间。面对应用程序的复杂性增加和交付速度的加快,软件测试的诸多问题日益凸显,人们亟需寻求一种更高效的测试方法来应对挑战。随着测试越来越多地朝着更自动化的方向发展,我们将目光转向了人工智能(Artificial Intelligence,AI),软件测试需要它的帮助。
图1展示了人工智能的概貌。什么是人工智能?通俗的说就是模拟和扩展人的智能,让机器像人一样有感知、认知以及计算的能力。从技术上看,人工智能的兴起离不开大数据、云计算和深度学习等技术的突破,而就目前来说,人工智能更多的是用机器人来模拟人的多种行为以及能力。当前AI主要依赖机器学习来实现,而在机器学习中,深度学习是最有效的一类算法,目前在深度学习上我们已经获得极大成功,Alpha Go就是一个范例。Alpha Go的出色表演让人工智能名声鹊起,而在不久前的全国两会期间,人工智能被首次写入政府工作报告,人工智能再次向人们展示出了它的魅力。毫无疑问,人工智能、万物互联是未来趋势。
图1 人工智能概貌
2.2.1 被测产品日趋复杂
(1)运行场景复杂。除了操作系统和设备外,APP还会在各种复杂的场景中运行。比如说:Wi-Fi、2G、3G、4G等网络状态,移动或静止等运动状态。这些复杂的场景都是传统软件都未曾面临的,这些也成为测试的难点。
(2)功能高度复杂。一款APP可能会处理很多传统软件所不曾面临的复杂信息,比如手势、GPS坐标、加速度、摄像头、推送通知、其它互操作设备、云端存储、网络交互、移动支付等,对这些复杂信息的处理增加了软件的复杂度,也增加了测试的难度。
2.2.2 测试耗时且昂贵
(1)测试工作量大。因为测试不仅仅包括测试用例,还包括测试数据、路径、环境和应用场景、上下文等。这经常会导致测试过程中产生序列爆炸、组合爆炸、路径爆炸等一系列问题。
(2)测试设备碎片化问题严重。长期以来,终端碎片化饱受诟病:设备繁杂、品牌众多、版本各异、分辨率不统一等等。这些不仅对开发造成了巨大的障碍,而且也给测试带来了高昂的成本。
(3)测试速度慢。目前很多的测试工作还是通过人工来完成,缺少必要的自动化测试,如果需要加快测试速度,只能通过增加成本和精力的投入。除此之外,需求不稳定、不清晰或者业务逻辑本身就比较复杂都会增加沟通成本,从而影响测试进度。
(4)测试技术滞后。在用户场景下发生的闪退,还是难以复现,难以追踪,仍然是测试人员挥之不去的梦魇。现有的自动化测试投资回报率不高,层出不穷的软件新版本,不断出现的新特性和功能变更,让测试人员疲于写测试脚本,相比手工测试,似乎没有节省太多的工作量。普通的自动化测试虽然能够通过机器的模拟能力来进行一些人工重复性的测试工作,但实际上其投资回报率却不高,这就导致了传统自动化测试与手工测试之间的一个尴尬关系。
2.2.3 测试结果可靠性低
(1)测试覆盖不足
正因为测试工作量大,内测用户难以获取,测试团队的时间和精力又有限,不能面面俱到,造成测试覆盖程度不足,测试不足则意味着让用户来承担隐藏错误所带来的危险和损失。因此开发人员经常面临的一个问题是,产品正式上线后会爆发出各种在内测环节所未曾遇到的严重的bug。
图2中呈线性增长的直线代表测试覆盖面,因为测试中一次只能添加一个测试元素。图中曲线代表的是测试复杂度,它呈指数级增长,因为除了新特性带来的复杂度以外,还会有新特性与现有特性相互作用产生的新的复杂度。中间的灰色区域就是覆盖盲区,当系统越来越复杂时已达到的测试覆盖率与实际覆盖率之间差距越大。由此可见,软件测试覆盖面的扩展还有很大提升空间。
(2)测试决策主观性强
传统软件测试不仅需要大量的人力,而且容易出现不准确和不一致的情况。此外,不管是人工还自动化测试总是容易受到无法识别新功能和错误等小故障的影响。它只验证某些区域,忽略了添加的新功能。
图2 测试复杂度与覆盖面的关系
如果传统软件测试能够很好地契合人工智能的特点(大数据、云计算和深度学习),那么就可以在很大程度上解决一些之前用其他技术不能解决的问题。软件测试在人工智能技术的帮助下能变得愈发简单、快速和可靠。
(1)人工智能帮助测试工作近一步前移,使软件测试更简单
使用人工智能技术,在不运行代码(一般开发者的调试方式都是编译、运行,查看结果,然后人工分析代码)的方式下,通过词法分析、语法分析、控制流、数据流分析等技术对程序代码进行扫描,来验证代码是否存在问题或满足技术指标,相应流程如图3所示。
图3 AI静态分析代码流程
以数分钟之内扫描成千上万行代码的速率,像人一样对代码进行思考,分析代码存在的问题。将测试工作近一步前移,与开发相融合,贯穿整个开发过程,提前规避产品缺陷,降低后期维护成本。
(2)人工智能帮助自动化测试全面升级,使软件测试更快速
由于80%的测试都只是简单地重复已有的测试内容,AI可以更加高效地完成这些重复性操作,并且使测试流程更加自动化。这样,测试人员能得以转而去做更人性化、更具创造性的事情,例如创建独特和创新的测试环境来识别应用程序问题等,而这些正是他们所擅长的。
软件测试自动化升级大体过程如图4所示。通过深度学习功能,能够化解自动化测试想象力不足的缺陷,实现自动计划测试、执行测试、决策诊断测试结果,让机器承担原本只能由人来完成的测试任务,较为轻易地达到手工和自动化的融合,提升测试的效率。
之前都是测试人员运行测试用例,发现bug,然后给开发人员,开发人员对其诊断决策,然后修复bug。当引入AI后,流程就变成了:测试人员运行一堆写好的测试用例,然后发现bug。AI生成一些可能的诊断,如果只有唯一的诊断结果,就直接交给开发者进行修复。否则的话,AI就会规划新一轮的测试来排除诊断结果直到只有一个。具体过程如图5所示。
人工智能测试消除了导致低操作效率的业务风险,因为基于AI测试可以很容易地适应并围绕产品的所有新路径和特性进行工作。它维护成本低,可以从测试资产中学习,提供诸如应用程序稳定性、缺陷热点、故障模式和故障预测等智能洞察。这些见解能够预测、自动化和增强决策能力,从而在项目生命周期的早期构建质量。
(3)人工智能帮助进行用户预验证,使软件测试更可靠
当测试数据大量累积,自动化测试配合云计算技术引入,能够针对不同领域的应用进行用户角度的预验证,并根据大数据分析来提前为迭代变化做准备。
人工智能测试技术是灵活的。他们会自动发现产品中的每一个新特性,并对其进行评估,以确定它是一个bug还是一个新特性。基于AI的测试从最终的使用角度分析应用,记录性能。它能在短时间内构建和执行大量的测试用例。
图5 软件测试自动化升级具体过程
开发人员可以在机器中输入大量数据,以测试各种功能。机器可以自行调整,并学会识别并利用其测试经验,为人类的参与提供建议。测试团队可以接管并进行部署决策。更重要的是,人工智能将比人类测试人员在许多领域做得更好,因为它会使人为误差最小化。
(1)King采用AI测试工具测试Candy Crush Saga手机游戏
2016年8月,作为手机游戏下载量连续排名第一的糖果大战Candy Crush Saga手机游戏的瑞典开发商King,采用Monte Carlo树搜索算法、自动启发式构建算法、增强拓扑的神经元演化算法(Neuro Evolution of Augmenting Topologies,NEAT)来训练 AI测试工具(bots),模拟人类交互能力,完成对Candy Crush Saga游戏的功能测试、稳定性测试和性能测试,并评估游戏难度级别,预测游戏的成功率。要知道这款游戏是当今手机上最大的游戏之一,有1000多个难度级别,在增加新功能或新级别时,如何验证新增的难度水平与之前级别是平衡的,对测试人员来说,非常有挑战性。而且这款游戏的用户越来越多,对游戏质量的期望也越来越高,希望游戏非常稳定、流畅。
(2)APP diff推出测试机器人
2016年9月,美国的一家初创公司APP diff推出测试机器人,能够全面分析APP应用中的每个界面、元素和操作流,进行性能测试和用户体验测试。APP diff的智能机器人可以克服经典的测试方法所存在的速度慢、开销大的问题,具备类似人类的洞察力,就像魔术一样快速完成测试,而且具有学习能力,APP应用程序测试越多,工具会自动地变得越来越聪明。采用的AI,就可以替换过去脚本的开发,让自动化测试进行得更轻松,而且AI能处理的测试输入,手工是无法相比的。
(3)Bugdojo创建基于AI的测试平台
2017年4月,总部位于澳大利亚墨尔本的一家初创型公司Bugdojo创建了一个基于AI的测试平台,该平台致力于用bot技术来降低软件测试的时间和金钱成本,让软件测试变得更简单。Bugdojo的核心是bot,当开发人员需要测试的时候,只需要在GitHub或Bitbucket绑定的账户内向Bugdojo授权,然后输入相关的bot指令就可以了,剩下的工作就由Bugdojo来完成。根据Bugdojo的描述,目前开发人员需要通过固定的bot指令触发bot,然后bot根据开发人员提供的素材进行分析,并且依靠人工智能分配最合适的测试人员进行测试,然后将测试结果+视频反馈给相关开发人员。虽然现在Bugdojo还无法做到完全的智能识别,但他们相信在不久的将来,能让人机自然语言的对话代替现在的固定指令。
(4)DiffBlue发布三款AI软件测试产品
2017年6月,从牛津大学分拆出来的人工智能初创公司DiffBlue刚刚完成了规模为2200万美元的A轮融资,该公司致力于开发能够检查和纠正软件编码错误的技术。Diffblue目前已经发布了三款产品,其中一款可以自动检索计算机程序中的代码错误,代码错误的排查对于软件开发来说非常关键,稍有差错就可能造成安全和金钱的巨大损失,但这个一般由软件测试人员完成的工作其实非常繁重,而且常被认为是一项低端工作。Diffblue的出现不仅可以大大提升这一流程的准确度和可靠性,也将大量分担甚至替代人工。Diffblue的另外两款产品与上述产品相辅相成,其中一款可以在软件正式发布后实时监测程序中崩溃的漏洞,而另一款产品则可以自动重写或更新老旧的源代码,来实现软件的自动升级。
(5)微软发布“AI安全风险检测”工具
2017年7月,微软开发了一套基于云的工具——微软安全风险检测(Microsoft Security Risk Detection,以前称为Project Spring field)。该工具可借助人工智能对即将发布或已投入使用的软件进行安全测试,查找追踪软件中的错误和其他安全漏洞。在软件发布之前就找到其中漏洞,可以为企业省去软件发布后再修复错误、处理崩溃或应对攻击等一系列麻烦。
微软安全风险检测服务的独特之处在于它使用人工智能来提出一系列“假如……会怎样”的问题,试图发现可能触发崩溃并引发安全隐患的因素。每次运行时,它都会重点关注最为关键的区域,以寻找其他未采用智能方法的工具可能会忽视的漏洞。
(6)Facebook发布名为Sapienz的工具
2017年10月,Facebook公布了一款名为Sapienz的工具,实现了这一领域的巨大跳跃。这一工具最初是由伦敦大学学院研发的,它能够通过自动测试识别安卓软件中的漏洞。Sapienz含有一种进化算法,它能够根据软件反应做出新的选择,它的目标就是发现最大量的故障并且完成最大量的测试,尽可能高效的完成任务。Sapienz工具只在夜间工作,系统会对计算机编码进行微小改变,并且检查这种调整是否修复了报告的漏洞。每次代码运行的反馈信息都用于推断哪种变化将成为下一次测试的最佳选择。
早在2015年6月,Facebook还发布过一款开源AI工具infer。Facebook的Infer是一个静态分析工具。Infer可以分析Objective-C、Java或者C代码,报告潜在的问题。任何人都可以使用Infer检测应用,这可以将那些严重的bug扼杀在发布之前,同时防止应用崩溃和性能低下。
(1)阿里Ripper
Ripper是阿里集团基于机器学习开发的智能AI程序,具备场景判断能力、自主决策能力,能够模拟人的操作,例如双击、长按、连击、手势操作、中文输入等丰富的动作,测试执行速率高达2动作/s,极大提高APP测试效率。此外,Ripper还能够复现bug,不需要人工参与,能记忆跑过的路径,操作便于回溯。Ripper在页面覆盖度、bug检出率上相较传统Monkey和遍历程序有明显优势。
(2)中国信息通信研究院泰尔终端实验室的智测云测试平台引入AI技术
中国信息通信研究院泰尔终端实验室旗下的智测云测试平台借助AI技术搭建起一套完整的APP测试流程,保证自动化测试更加完整和流畅。
首先,系统可以通过训练自动采集APP界面元素数据,完成对象识别和分割深度学习模型,支持对任意APP界面截图,并可根据模型标记截图中的界面元素对象,从而解决H5页面元素的识别问题。
其次,借助AI自动捕获功能,可以在测试过程中自动检测APP当前窗口是否属于权限窗口,根据结果进行处理。也可以自动判断被测APP所在的页面是否属于登录界面,并自动输入用户预先配置的登录信息进行自动登录。
对于需要输入动态验证码的页面,预先收集1.3万张验证码图片建立数据集,通过引入AI,训练该数据集后,选取2000张数据进行测试,经测试验证识别率达到96%,该模型已经投入港航测试脚本中实用。
对于金融行业自定义动态键盘的识别问题,使用AI技术对采集的行业内大量的动态键盘图片数据进行训练,得到一个能自动识别动态键盘的模型,使用该模型能帮助我们识别动态键盘上的每一个按钮内容以及位置信息。
此外为了减少测试的人力需求,实现了基于AI的自动化深度遍历测试,帮助遍历APP所有的功能,并对遍历轨迹进行记录,能探索APP潜在的缺陷,能自动对比新旧版本功能的差异。
AI软件测试有据可依的历史并不算长,但是由于人工智能在软件测试中的应用日益增多,这些数据正在迅速增多,相关的规范也会快速形成。就软件测试中的机器学习而言,机器人的训练速度比人类更快,他们可以成为软件测试方面的专家。在感知方面,AI可以模拟人的视觉,感知UI控件。在认知方面,AI可以模拟人思考,认知和决策BUG,预测下一步测试,识别运行场景。在计算方面,AI能够高速计算,加快测试进程;高量级的记忆存储使测试操作便于回溯,并且能够7×24h工作,扩展了测试时间。这些给未来的软件测试带来的是更少的工作负载、更精确的操控、更高的测试效率和更连续化的测试。
人工智能是一场革命。市场会随着技术的逐渐成熟与渗透而趋步前行,各个行业都是如此。而软件测试作为寻找软件体系中存在漏洞的重要方式,在人工智能的实际发展过程中,必须依赖于软件测试技术,准确找寻出自身存在的缺陷,继而对其进行修改和完善,以保证人工智能产业的健康稳固发展。在此背景下,软件测试产业将会得到极大的发展。虽然目前人工智能在测试领域的应用可以说是凤毛麟角,场景也十分受限,但是随着人工智能的蓬勃发展,全面实现软件测试智能化指日可待。