• 接口自动化测试之预期结果的处理


    在做接口自动化测试时,我们需将测试用例的预期结果与实际结果进行对比,如果一致就认定测试用例通过,不一致就认定失败。而后端接口返回的数据一般是以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的方式处理预期结果

    1. # java代码
    2. import com.alibaba.fastjson.JSONPath;
    3. import org.junit.jupiter.api.Test;
    4. import java.util.HashMap;
    5. import java.util.Map;
    6. public class JSONPathUtil {
    7. public static Boolean checkPoint(String response, String checkData) throws Exception {
    8. //分隔检查点
    9. String[] data = checkData.split(";");
    10. //设置标记
    11. Boolean flag = false;
    12. Map<String, Object> map = new HashMap<>();
    13. for (int i = 0; i < data.length; i++) {
    14. map.put(data[i].split("=")[0], data[i].split("=")[1]);
    15. System.out.println("检查点" + (i + 1) + "实际结果:" + JSONPath.read(response, data[i].split("=")[0]));
    16. System.out.println("检查点" + (i + 1) + "预期结果:" + map.get(data[i].split("=")[0]));
    17. if (JSONPath.read(response, data[i].split("=")[0]) instanceof String) {
    18. if (JSONPath.read(response, data[i].split("=")[0]).equals(map.get(data[i].split("=")[0]))) {
    19. flag = true;
    20. } else {
    21. flag = false;
    22. }
    23. } else {
    24. if ((JSONPath.read(response, data[i].split("=")[0]).toString()).equals(map.get(data[i].split("=")[0]))) {
    25. flag = true;
    26. } else {
    27. flag = false;
    28. break;
    29. }
    30. }
    31. }
    32. return flag;
    33. }
    34. @Test
    35. public void testCheckPoint() {
    36. 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}}}";
    37. String params = "$.store.book[0].price=10.0;$.store.book[1].title=设计模式";
    38. Boolean flag = null;
    39. try {
    40. flag = checkPoint(json, params);
    41. } catch (Exception e) {
    42. e.printStackTrace();
    43. }
    44. if (flag) {
    45. System.out.println("测试执行结果:成功");
    46. } else {
    47. System.out.println("测试执行结果:失败");
    48. }
    49. }
    50. }

    下面是python代码

    1. import jsonpath
    2. def get_instance(value, check):
    3. flag = None
    4. if isinstance(value, str):
    5. if check == value:
    6. flag = True
    7. else:
    8. flag = False
    9. elif isinstance(value, float):
    10. if value - float(check) == 0:
    11. flag = True
    12. else:
    13. flag = False
    14. elif isinstance(value, int):
    15. if value - int(check) == 0:
    16. flag = True
    17. else:
    18. flag = False
    19. return flag
    20. def check(response, checkPoint):
    21. c = checkPoint.split(";")
    22. flag = None
    23. for i in range(0, len(c)):
    24. checkPoint_dict = {}
    25. checkPoint_dict[c[i].split("=")[0]] = c[i].split("=")[1]
    26. list = jsonpath.jsonpath(response, c[i].split("=")[0])
    27. value = list[0]
    28. check = checkPoint_dict[c[i].split("=")[0]]
    29. print("检查点{}:实际结果:{}, 预期结果:{}".format(i + 1, value, check))
    30. flag = get_instance(value, check)
    31. if flag:
    32. print("测试执行结果:成功")
    33. else:
    34. print("测试执行结果:失败")
    35. if __name__ == '__main__':
    36. response = {"store": {"book": [{"title": "高效Java", "price": 10.0}, {"title": "设计模式", "price": 12.21},
    37. {"title": "重构", "isbn": "553", "price": 8},
    38. {"title": "虚拟机", "isbn": "395", "price": 22}],
    39. "bicycle": {"color": "red", "price": 19}}}
    40. checkPoint = "$.store.book[0].price=10.0;$.store.book[1].title=设计模式1";
    41. check(response, checkPoint)

    Python接口自动化测试零基础入门到精通(2023最新版)

  • 相关阅读:
    使用Plotly可视化
    ​力扣解法汇总1417-重新格式化字符串
    【小程序开发】—— 封装自定义弹窗组件
    vue使用axios实现下载功能
    从保险科技看数字化如何改变保险行业
    【AOP系列】5.错误处理
    Improper integral
    某赛驱动器调节工具DM-Series使用笔记
    以创新抵御经济环境压力:自动化测试ReadyAPI帮助企业平衡软件质量与成本控制
    “摸不着”的数字孪生,如何带来“看得见”的数据效益?
  • 原文地址:https://blog.csdn.net/ada4656/article/details/133893042