場景:
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"
}