场景:
POST请求,基于json格式,请求报文中部分字段在自动化测试中,是唯一的,所以需要参数化。
将参数化后的json报文作为该POST请求的参数,发送并检查是否请求成功。
以下是详细说明
一、测试类:PushClaimTest.java
定义方法 test(),调用 工具类 Helper.pushClaim()的方法
这里有两种方式:
1、创建Map集合,将所有需要参数化的json字符串的 jsonPath,jsonValue 分别放入Map中,然后调用Helper.pushClaim(map,"","")方法;
2、需要参数化的字段已因定不变且比较少,直接使用Helper.pushClaim("","")方法;这里的两个参数分别代表 companyCode,userAccount
PushClaimTest.java 代码:
import com.arronlong.httpclientutil.exception.HttpProcessException;
import com.cccis.test.common.util.helper.Helper;
import org.testng.annotations.Test;
import java.util.HashMap;
import java.util.Map;
public class PushClaimTest {
@Test
public void test() throws HttpProcessException {
Map<String,Object> map = new HashMap();
String jsonPath = "";
String jsonValue = "03";
map.put(jsonPath,jsonValue);
// Helper.pushClaim(map,"SH0103","auto01");
Helper.pushClaim("SH0103","auto01");
}
}
二、工具类:Helper.java
定义了重载方法 pushClaim(),一个是json报文中需要参数化的字段有多个且可变,就使用参数有map集合的pushClaim方法
pushClaim()解析
1、使用工具类JSONUtil.java中的getJsonObject()方法获取json字符串的JSONOject对象
2、json字符串中需要固定参数化的字段通过随机数拼接,使其自动生成
3、使用工具类JSONUtil.replaceJson()方法,替换json对象中需要参数化的字段
4、判断pushClaim()方法中的参数Map集合是否为空
不为空时,就遍历Map集合,然后使用JSONUtil.replaceJson()方法,替换json对象中map集合里需要参数化的字段
5、将上述已替换完成的JSON对象转换成字符串
6、使用工具类HttpUtil.pushClaim()方法并传入第5步的字符串发送HTTP请求(这里是POST请求)
7、判断HTTP请求响应报文中,是否包含成功相关字样
如果成功,就返回任务号
如果失败,就返回null
Helper.java代码:
package com.cccis.test.common.util.helper;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.arronlong.httpclientutil.exception.HttpProcessException;
import com.cccis.test.common.util.HttpUtil;
import com.cccis.test.common.util.JsonUtil;
import com.cccis.test.common.util.SeleniumUtil;
import com.cccis.test.common.util.StringUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class Helper {
private static Logger log = LoggerFactory.getLogger(Helper.class);
public static String pushClaim(String companyCode,String userAccount) throws HttpProcessException {
return pushClaim(new HashMap(),companyCode,userAccount);
}
public static String pushClaim(Map<String,Object> map,String companyCode,String userAccount) throws HttpProcessException {
JSONObject json;
json = JsonUtil.getJsonObject(new File("src/main/resources/task.json"));
String randomStr = StringUtil.getRandStr();
String taskNo = "taskNo"+randomStr;
String accidentNo = "accidentNo"+randomStr;
JsonUtil.replaceJson(json,"$.taskNo",taskNo);
JsonUtil.replaceJson(json,"$.accidentInfo.accidentNo",accidentNo);
JsonUtil.replaceJson(json,"$.companyCode",companyCode);
JsonUtil.replaceJson(json,"$.userAccount",userAccount);
if(map.size()>0){
Iterator<Map.Entry<String,Object>> iterator = map.entrySet().iterator();
while(iterator.hasNext()){
Map.Entry<String,Object> entry = iterator.next();
SeleniumUtil.logInfo("更新JSON模板,["+entry.getKey()+"] - ["+entry.getValue()+"]");
JsonUtil.replaceJson(json,entry.getKey(),entry.getValue());
}
}
log.info(JSON.toJSONString(json));
String response = HttpUtil.pushClaim(JSON.toJSONString(json));
if(response.contains("成功")){
SeleniumUtil.logInfo("任务推送成功,taskNo: " +taskNo);
return taskNo;
}else{
SeleniumUtil.logInfo("任务推送失败:"+response);
return null;
}
}
}
三、工具类:JsonUtil.java
定义了操作JSON对象的相关方法
1、getJsonObject(File file)方法,只需传入File对象(即json字符串所在文件的路径)
通过JSONObject对象的parseObject(FileUtil.readFile(file))方法,读取文件中的json字符串,返回JSON对象
2、getJsonObject(String jsonString)方法,直接传入json字符串
通过JSONObject对象的parseObject(jsonString)方法,读取json字符串,返回JSON对象
3、replaceJson(JSONObject jsonObject, String jsonPath, Object value)方法,需传入要替换的字段对应的JSON对象,需参数化的字段的jsonPath,jsonValue
通过JSONObject对象的set(jsonObject, jsonPath, value)方法,设置JSON对象中指定jsonPath的Value值
4、deleteJson(JSONObject jsonObject, String jsonPath)方法,需传入需要删除的json对象中某个字段的jsonPath
通过JSONObject对象的remove(jsonObject, jsonPath)方法,移除JSON对象中指定的字段
5、getValue(JSONObject jsonObject, String jsonPath)方法,获取JSON对象中指定jsonPath的值
通过JSONObject对象的eval(jsonObject, jsonPath)方法,获取JSON对象中jsonPath对应的value
JsonUtil.java代码:
package com.cccis.test.common.util;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.JSONPath;
import java.io.File;
public class JsonUtil
{
public static JSONObject getJsonObject(File file)
{
return JSONObject.parseObject(FileUtil.readFile(file));
}
public static JSONObject getJsonObject(String jsonString)
{
return JSONObject.parseObject(jsonString);
}
public static boolean replaceJson(JSONObject jsonObject, String jsonPath, Object value)
{
return JSONPath.set(jsonObject, jsonPath, value);
}
public static boolean deleteJson(JSONObject jsonObject, String jsonPath)
{
return JSONPath.remove(jsonObject, jsonPath);
}
public static Object getValue(JSONObject jsonObject, String jsonPath)
{
return JSONPath.eval(jsonObject, jsonPath);
}
}
四、工具类:HttpUtil.java
定义了pushClaim方法,封装发送HTTP Post请求
这里用到com.arronlong.httpclientutil包下相关类
该包中HttpClientUtil是基于HttpClient-4.4.1封装的一个工具类,支持插件式配置Header、插件式配置httpclient对象,
HttpConfig 插件式配置请求参数(网址、请求参数、编码、client)
HttpConfig config = HttpConfig.custom()
.headers(headers) //设置headers,不需要时则无需设置
.url(url) //设置请求的url
.json(json字符串) //设置请求参数,没有则无需设置
.encoding("utf-8")//设置请求和返回编码,默认就是Charset.defaultCharset()
发送POST请求HttpClientUtil.post(config);
HttpUtil.java代码:
package com.cccis.test.common.util;
import com.arronlong.httpclientutil.HttpClientUtil;
import com.arronlong.httpclientutil.common.HttpConfig;
import com.arronlong.httpclientutil.exception.HttpProcessException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HttpUtil
{
private static Logger log = LoggerFactory.getLogger(HttpUtil.class);
public static String pushClaim(String task) throws HttpProcessException {
SeleniumUtil.logInfo("任务推送");
HttpConfig config = HttpConfig.custom().url("http://192.168.**.**:8888/services/restful/pushClaim").json(task).encoding("utf-8");
return HttpClientUtil.post(config);
}
}
json文件内容:
{
"accLossInfo": {
"absoluteDeductibleRate": 0,
"accidentType": "pe",
"dutyCertProcedure": "01",
"surveyAssignDate": "2019-05-06 10:01:08",
"vehicleSurveyDate": "2019-05-06 10:01:08",
"vehicleSurveyName": "车物查勘员",
"vehicleSurveyOnsiteRecord": "03"
},
"accidentInfo": {
"reportFirstPlaceFlag": false,
"reportLossAmount": 0,
"reportNo": "reportNo20190712113700",
"reporter": "报案人里斯本",
"reporterFixedTelNo": "103498238299",
"reporterTelNo": "103498238299",
"selfClaimFlag": false,
"surveyMode": "现场查勘",
"surveyType": "01",
"weather": "多云"
},
"residenceYears": 10,
"seekMedicalWay": "SeekMedicalWay001",
"sex": "Sex001",
"trafficType": "TrafficCondition001",
"treatmentState": "TreatmentState001",
"casualtyName": "伤者一",
"taskNo": "TaskNoOY2019080703",
"companyCode": "SH0103",
"userAccount": "ccc01"
}