在做接口自动化测试时,我们需将测试用例的预期结果与实际结果进行对比,如果一致就认定测试用例通过,不一致就认定失败。而后端接口返回的数据一般是以json的方式返回到前端,那么用jsonpath来做预期结果的处理就很适合了,尤其是对于复杂的json串,jsonpath的优势更明显。
Jsonpath:看它的名字你就能知道,这家伙和JSON文档有关系,正如XPath之于XML文档一样,JsonPath为Json文档提供了解析能力,通过使用JsonPath,你可以方便的查找节点、获取想要的数据,JsonPath是Json版的XPath。
JsonPath语法要点:
$ 表示文档的根元素
@ 表示文档的当前元素
.node_name 或 ['node_name'] 匹配下级节点
[index] 检索数组中的元素
[start:end:step] 支持数组切片语法
* 作为通配符,匹配所有成员
.. 子递归通配符,匹配成员的所有子元素
(
?(
下面分别用Java与Python实现以Jsonpath的方式处理预期结果
-
- # java代码
-
- import com.alibaba.fastjson.JSONPath;
- import org.junit.jupiter.api.Test;
- import java.util.HashMap;
- import java.util.Map;
-
- public class JSONPathUtil {
-
- public static Boolean checkPoint(String response, String checkData) throws Exception {
- //分隔检查点
- String[] data = checkData.split(";");
- //设置标记
- Boolean flag = false;
-
- Map<String, Object> map = new HashMap<>();
- for (int i = 0; i < data.length; i++) {
- map.put(data[i].split("=")[0], data[i].split("=")[1]);
- System.out.println("检查点" + (i + 1) + "实际结果:" + JSONPath.read(response, data[i].split("=")[0]));
- System.out.println("检查点" + (i + 1) + "预期结果:" + map.get(data[i].split("=")[0]));
- if (JSONPath.read(response, data[i].split("=")[0]) instanceof String) {
- if (JSONPath.read(response, data[i].split("=")[0]).equals(map.get(data[i].split("=")[0]))) {
- flag = true;
- } else {
- flag = false;
- }
- } else {
- if ((JSONPath.read(response, data[i].split("=")[0]).toString()).equals(map.get(data[i].split("=")[0]))) {
- flag = true;
- } else {
- flag = false;
- break;
- }
- }
- }
- return flag;
- }
-
- @Test
- public void testCheckPoint() {
- String json = "{\"store\":{\"book\":[{\"title\":\"高效Java\",\"price\":10.0},{\"title\":\"设计模式\",\"price\":12.21},{\"title\":\"重构\",\"isbn\":\"553\",\"price\":8},{\"title\":\"虚拟机\",\"isbn\":\"395\",\"price\":22}],\"bicycle\":{\"color\":\"red\",\"price\":19}}}";
- String params = "$.store.book[0].price=10.0;$.store.book[1].title=设计模式";
- Boolean flag = null;
- try {
- flag = checkPoint(json, params);
- } catch (Exception e) {
- e.printStackTrace();
- }
- if (flag) {
- System.out.println("测试执行结果:成功");
- } else {
- System.out.println("测试执行结果:失败");
- }
- }
- }
下面是python代码
-
- import jsonpath
-
-
- def get_instance(value, check):
- flag = None
- if isinstance(value, str):
- if check == value:
- flag = True
- else:
- flag = False
- elif isinstance(value, float):
- if value - float(check) == 0:
- flag = True
- else:
- flag = False
- elif isinstance(value, int):
- if value - int(check) == 0:
- flag = True
- else:
- flag = False
- return flag
-
-
- def check(response, checkPoint):
- c = checkPoint.split(";")
- flag = None
- for i in range(0, len(c)):
- checkPoint_dict = {}
- checkPoint_dict[c[i].split("=")[0]] = c[i].split("=")[1]
- list = jsonpath.jsonpath(response, c[i].split("=")[0])
- value = list[0]
- check = checkPoint_dict[c[i].split("=")[0]]
- print("检查点{}:实际结果:{}, 预期结果:{}".format(i + 1, value, check))
- flag = get_instance(value, check)
- if flag:
- print("测试执行结果:成功")
- else:
- print("测试执行结果:失败")
-
-
- if __name__ == '__main__':
- response = {"store": {"book": [{"title": "高效Java", "price": 10.0}, {"title": "设计模式", "price": 12.21},
- {"title": "重构", "isbn": "553", "price": 8},
- {"title": "虚拟机", "isbn": "395", "price": 22}],
- "bicycle": {"color": "red", "price": 19}}}
- checkPoint = "$.store.book[0].price=10.0;$.store.book[1].title=设计模式1";
- check(response, checkPoint)
感谢每一个认真阅读我文章的人!!!
作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。
文档获取方式:
加入我的软件测试交流群:632880530免费获取~(同行大佬一起学术交流,每晚都有大佬直播分享技术知识点)
这份文档,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!
以上均可以分享,只需要你搜索vx公众号:程序员雨果,即可免费领取