一、多接口串联

  • 串联原因:在实际工作中的自动化接口测试,都是flow,也就是流程,一个测试场景需要执行多个接口
  • 串联顺序:往往执行后面的接口需要的入参是前面接口response返回的信息,比如执行接口C,需要数据b,那么我们需要执行接口B,获取数据b,接口B需要数据a,那必须执行接口A,获得数据a,那么接口的执行顺序为A-->B-->C
  • 串联方式:一个场景需要的方法放到一个类中,使用类对象按序号调用本类中的方法
  • 注(这个后面再实践):实际执行自动化接口,需要在执行的的最后删除数据,为了保证下次执行时,没有重复的数据导致执行失败,若是只有当前flow需要的数据,那么在当前flow的最后就可以删掉(比如当前用例生成的数据/前提数据),若是整个测试过程中或者多个flow都需要的数据,需要在整个测试计划(最后的几个flow中) 删除掉(比如自动化测试用户、用户机构组织等信息)
public class test(){
    method A(){
    //例如这是新增方法
}
    method B(){
    //例如这是查询方法
}
    method C(){
    //例如这是删除方法
}
    public static void main(String[] args) throws IOException {
        test add = new test();
        add.A();
        add.B();
        add.C();
    }

}

二、怎么实现接口返回值的传递

  • 可以创建private变量来存储值,方法执行过后更新值,下一个方法使用时就会得到
public class test(){
    private String b="";
    private String c="";
    method A(){
    //例如这是新增方法
    //通过返回值获取到response,再获取到想要的b useValueb
    this.b=useValueb;
}
    method B(){
    //例如这是查询方法
    //在这里入参使用b;
    //通过返回值获取到response,再获取到想要的b useValuec
    this.c=useValuec
}
    method C(){
    //例如这是删除方法
    //在这里入参使用c;
}
    public static void main(String[] args) throws IOException {
        test add = new test();
        add.A();
        add.B();
        add.C();
    }

}

三、优化

  • 优化接口请求中的重复内容,提取公共到private变量,比如url前缀,cookie等,若是head想通过也可以优化提取
  • 优化入参:若是不想在每次入参变化,都去改每个方法,把入参变化的值提取到变量中

四、实例

  • 功能解析: 简单的以我司功能为例,对某个页面数据 新增--查询-删除(当然你直接跑肯定是跑不通的,内网环境)

  • 如下,接口2的执行需要接口一生成数据,先执行接口1

    接口2若是要保证更准确,断言需要把查询到的值与接口一生成的数据进行比较(比如获取返回值中第一条数据的某个唯一字段与入参字段比较/查询数据库有没有这条数据/或者有时候新建数据接口会返回id,查询数据id比较),实例中只是简单的接口断言,并不太准确

        接口3需要动态获取被删除数据的id,需要接口2查询到并且传给接口3

  • 代码实例 
package TestCase;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import okhttp3.*;

import java.io.IOException;


public class newData {
    private String ci_name = "nameb";
    private String cookie = "CASTGC=TGT-534c37c9-34da-44ff-820a-a37b02cea758; aops-sessionId=4299f94e-c1b7-49ef-a85b-5a77df42fd88; SESSION=NDI5OWY5NGUtYzFiNy00OWVmLWE4NWItNWE3N2RmNDJmZDg4";
    private String Url = "http://10.0.14.246:18080/docp/gateway/";
    private String createDataId = "";
    private String searchDataId = "";
    private String deleteId="";

