Jmeter进行接口自动化测试实战-多行数据库数据比对(无序)

前言

我们一定会遇到这么一个情况:开发进行bug修复,然后我们进行回归测试,结果发现比对的时候虽然字段不变,但顺序却跟原来的不一样,一样的结果,不一样的顺序,那么我就得反复地修改我们的csv用例的预期结果

我的方法是自己写一个比对包

思路:

  • 既然是字符串数组,那就比对连个数组内容是否对等
  • 将数组1的元素的值作为key存入Hashmap中,如果HashMap中没有该元素key,则将其key所对应的value设置为1,如果Hashmap中有了该key,则将key中的值加1.
  • 这是遍历第二个数组,如果在HashMap中没有数组2中元素的key,则返回false,如果有则将其key所对应的值减1。最后第三次遍历,遍历数组1,获取HashMap对应key所对应的值,如果值不为0,则返回false

上代码

public class ArraySame {
    /**
    * 定义固定字符
    */
    public static final char FrontBracket = '[';
    public static final char AfterBracket = ']';
    /**
    *
    * @param csvData    csv用例预期结果
    * @param sqlData    sql查询结果(jmeter查询)
    * @return
    * TODO 统一调用
    */
    public boolean CompareData(String csvData ,String sqlData){
        //先去除空格(清洗数组)
        String replaceAll1 = csvData.replaceAll(" ", "");
        String replaceAll2 = sqlData.replaceAll(" ", "");
        String b = deleteString(replaceAll1, FrontBracket, AfterBracket);
        String c = deleteString(replaceAll2, FrontBracket, AfterBracket);
        //转成字符串数组
        String[] arrayCSV = b.split(",");
        String[] arraySQL = c.split(",");
        //比较
        return isEquals(arrayCSV, arraySQL);

    }

    /**
    *
    * @param str
    * @param delChar1
    * @param delChar2
    * @return String
    * TODO  去除两个指定字符
    */
    public static String deleteString(String str, char delChar1, char delChar2) {
        String delStr0 = "";
        String delStr = "";
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) != delChar1) {
                delStr0 += str.charAt(i);
            }
        }
        for (int i = 0; i < delStr0.length(); i++) {
            if (delStr0.charAt(i) != delChar2) {
                delStr += delStr0.charAt(i);
            }
        }
        return delStr;
    }


    /**
    * 比较两个数组中的所有元素是否相等,思路:将数组1的元素的值作为key存入Hashmap中,如果HashMap中没有该元素key,则将其key所对应的value设置为1,如果Hashmap中有了该key,则将key中的值加1.
    * 这是遍历第二个数组,如果在HashMap中没有数组2中元素的key,则返回false,如果有则将其key所对应的值减1。最后第三次遍历,遍历数组1,获取HashMap对应key所对应的值,如果值不为0,则返回false
    *
    * @param obj1
    *            要比较的数组1
    * @param obj2
    *            要比较的数组2
    * @return
    */
    public static boolean isEquals(String[] obj1, String[] obj2) {
        if (obj1 == null && obj2 == null) {
            return true;
        }
        if (obj1 == null && (obj2 != null && obj2.length == 0)) {
            return true;
        }
        if (obj2 == null && (obj1 != null && obj1.length == 0)) {
            return true;
        }
        if ((obj1 == null || obj2 == null) || obj1.length != obj2.length) {
            return false;
        }
        HashMap<String, Integer> map = new HashMap<>();
        for (int i = 0; i < obj1.length; i++) {
            if (map.containsKey(obj1[i].toString())) {
                Integer value = map.get(obj1[i]);
                map.put(obj1[i].toString(), ++value);
            } else {
                map.put(obj1[i].toString(), 1);
            }
        }

        for (int i = 0; i < obj2.length; i++) {
            // 如果在数组2中不包含该元素,则直接返回false
            if (!map.containsKey(obj2[i].toString())) {
                return false;
            }
            Integer value = map.get(obj2[i].toString());
            map.put(obj2[i].toString(), --value);
        }

        // 最后一次遍历,查看HashMap中所有的值是否为0
        for (int i = 0; i < obj1.length; i++) {
            Integer value = map.get(obj1[i].toString());
            if (value != 0) {
                return false;
            }
        }

        return true;
        }
}

打jar包不会的,可以给个链接:

仅供参考:https://blog.csdn.net/k_young1997/article/details/92066393

打好的包放在jmeter目录的/lib/ext里面,然后在BeanShell Sampler控件里面正常import就行,一般形式为import 包名.类名Jmeter进行接口自动化测试实战-多行数据库数据比对(无序)_第1张图片

小结

当然,有一部分同学可能只是需要比对从数据库返回的json串,那么下次可以顺带讲解一下无序比对的json串jar怎么写

传送门:https://blog.csdn.net/weixin_42427287/article/details/103695212

你可能感兴趣的:(接口自动化测试)