对数器
先说一个痛点,自己代码出bug的时候,由于没有具体的测试用例,或者说具体的测试用例不好代入代码中去,那么只好干蹬着代码,有时候眼睛蹬出血丝说不定也定位不到问题,这时候对数器就来了。
一.对数器的作用
我们可以自定义测试样本的容量,通过大量的样本来保证代码的正确性,也可以控制样本容量找出适合的测试用例,待入代码找出bug。
二.使用具体案例
1.就以排序数据举例吧,写好一个返回随机长度、随机值的方法
/**
* 返回一个arr,arr的长度[0,maxLen - 1];arr的值范围[0,maxValue - 1]
* @param maxLen
* @param maxValue
* @return
*/
public static int[] LenRondomValueRondom(int maxLen, int maxValue){
int len = (int)(Math.random() * maxLen);
int[] arr = new int[len];
for (int i = 0; i < len; i++) {
arr[i] = (int)(Math.random() * maxValue);
}
return arr;
}
2.找个选择排序的代码
/**
* 选择排序
* @param arr
*/
public static void selectSort(int [] arr) {
if(arr == null || arr.length < 2) {
return;
}
int N = arr.length;
// 0 ~ n - 1
for(int i = 0; i < N; i++) {
int minValueIndex = i;
for(int j = i+1; j < N;j++) {
minValueIndex = arr[j] < arr[minValueIndex] ? j : minValueIndex;
}
swap(arr,i,minValueIndex);
}
}
/**
* 交换两个数的值
* @param arr
* @param i
* @param j
*/
public static void swap(int [] arr, int i,int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
3.进行主方法测试
/**
* 备份数组
* @param arr
* @return
*/
public static int[] copyArray(int [] arr) {
int [] ans = new int[arr.length];
for(int i = 0; i < arr.length; i++) {
ans[i] = arr[i];
}
return ans;
}
/**
* 判断是否有效
* @param arr
* @return
*/
public static boolean isSorted(int [] arr) {
if(arr.length < 2) {
return true;
}
int max = arr[0];
for(int i = 1; i < arr.length;i++) {
if(max > arr[i]) {
return false;
}
max = Math.max(max, arr[i]);
}
return true;
}
public static void main(String[] args) {
int maxLen = 50;
int maxValue = 1000;
int testTime = 10000; //设置测试次数
for(int i = 0; i < testTime; i++) {
int[] arr1 = lenRandomValueRandom(maxLen, maxValue);//产生随机数组
int[] temp = copyArray(arr1); //留下数组备份,方便找出初始测试用例,因为排序后顺序乱了
selectSort(arr1); //测试选择排序
if(!isSorted(arr1)) {//isSorted()为测试是否有序函数
for(int j = 0; j < temp.length;j++) {
System.out.print(temp[j]+" ");
} //打印备份数组
System.out.println();
System.out.println("选择排序错了");
return;
}
}
System.out.println("结束了");
}
}
测试结果:
4.修改正确代码,缩小样本容量
修改如下:
public static void selectSort(int [] arr) { if(arr == null || arr.length < 2) { return; } int N = arr.length; // 0 ~ n - 1 for(int i = 0; i < N; i++) { int minValueIndex = i; for(int j = i+1; j < N;j++) { minValueIndex = arr[j] >= arr[minValueIndex] ? j : minValueIndex; } swap(arr,i,minValueIndex); } }
将<改成>=,跑一下
得到错误的测试用例,短小精悍
参考视频:【【算法与数据结构入门篇】零基础5天快速入门算法,超详细的手绘图解思路+代码讲解】https://www.bilibili.com/video/BV1Zr4y1W7ww?p=16&vd_source=4f74ec47d55d3a418ba7440d219e1ed4