import java.util.HashMap;
/**
* PairWise(成对)测试方法
* author: likeqc
* date: 2021-4-4 11:06:59
*/
class PairWise {
/**
* @param str String[][],二维数组,一维数组 str[i] 中存放第 i 个因素的因子
*/
private static void solution(String[][] str) {
System.out.println());
if (str == null) {
return;
}
// // 传统方式测试用例数量
int sum = 1;
// // 符合要求的测试用例数量
int count = 0;
HashMap hashMap = new HashMap();
//遍历每一个因子
for (int i = 0; i < str.length; i++) {
//特殊情况:某个因子没法取值
if (str[i].length < 1) {
System.out.println("输出的数据错误!");
return;
}
//所有因子的能取值的个数相乘就是笛卡尔积,得到正交分析法的全排列
sum *= str[i].length;
}
//初始化一个和因子个数相同的维度数组
int[] one = new int[str.length];
//开始pairwise算法的核心,遍历正交分析法得到的组合用例个数相同的次数
for (int i = 0; i < sum; i++) {
// //创造一个新的测试用例(传统方法,暴力所有可能的测试用例)
int carry = 1;
//从后往前遍历因子
for (int j = str.length - 1; j >= 0; j--) {
if (i == 0) {
continue;
}
//X % Y时, 如果, X < Y 的话, 回传值就是 X
one[j] = (one[j] + carry) % str[j].length;
if (carry == 1 && one[j] == 0) {
carry = 1;
} else {
carry = 0;
}
}
// 测试该测试用例是否能够产生新的配对组
boolean flag = false;
for (int j = 0; j < str.length; j++) {
for (int k = j + 1; k < str.length; k++) {
String key = j + "_" + str[j][one[j]] + "," + k + "_" + str[k][one[k]];
System.out.println(key);
if (hashMap.get(key) == null) {
flag = true;
System.out.println("新的key:" + key);
hashMap.put(key, 1);
}
}
}
// 产生了新的配对组,说明该用例符合 PairWise 规则,输出
if (flag) {
count++;
System.out.print("测试用例" + count + ":" + str[0][one[0]]);
for (int j = 1; j < str.length; j++) {
System.out.print("," + str[j][one[j]]);
}
System.out.println();
}
}
System.out.println("PairWise方法测试用用例:" + count);
System.out.println("传统方法测试用用例:" + sum);
}
public static void main(String[] args) {
// A:"T"、"F"
// B:"1"、"2"、"3"
// C:"a"、"b"、"c"、"d"
solution(new String[][]{{"T", "F"}, {"1", "2", "3"}, {"a", "b", "c", "d"}});