在做接口自动化测试时,我们经常会准备好一份json文件模板,写入默认值,作为接口请求body的备用;有时候我们需要对传入的值进行重新定义,那么除了修改模板json文件,还可以在执行用例时动态传入参数对接送文件进行修改。
-
这里我们就用到Jayway JsonPath,官方GitHub地址:https://github.com/json-path/JsonPath
官方提供了依赖地址:<dependency> <groupId>com.jayway.jsonpath</groupId> <artifactId>json-path</artifactId> <version>2.4.0</version> </dependency>
读取json中对应key,value方法
这里我习惯用第一种,也推荐使用,比较类似编程时的方法调用;用 $ 表示从根元素开始找,. 点上要找的元素,一层一层的找下去,直到达到你需要找的地方;同样的元素可以根据中括号[]+索引的方法来区分,索引也是从0开始; -
举个例子,要找到下面文件中的“patientName”和“mobilephone”并传入新值
"patient": {
"address": "上海市浦东新区张江镇牛顿路666号",
"education": "本科",
"educationTime": 6,
"jobType": "公务员",
"marrige": "已婚",
"mobilephone": "18888888888",
"patientAge": 0,
"patientBirthdate": "1965-05-04",
"patientName": "API测试患者",
"patientSex": 0
}
1、通过用例获取“patientName”和“mobilephone”传参
@Test
void createPatient() {
//创建"patientName": "API测试患者","mobilephone": "13956588889",的患者
String mobilephone = "1397878";
for (int i = 0;i < 4; i++){
mobilephone+= random.nextInt(9);
}
patientManager.createPatient("API测试患者"+random.nextLong(),mobilephone)
.then().statusCode(200).body("status",equalTo("1"));
}
2、将参数传入map中备用,其对应的key值就是需要替换的Json中元素的路径位置
public Response createPatient(String patientName,String mobilephone){//
//创建"patientName": "API测试患者","mobilephone": "13956588889",的患者
map.put("$.patient.patientName",patientName);
map.put("$.patient.mobilephone",mobilephone);
map.put("_file","/data/brainPlatformApp/PatientManager/createPatient.json");
return getResponseFromSwagger(
"/api/brainPlatformApp/PatientManager/createPatient.yaml",
"/data/brainPlatformApp/AppSwagger.json",
map,
tokenPattern
);
}
3、最后通过写好的模板处理方法,将json文件内容读取修改,返回新的内容
public static String template(String path, HashMap<String, Object> map) {
DocumentContext documentContext = JsonPath.parse(Api.class
.getResourceAsStream(path));
if (map == null){
return documentContext.jsonString();
}
map.entrySet().forEach(entry -> {
documentContext.set(entry.getKey(), entry.getValue());
});
return documentContext.jsonString();
}
4、用例执行完成后查看log中的body值,发现“patientName”和“mobilephone”已被成功修改
Body:
{
"patient": {
"address": "上海市浦东新区张江镇牛顿路666号",
"education": "本科",
"educationTime": 6,
"jobType": "公务员",
"marrige": "已婚",
"mobilephone": "13978780054",
"patientAge": 0,
"patientBirthdate": "1965-05-04",
"patientName": "API测试患者-8297856799751760723",
"patientSex": 0
}
}
写在最后:
因为本人能力不足,资历尚浅,写这些博客主要为了自己总结记录,还望无意中看到的大佬轻喷放过;有刚入门的小伙伴踩坑的话,能帮助到更好,希望测试行业可以发展进步,希望自己可以有好的未来,渴望学习,渴求大平台和大佬能带带我哈~