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

在做接口自动化测试时,我们需将测试用例的预期结果与实际结果进行对比,如果一致就认定测试用例通过,不一致就认定失败。而后端接口返回的数据一般是以json的方式返回到前端,那么用jsonpath来做预期结果的处理就很适合了,尤其是对于复杂的json串,jsonpath的优势更明显。

Jsonpath:看它的名字你就能知道,这家伙和JSON文档有关系,正如XPath之于XML文档一样,JsonPath为Json文档提供了解析能力,通过使用JsonPath,你可以方便的查找节点、获取想要的数据,JsonPath是Json版的XPath。

JsonPath语法要点:

  • $ 表示文档的根元素

  • @ 表示文档的当前元素

  • .node_name 或 ['node_name'] 匹配下级节点

  • [index] 检索数组中的元素

  • [start:end:step] 支持数组切片语法

  • * 作为通配符,匹配所有成员

  • .. 子递归通配符,匹配成员的所有子元素

  • (<expr>) 使用表达式

  • ?(<boolean expr>)进行数据筛选

下面分别用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)

总结:
感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。