接着前面自动化测试的测试用例生成和收集,下面我们就需要做的是对测试用例进行排序,简单来说就是达到语句的全部覆盖。说到排序就涉及到三个算法,下面就是我对三个算法的阐述及代码实现。咱们由易入难。
1’自动用例生成(使用Randoop)>
2‘评价(对用例筛选冗余)>功能覆盖、语句覆盖(一般用后者)
>插桩 (插入语句)
用Javassist实现自动插入语句
3’测试用例排序排序>三种算法实现测试用例排序
1‘ 随机算法:测试用例会排序就是生成一个用例序列,随机算法就是随机生成一个测试用例序列
下面是对序列进行打乱随机排序的两种方法:
//(1)利用math的random方法
List l=new ArrayList(
input);
//将input数组放入arraylist,input为集合
List res=new ArrayList();
//用来存放随机产生元素的结果
Random r=new Random();//随机数
int size=l.size();
for(int i=0;i<size;i++){
res.add(l.remove(
r.nextInt(l.size())));
//为了保证不重复,每次随机产生后都删除该元素。
}
//此时res中存放的就是随机排序的结果。
//(2)利用collections的buffle方法
import java.util.Collections; import java.util.LinkedList; import java.util.List; public class Test {
List list = new LinkedList(); public static void main(String[] args) { List list = new LinkedList(); for ( int i = 0 ; i < 9 ; i ++ ) { list.add( " a " + i); } Collections.sort(list); // 顺序排列 System.out.println(list); Collections.shuffle(list); //随机打乱一个序列 System.out.println(list); Collections.reverse(list); // 倒序排列 System.out.println(list); System.out.println(Collections.binarySearch(list, " a5 " )); // 折半查找 }
对此我简单的用list输入一个测试用例序列并进行随机排序,输出结果:
package testpaixu;
import java.util.*;
public class randomA {
public static void main(String args[]){
//测试用例数目
int N=6;
List<Integer> lis=new ArrayList<Integer>();
//添加测试用例1,2,3,4,5,6为序列
for(int i=1;i<=N;i++){
lis.add(i);
}
//输出原测试用例序列
System.out.println("测试用例序列:"+lis);
//随机排序
Collections.shuffle(lis);
System.out.println("随机排序后测试用例序列:"+lis);
}
}
结果显示:
2’· 贪心算法:
一种能够得到某种度量意义下的最优解的分级处理方法,它总是做出在当前看来是最优的选择,也就是说贪心策略并不是从整体上加以考虑,它所做出的选择只是在某种意义上的局部最优解算法。
该算法存在问题:
1. 不能保证求得的最后解是最佳的;
2. 不能用来求最大或最小解问题;
3. 只能求满足某些约束条件的可行解的范围。
实现该算法的过程:
从问题的某一初始解出发;
while 能朝给定总目标前进一步 do
求出可行解的一个解元素;
由所有解元素组合成问题的一个可行解;
现在我用