    //添加数据
    public void addData() throws IOException {
        String jsonStr = "{\"uri\":\"/api/v2/lowcode/formView/saveFormData\",\"method\":\"POST\",\"requestBody\":\"{\\\"sysId\\\":\\\"af9z8136d694wplkfkpwqx3bw85k3gzq\\\",\\\"globalSysId\\\":\\\"af9z8136d694wplkfkpwqx3bw85k3gzq\\\",\\\"formViewId\\\":\\\"65c7e7ae90b14d0282de9ec13a583bd1\\\",\\\"mainTableName\\\":\\\"mod_sss\\\",\\\"data\\\":{\\\"ci_name\\\":null,\\\"ci_code\\\":null,\\\"version\\\":null,\\\"description\\\":null,\\\"running_status\\\":\\\"pending_allocation\\\",\\\"domain\\\":null,\\\"ip\\\":null,\\\"port\\\":null,\\\"mtce_mode\\\":null,\\\"mtc_org\\\":null,\\\"op_engineer\\\":null,\\\"bak_maintainer\\\":null,\\\"owner_org\\\":null,\\\"sys_owner\\\":null,\\\"mtc_contract\\\":null,\\\"low_code_sys_updated_time\\\":null,\\\"low_code_sys_updated_by\\\":null},\\\"fieldStateMap\\\":{\\\"ci_name\\\":{\\\"display\\\":true,\\\"editable\\\":true,\\\"required\\\":true},\\\"ci_code\\\":{\\\"display\\\":true,\\\"editable\\\":false,\\\"required\\\":false},\\\"version\\\":{\\\"display\\\":true,\\\"editable\\\":true,\\\"required\\\":false},\\\"description\\\":{\\\"display\\\":true,\\\"editable\\\":true,\\\"required\\\":false},\\\"running_status\\\":{\\\"display\\\":true,\\\"editable\\\":true,\\\"required\\\":true},\\\"domain\\\":{\\\"display\\\":true,\\\"editable\\\":true,\\\"required\\\":false},\\\"ip\\\":{\\\"display\\\":true,\\\"editable\\\":true,\\\"required\\\":false},\\\"port\\\":{\\\"display\\\":true,\\\"editable\\\":true,\\\"required\\\":false},\\\"mtce_mode\\\":{\\\"display\\\":true,\\\"editable\\\":true,\\\"required\\\":false},\\\"mtc_org\\\":{\\\"display\\\":true,\\\"editable\\\":true,\\\"required\\\":false},\\\"op_engineer\\\":{\\\"display\\\":true,\\\"editable\\\":true,\\\"required\\\":false},\\\"bak_maintainer\\\":{\\\"display\\\":true,\\\"editable\\\":true,\\\"required\\\":false},\\\"owner_org\\\":{\\\"display\\\":true,\\\"editable\\\":true,\\\"required\\\":false},\\\"sys_owner\\\":{\\\"display\\\":true,\\\"editable\\\":true,\\\"required\\\":false},\\\"mtc_contract\\\":{\\\"display\\\":true,\\\"editable\\\":true,\\\"required\\\":false},\\\"mtc_contract➛supplier\\\":{\\\"display\\\":true,\\\"editable\\\":false,\\\"required\\\":false},\\\"mtc_contract➛mtc_type\\\":{\\\"display\\\":true,\\\"editable\\\":false,\\\"required\\\":false},\\\"mtc_contract➛type\\\":{\\\"display\\\":true,\\\"editable\\\":false,\\\"required\\\":false},\\\"mtc_contract➛mtc_starttime\\\":{\\\"display\\\":true,\\\"editable\\\":false,\\\"required\\\":false},\\\"mtc_contract➛mtc_endtime\\\":{\\\"display\\\":true,\\\"editable\\\":false,\\\"required\\\":false},\\\"mtc_contract➛mtc_contact\\\":{\\\"display\\\":true,\\\"editable\\\":false,\\\"required\\\":false},\\\"mtc_contract➛mtc_phone\\\":{\\\"display\\\":true,\\\"editable\\\":false,\\\"required\\\":false}},\\\"dataId\\\":\\\"\\\"}\"}";
        //此为jsonstr变更变量的起点,把ci_name用变量代替
        // 创建ObjectMapper实例
        ObjectMapper objectMapper = new ObjectMapper();

        // 解析JSON字符串
        JsonNode rootNode = objectMapper.readTree(jsonStr);

        // 获取requestBody字段(它是一个字符串形式的JSON)
        String requestBodyStr = rootNode.get("requestBody").asText();

        // 解析requestBody为JsonNode
        JsonNode requestBodyNode = objectMapper.readTree(requestBodyStr);

        // 获取data对象
        ObjectNode dataNode = (ObjectNode) requestBodyNode.get("data");

        // 替换ci_name的值
        dataNode.put("ci_name", ci_name);

        // 将修改后的requestBodyNode转换回字符串
        String updatedRequestBodyStr = objectMapper.writeValueAsString(requestBodyNode);

        // 更新根节点的requestBody字段
        ((ObjectNode) rootNode).put("requestBody", updatedRequestBodyStr);

        // 将整个JSON转换回字符串
        String updatedJsonStr = objectMapper.writeValueAsString(rootNode);
        //如上为jsonStr变更变量的结束

        //创建请求对象
        OkHttpClient client = new OkHttpClient();

        //创建请求body的对象
        RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), updatedJsonStr);
        //构建请求
        Request request = new Request.Builder()
                .header("Accept-Encoding", "gzip, deflate, br")
                .header("Accept", "*/*")
                .header("Accept-Language", "zh-cn;q=0.8")
                .header("Connection", "keep-alive")
                .header("Multi_Language", "true")
                .header("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36")
                .header("appName", "dosmdp")
                .header("data_channel", "CMDB")
                .header("language", "zh_CN")
                .header("operate_type", "PC")
                .header("operationInfo", "")
                .header("Cookie", this.cookie)
                .post(requestBody)
                .url(String.format("%s/cmdb/api/v2/cmdb/ci/create",this.Url))
                .build();

        //执行请求
        Response response = client.newCall(request).execute();

        //获取响应信息
        String response_data = response.body().string();

        //输出请求结果
        System.out.println("response为:" + response_data);

        //解析json
        ObjectMapper mapper = new ObjectMapper();
        JsonNode jsonnode = mapper.readTree(response_data);

        //输出msg与mainSysId
        System.out.println("message:" + jsonnode.get("message"));
        System.out.println("id为:" + jsonnode.get("data").get("traceId"));

        String dataId = jsonnode.get("data").get("traceId").asText();

        if (jsonnode.get("message").asText().equals("请求成功")) {
            System.out.println("请求成功");
            System.out.println("新建数据id为:" + jsonnode.get("data").get("traceId"));
            this.createDataId= jsonnode.get("data").get("traceId").asText();
        } else {
            System.out.println("新增执行失败!");
        }

        //关闭响应资源
        response.close();
        System.out.println("==============================这是新增接口=================================");

    }

    //查询数据
    public void search () throws IOException {
//        String url = "http://10.0.14.246:18080/docp/gateway/dosm/api/v2/lowcode/recordList/getData";
        //创建请求对象
        OkHttpClient client =new OkHttpClient();

        //构建请求参数
//        String json = "{\"columnViewNames\":[],\"conditionColumnQuery\":[{\"id\":\"JC4hVVEv\",\"compoundType\":\"AND\",\"filterGroups\":[{\"id\":\"wghX2jwm\",\"compoundType\":\"AND\",\"fieldFilters\":[{\"id\":\"SSdVQPOe\",\"fieldName\":\"relation_table_name➛table_name\",\"fieldLabel\":\"编码\",\"dataType\":\"string\",\"operator\":\"=\",\"args\":[{\"valueType\":\"NORMAL\",\"normalValue\":\"sys_data_type\"}],\"isChoice\":false},{\"id\":\"g3b8f3iL\",\"isChoice\":true,\"fieldName\":\"view_type\",\"fieldLabel\":\"视图类型\",\"dataType\":\"string\",\"operator\":\"=\",\"args\":[{\"valueType\":\"NORMAL\",\"normalValue\":\"DEFAULT_LIST\"}]}]}]}],\"currentPage\":1,\"pageSize\":10,\"primaryIds\":[],\"sortRules\":[],\"viewId\":\"ca2c0e8acd6446f49c967a9eca2b51e2\",\"conditionFixedFilter\":[]}";
        String json = "{\"columnViewNames\":[],\"conditionColumnQuery\":[],\"primaryIds\":[],\"sortRules\":[],\"viewId\":\"bfd7dfc79fa84eaea9be535f1208acb4\",\"conditionFixedFilter\":[],\"currentPage\":1,\"pageSize\":100,\"useListDefSortRules\":true}";
        //创建请求body的对象
        RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), json);
        //构建请求
        Request request = new Request.Builder()
                .header("Accept-Encoding","gzip, deflate, br")
                .header("Accept","*/*")
                .header("Accept-Language","zh-cn;q=0.8")
                .header("Connection","keep-alive")
                .header("Multi_Language","true")
                .header("User-Agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36")
                .header("appName","dosmdp")
                .header("data_channel","CMDB")
                .header("language","zh_CN")
                .header("operate_type","PC")
                .header("operationInfo","")
                .header("Cookie", this.cookie)
