java实现okhttp编写的自动化多接口串联
·
一、多接口串联
- 串联原因:在实际工作中的自动化接口测试,都是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();
}
}
更多推荐
所有评论(0)