Pairwise实现(Java篇)

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"}});
  
posted @ 2024-05-23 16:15  抱紧西瓜的老吴  阅读(47)  评论(0编辑  收藏  举报