//                 .header("Content-Type","application/json")
                .post(requestBody)
                .url(String.format("%s/dosm/api/v2/lowcode/recordList/getData",this.Url))
                .build();

        //执行请求
        Response response = client.newCall(request).execute();

        //获取响应信息
        String response_data = response.body().string();

        //输出请求结果
        System.out.println("response为:"+response_data);

        //解析json
        ObjectMapper mapper = new ObjectMapper();
        JsonNode jsonnode =mapper.readTree(response_data);

        //输出msg与mainSysId
        System.out.println("msg:"+jsonnode.get("msg"));
        System.out.println("msg:"+jsonnode.get("data").get("records").get(0).get("mainSysId"));

        if(jsonnode.get("msg").asText().equals("成功")){
            System.out.println("查询执行成功");
            System.out.println("第一条数据id为:"+jsonnode.get("data").get("records").get(0).get("mainSysId"));
        }else{
            System.out.println("查询执行失败!");
        }

        this.searchDataId=jsonnode.get("data").get("records").get(0).get("mainSysId").asText();
        //关闭响应资源
        response.close();

        System.out.println("============================这是查询接口=============================");
//        return jsonnode.get("data").get("records").get(0).get("mainSysId").asText();
    }

    public void deleteData() throws IOException {
        OkHttpClient client =new OkHttpClient();

        this.deleteId=this.searchDataId;

        //构建请求参数
        String jsonStr = "{\"uri\":\"/api/v2/lowcode/recordList/batchRemoveRecords\",\"method\":\"POST\",\"requestBody\":\"{\\\"viewId\\\":\\\"bfd7dfc79fa84eaea9be535f1208acb4\\\",\\\"primaryIds\\\":[\\\"168724DE15B14E408184848F2C6C5BD0\\\"]}\"}";

        ObjectMapper mapper = new ObjectMapper();

        // 解析外层JSON
        JsonNode outerJson = mapper.readTree(jsonStr);
        ObjectNode outerObject = (ObjectNode) outerJson;

        // 解析requestBody中的JSON
        JsonNode requestBodyNode = mapper.readTree(outerJson.get("requestBody").asText());
        ObjectNode requestBodyone = (ObjectNode) requestBodyNode;

        // 创建新的primaryIds数组
        ArrayNode newPrimaryIds = mapper.createArrayNode();
        newPrimaryIds.add(this.deleteId);
//        newPrimaryIds.add("NEW_ID_2");
//        newPrimaryIds.add("NEW_ID_3");

        // 替换primaryIds
        requestBodyone.set("primaryIds", newPrimaryIds);
        // 更新外层JSON的requestBody
        outerObject.put("requestBody", requestBodyone.toString());

        System.out.println(outerObject.toString());


        //创建请求body的对象
        RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), outerObject.toString());
        //构建请求
        Request request = new Request.Builder()
                .header("Accept-Encoding","gzip, deflate, br")
                .header("Accept","*/*")
                .header("Accept-Language","zh-cn;q=0.8")
                .header("Connection","keep-alive")
                .header("Multi_Language","true")
                .header("User-Agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36")
