关键词:
软件测试
安卓应用
强化学习
摘要:
移动应用在给我们的日常生活带来便利的同时也使得我们对其倍加依赖。研究数据表明我们每天使用移动应用的平均时间超过两个小时,且时长仍在不断增加。与此同时,如何高效保障移动应用的质量仍然是一个待解决的难题。目前,对移动应用进行测试的主要方式是生成交互事件序列。测试过程中,不同的事件执行顺序往往会产生不同的效果。日常生活中被高频使用的移动应用通常包含丰富的功能和界面,应用的可执行事件及可能的状态跳转构成了一个庞大的组合空间,要对每一种情况进行覆盖会耗费大量测试时间。除此之外,各大公司针对移动应用提出的版本快速迭代需求也给移动应用测试任务增加了难度。现有的Android应用自动测试工作大多采用基于模型或者精细化测试的方法指导测试工具对应用状态进行探索和覆盖。模型的使用可以有效减少测试过程中的冗余事件;符号执行、遗传算法等技术的使用可以指导测试工具产生特定输入,对一些较难覆盖的状态进行探索。与随机测试相比,这些方法能够更有效地指导工具对被测应用进行探索,减少了无用事件的产生,也能缓解测试时间分配不均的问题。但是实验数据表明这些方法在与随机方法的比较中优势并不明显,仍有许多问题需要解决。基于模型的自动测试方法首先采用静态或者动态分析的方法构建模型,然后基于模型进行测试用例的生成。因此,模型的正确性和完整性十分重要。然而,想要完备地探索应用的所有状态十分困难。除此之外,Android应用灵活多变的特点也使得问题更加复杂。尤其是一些受条件约束事件的存在,这类事件在不同的上下文环境中会产生不同的结果,现有方法很难正确对这类情况进行描述。精细化测试方法通常用于产生特定输入对某些复杂分支进行覆盖,在整体代码覆盖度和错误发现方面表现一般,这类方法也往往面临占用计算资源多、时间开销大的问题。为了解决上述问题,本文提出了一种基于强化学习的Android应用自动测试方法。该方法采用好奇心驱动的状态探索策略,使用孪生神经网络对各应用状态进行特征抽取和场景判别,以此引导测试工具对新的功能场景进行探索。方法结合了随机测试、基于模型测试的优点,能够有效提升测试效果和效率。本文的主要工作如下:1.本文提出一种基于强化学习的Android应用测试方法。该方法采用好奇心驱动的状态探索策略,通过一个记忆集合保存部分已探索到的状态,以此来引导测试工具对不熟悉的状态进行探索。该方法能够有效解决随机策略测试时间分配不均的问题,同时避免了测试过程中对模型的过度依赖。2.提出基于功能场景的状态划分方法并收集数据进行神经网络模型训练。该模型可以判定两个Android应用状态是否属于同一功能场景,据此给定的奖赏,可以引导测试工具对不熟悉的功能进行触发。该模型不仅能用于给定强化学习奖赏,状态压缩、代码推荐等任务也可以使用该神经网络。3.基于上述工作,实现了基于强化学习的Android应用自动测试工具Q-testing,并将其与Monkey,Stoat和Sapienz进行比较。结果表明Q-testing在代码覆盖度及发现的错误个数两个指标上均好于现有工具。我们还将相关的错误报告进行了提交,目前已有22个得到开发者确认,其中7个已经被修复。