代码测试及优化案例分析

.原代码(代码来源于网络)

describe ("退货分仓逻辑",function(){

    it("第三方商家、自主发货、已签收状态:退回商家地址",function(){

            var checkMap = {

                "type" : 1

            }

            var data = returnWhcode(checkMap);

            checkDataResults(data,checkMap);

    });

    // 省略19种不同的case

}

function returnWhcode(checkMap){

    //数据准备

    var info = {};

    if(checkMap.type == 1){

 

        info = {

            "seller" : "***",

            "status" : 7,

            "whcode" : "CPartner",

            "logistics" : "auto"

        }

    }else if(checkMap.type == 2){

        info = {

            "seller" : "5ac442c71d9771377df40c8d",

            "status" : 6,

            "whcode" : "CPartner",

            "logistics" : "consolidation"

        }

    }

    //此处省略18个else if

    var data = null;

    // 业务逻辑

    return data;

}function checkDataResults(data,checkMap){

    caseResult.setResultMsg("商家:" + data.afterSaleMap.seller_name);

    caseResult.setResultMsg("包裹状态:" + data.info.status);

    caseResult.setResultMsg("发货仓:" + data.info.whcode);

    caseResult.setResultMsg("物流模式:" + data.info.logistics);

    if(checkMap.type == 1 || checkMap.type == 2 || checkMap.type == 3 || checkMap.type == 5 || checkMap.type == 7 || checkMap.type == 9 || checkMap.type == 11 || checkMap.type == 13){

        expect(data.afterSaleMap.return_wh_code).toBe("CPartner");

        caseResult.setResultMsg("退货地址为第三方商家地址:" + data.afterSaleMap.return_address);

    }

   // 省略多个else if

}

 

二. 代码测试分析

这是一个自动化测试的部分代码,原来的代码总467行,经过统计,原来的代码总共三个if控制段,每个if带19个else,平均每一个条件6-7行的代码,就是说加起来有三四百行的代码是在重复工作,这个测试的场景大概为:测试退货分仓逻辑,根据不同的商家类型、物流模式、和发货仓库,把货物退到不同的地方,内有20种退货组合,会分别退货到5个不同的仓库,也就是说该代码要测一个接口,参数就那么几个,但是请求参数组合有很多种。

 

三. 代码预期优化以及重构代码设计

经过分析,改不需要把所有的请求数据全部写死(hardcode)到代码里面,直接把请求参数抽出来,放到配置文件里面去,然后用个for循环去调用即可,改进后的代码如下:

{"第三方商家、自主发货、已签收状态->退回商家地址":{

    "input":{

      "seller":"5ac442c71d9771377df40c8d",

      "name":"测试redqa021",

      "status":7,

      "whcode":"CPartner",

      "logistics":"auto"

    },

    "except_output":{

      "return_wh_code":"CPartner",

      "return_address":"上海 上海市 上海海洋大学"

    }

  }

}

function checkDataResults(data,info){

    // 输入数据展示

    for(var key in info["input"]){

        caseResult.setResultMsg(key + ": " + info["input"][key])

    }

    // 实际结果和预期结果展示

    for(var key in info["expect_output"]){

        caseResult.setResultMsg(key + "_actrual: " + info["expect_output"][key])

        caseResult.setResultMsg(key + "_expect: " + info["expect_output"][key])

    }

    // 实际结果和预期结果对比

    for(var key in info["expect_output"]){

        expect(data[key]).toBe(info["expect_output"][key]);

    }

}

我们把数据和控制逻辑分离开,几百行代码一下子就变成几十行了,如果之后有新的请求组合出现,只需要在json文件里面新增一个key-value对就好了。

 

四. 代码测试优化总结

1. 为什么会有这么多if-else

整个主流程的逻辑单一,之所以会有这么多代码量,都是因为数据影响了控制逻辑,其实本次测试的每一个case的测试流程都是一样的,完全不需为每个case写一个条件判断。

2. 做了什么

把常改变的和不常改变的东西分开,随着业务的变更,这一个服务可能会产生更多的case,所以case数据是经常变动的,但是我们的接口调用流程,请求响应的整体结构是不会经常变动的,如果对变和不变的预测没有一个好的标准,那么在这里考研提出一个清晰一点的方法,那就是把数据和控制逻辑分开。

3. 有什么好处

1).代码简洁467行和67行)。

2).几乎不用改代码了,这样就可以更专注于测试数据,不用担心改代码的时候出错,造成测试结果不符合预期,就算要改代码也会很轻松,接入配置中心,以后测试的时候你连代码都不用拉下来,直接在平台上就可以新增、修改case。

猜你喜欢

转载自www.cnblogs.com/zhouxiaojie1999/p/zhouxiaojie.html