1.2 回归测试的必要性
软件测试的关键是测试用例的设计,好的用例设计策略能用较少的用例覆盖更多的功能点,发现更多的缺陷。因此,自动化测试的关键是要自动地生成好的测试用例,至于测试的执行,只是带着测试用例运行程序而已。
测试用例的设计从来都不是一件简单的事,它需要达到一定的目标。例如,在阿里巴巴公司Java工程的测试中,衡量测试用例好坏的标准就有类覆盖率、方法覆盖率、行覆盖率、分支覆盖率等。在不同类型的工程中,各种覆盖率的要求也不一样。这就要求在设计测试用例时要有一定的策略。类覆盖和方法覆盖比较简单,只需要调用该类里面的方法,就算覆盖到了该类及其中的方法。但是,语句覆盖、分支覆盖等要达到一个比较高的覆盖率,就需要在设计测试用例时,能以程序内部结构,特别是分支语句为依据。当然,怎样根据程序的内部结构来设计测试用例,正是测试用例自动生成领域主要的研究内容。近年来,在这个领域已经有一些较为成熟的算法,它们都有各自适用的场景。比较常见的算法有以下几种。
1.基于随机算法的测试用例自动生成
该算法由Hamlet在1994年提出[8],它的基本思想是使用程序输入域上随机产生的数据生成测试用例,将生成的测试用例代入待测程序,检测测试目标是否被覆盖。该算法没有任何的反馈机制,它的优点就是简单,生成测试用例的效率高,由于数据是随机生成的,能较好地避免测试人员的主观因素。当然,由于完全随机,它生成的测试用例覆盖率低,还有较多的无效用例。
2.基于遗传算法的测试用例自动生成(https://www.daowen.com)
该算法是一种启发性或者说有反馈机制的算法,由Jones在1995年首次提出[9]。它实际上是在随机生成用例的基础上,去除不满足约束的测试用例,保留满足约束的用例(次优解),再以次优解为基础,重复这个过程,直到找到最优解。最后得到的测试用例是适合测试环境的最优测试用例。这种算法和随机算法相比,复杂度有所增加,但是生成的测试用例质量(包括覆盖率和执行时间两个方面)明显提高。该算法在开始阶段由于数据量大,能产生大量次优解,然而随着算法的进行,符合要求的次优解越来越少,算法会遇到瓶颈,所以该算法“重大体而不重精确解”。
3.基于蚁群算法的测试用例自动生成
该算法是Mcminn等人将Dorigo等人提出的仿生寻优启发式算法引入测试用例生成领域的[10]。该算法先把需要求解的约束抽象为一张有向图G,把寻找最优解的过程看作一只“蚂蚁”在G中移动,移动的过程中不断获取和释放信息(获取的信息如一个变量的取值范围等,释放的信息如是否已经覆盖到目标元素等),最终找到满足约束的解。该算法和遗传算法相比,是一个增强的学习系统,能够更好地利用程序本来的信息,但是由于需要“不断学习”,所以在初期,信息相对匮乏,算法效率偏低,而一旦形成了一定量的信息积累,算法效率将会显著提高。
当然,除了上面所列的3种算法,还有其他的算法也在近年被提出,用于测试用例自动生成。这些算法各有优劣,共同服务于测试用例自动生成领域。