(系统越复杂、交付速度越快,越需要人工智能,软件测试也不例外)
本文上一部分( AI测试:让软件测试变得聪明伶俐(上) )侧重介绍人工智能(AI)的背景,这一部分就进入正题,说说如何利用AI帮助解决一些之前的测试难题,以及如何借助AI更有效地完成测试,即用AI技术来帮助测试解决问题,而不是如何测试AI软件(如何关心这部分,请阅读:如何测试人工智能软件?)。
按照AI的思维,不仅仅去想如何设法模拟人类的行为和思考,造出一个测试机器人,而且还要去思考:能否彻底改变传统的测试思路,就像基于搜索的软件工程,不是从问题的假定、条件和输入推导出结果,而是采用类似启发式搜索 等技术,直接从问题的解空间搜索出相对最优的解,从而解决软件测试问题。AlphaGo正是采用这种解决思路,下围棋几乎无法按规则推理,而是根据所建的价值网络和策略网络,借助深度学习和随机梯度下降迭代决定下一个棋子该如何走才能得到最大的赢的概率。
图5 AlphaGo实现原理示意图
从软件的功能测试或业务测试看,一直是有挑战的。大家知道有一条著名的测试原则:测试不能穷尽的,测试总是有风险的。这就告诉我们,要做的测试(tests,不仅仅包括测试用例,还包括测试数据、路径、环境和应用场景、上下文等)数量是巨大的,这就是测试经常遇到的序列爆炸、组合爆炸、路径爆炸等一系列问题。以前认为这是无法完成的测试任务,今天借助AI可以得到比较满意的解决,即能不能像AlphaGo那样建立两个网络?
质量风险网络:根据当前已做的测试,基于多层神经网络的深度学习来评估软件的质量风险,给出具体的风险值;
测试策略网络:从可选的未执行的tests中,选择哪一个test作为下一步测试能够最大程度地降低质量风险(发现Bug的可能性最大)。
微软为此建立了其自适应的神经网络算法(Microsoft Neural Network algorithm,MNN算法),该算法针对可预测属性的每个可能状态,以测试输入数据属性的每个可能状态,以及基于训练数据能够计算每个组合的概率。可以将这些概率用于缺陷分类或回归测试任务,并能根据某些输入属性来预测输出结果。2016年1月,微软在GitHub上发布了其深度学习工具包——Computational Network Toolkit(CNTK)。CNTK 通过一个有向图将神经网络描述为一系列计算步骤,从而使得实现和组合DNN、CNN和RNNs/LSTMs 变得非常容易。
图6 当系统越来越复杂时已达到的测试覆盖率与实际覆盖率之间差距越大
(也说明今天面对更复杂的系统,如IoT,更需要AI帮助)
基于类似的思想,瑞典的一家公司(King.com)采用Monte Carlo树搜索算法、自动启发式构建算法、增强拓扑的神经元演化算法(Neuro Evolution of Augmenting Topologies,NEAT )来训练 AI测试工具 (bots) ,模拟人类交互能力,完成对Candy Crush Soda游戏的功能测试、稳定性测试和性能测试,并评估游戏难度级别,预测游戏的成功率。要知道这款游戏是当今手机上最大的游戏之一,有1000多个难度级别,在增加新功能或新级别时,如何验证新增的难度水平与之前级别是平衡的,对测试人员来说,非常有挑战。而且这款游戏的用户越来越多,对游戏质量的期望也越来越高,希望游戏非常稳定、流畅。
图7 Monte Carlo树搜索算法应用于模拟游戏操作
图8 自动启发式构建系统操作状态路径图(续)
图9 自动启发式构建系统操作状态路径图(续)
图10 采用NEAT来训练游戏的AI测试工具