//                .header("appName","dosmdp")
                .header("data_channel","CMDB")
                .header("language","zh_CN")
                .header("operate_type","PC")
                .header("operationInfo","")
                .header("Cookie", this.cookie)
//                 .header("Content-Type","application/json")
                .post(requestBody)
                .url(String.format("%s/cmdb/api/v2/cmdb/ci/del",this.Url))
                .build();

        //执行请求
        Response response = client.newCall(request).execute();

        //获取响应信息
        String response_data = response.body().string();

        //输出请求结果
        System.out.println("response为:"+response_data);

        //解析json
//        ObjectMapper mapper = new ObjectMapper();
        JsonNode jsonnode =mapper.readTree(response_data);

        //输出msg与mainSysId
        System.out.println("message:"+jsonnode.get("message"));
        System.out.println("dataMessage:"+jsonnode.get("data").get("msg"));

        if(jsonnode.get("data").get("msg").asText().equals("success")){
            System.out.println("执行成功");
//            System.out.println("第一条数据id为:"+jsonnode.get("data").get("records").get(0).get("mainSysId"));
        }else{
            System.out.println("执行失败!");
        }

        //关闭响应资源
        response.close();

        System.out.println("这是删除接口");

    }



    public static void main(String[] args) throws IOException {
        newData add = new newData();
        add.addData();
        add.search();
        add.deleteData();
    }
}

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