• pytest+yaml实现接口自动化框架


    前言

    httprunner 用 yaml 文件实现接口自动化框架很好用,最近在看 pytest 框架,于是参考 httprunner的用例格式,写了一个差不多的 pytest 版的简易框架

    项目结构设计

    项目结构完全符合 pytest 的项目结构,pytest 是查找 test_.py 文件,我这里是查找 test_.yml 文件,唯一不同的就是这个地方
    以前写test_*.py 的测试用例,现在完全不用写了,全部写yaml 文件就行,项目结构参考

    只需在 conftest.py 即可实现,代码量超级少
    pytest 7.x最新版

    1. def pytest_collect_file(parent, file_path):
    2. # 获取文件.yml 文件,匹配规则
    3. if file_path.suffix == ".yml" and file_path.name.startswith("test"):
    4. return YamlFile.from_parent(parent, path=file_path)

    pytest 5.x以上版本

    1. import pytest
    2. import requests
    3. def pytest_collect_file(parent, path):
    4. # 获取文件.yml 文件,匹配规则
    5. if path.ext == ".yml" and path.basename.startswith("test"):
    6. # print(path)
    7. # print(parent)
    8. # return YamlFile(path, parent)
    9. return YamlFile.from_parent(parent, fspath=path)
    10. class YamlFile(pytest.File):
    11. # 读取文件内容
    12. def collect(self):
    13. import yaml
    14. raw = yaml.safe_load(self.fspath.open(encoding='utf-8'))
    15. for yaml_case in raw:
    16. name = yaml_case["test"]["name"]
    17. values = yaml_case["test"]
    18. yield YamlTest.from_parent(self, name=name, values=values)
    19. class YamlTest(pytest.Item):
    20. def __init__(self, name, parent, values):
    21. super(YamlTest, self).__init__(name, parent)
    22. self.name = name
    23. self.values = values
    24. self.request = self.values.get("request")
    25. self.validate = self.values.get("validate")
    26. self.s = requests.session()
    27. def runtest(self):
    28. # 运行用例
    29. request_data = self.values["request"]
    30. # print(request_data)
    31. response = self.s.request(**request_data)
    32. print("\n", response.text)
    33. # 断言
    34. self.assert_response(response, self.validate)
    35. def assert_response(self, response, validate):
    36. '''设置断言'''
    37. import jsonpath
    38. for i in validate:
    39. if "eq" in i.keys():
    40. yaml_result = i.get("eq")[0]
    41. actual_result = jsonpath.jsonpath(response.json(), yaml_result)
    42. expect_result = i.get("eq")[1]
    43. print("实际结果:%s" % actual_result)
    44. print("期望结果:%s" % expect_result)
    45. assert actual_result[0] == expect_result

    pytest 4.x 以下版本

    1. import pytest
    2. import requests
    3. # 作者-上海悠悠 QQ交流群:717225969
    4. # blog地址 https://www.cnblogs.com/yoyoketang/
    5. def pytest_collect_file(parent, path):
    6. # 获取文件.yml 文件,匹配规则
    7. if path.ext == ".yml" and path.basename.startswith("test"):
    8. # print(path)
    9. # print(parent)
    10. return YamlFile(path, parent)
    11. class YamlFile(pytest.File):
    12. # 读取文件内容
    13. def collect(self):
    14. import yaml
    15. raw = yaml.safe_load(self.fspath.open(encoding='utf-8'))
    16. for yaml_case in raw:
    17. name = yaml_case["test"]["name"]
    18. values = yaml_case["test"]
    19. yield YamlTest(name, self, values)
    20. class YamlTest(pytest.Item):
    21. def __init__(self, name, parent, values):
    22. super(YamlTest, self).__init__(name, parent)
    23. self.name = name
    24. self.values = values
    25. self.request = self.values.get("request")
    26. self.validate = self.values.get("validate")
    27. self.s = requests.session()
    28. def runtest(self):
    29. # 运行用例
    30. request_data = self.values["request"]
    31. # print(request_data)
    32. response = self.s.request(**request_data)
    33. print("\n", response.text)
    34. # 断言
    35. self.assert_response(response, self.validate)
    36. def assert_response(self, response, validate):
    37. '''设置断言'''
    38. import jsonpath
    39. for i in validate:
    40. if "eq" in i.keys():
    41. yaml_result = i.get("eq")[0]
    42. actual_result = jsonpath.jsonpath(response.json(), yaml_result)
    43. expect_result = i.get("eq")[1]
    44. print("实际结果:%s" % actual_result)
    45. print("期望结果:%s" % expect_result)
    46. assert actual_result[0] == expect_result

    断言这部分,目前只写了判断相等,仅供参考,支持jsonpath来提取json数据

    yaml格式的用例

    在项目的任意目录,只要是符合test_开头的yml文件,我们就认为是测试用例
    test_login.yml的内容如下

    1. - test:
    2. name: login case1
    3. request:
    4. url: http://49.235.x.x:7000/api/v1/login/
    5. method: POST
    6. headers:
    7. Content-Type: application/json
    8. User-Agent: python-requests/2.18.4
    9. json:
    10. username: test
    11. password: 123456
    12. validate:
    13. - eq: [$.msg, login success!]
    14. - eq: [$.code, 0]
    15. - test:
    16. name: login case2
    17. request:
    18. url: 49.235.x.x:7000/api/v1/login/
    19. method: POST
    20. headers:
    21. Content-Type: application/json
    22. User-Agent: python-requests/2.18.4
    23. json:
    24. username: test
    25. password: 123456
    26. validate:
    27. - eq: [$.msg, login success!]
    28. - eq: [$.code, 0]

    运行用例

    运行用例,完全符合pytest的只需用例风格,支持allure报告

    pytest -v

    1. D:\soft\api_pytest_1208>pytest -v
    2. ====================== test session starts ======================
    3. platform win32 -- Python 3.6.6, pytest-4.5.0, py-1.9.0,
    4. cachedir: .pytest_cache
    5. rootdir: D:\soft\api_pytest_1208
    6. plugins: allure-pytest-2.8.6
    7. collected 4 items
    8. data/test_login.yml::login case1 PASSED [ 25%]
    9. data/test_login.yml::login case2 PASSED [ 50%]
    10. data/test_login1.yml::login case1 PASSED [ 75%]
    11. data/test_login1.yml::login case2 PASSED [100%]
    12. =================== 4 passed in 1.34 seconds ====================

    allure报告

    pytest --alluredir ./report

    目前是把 yaml 文件下每个 test 当一个用例执行,后续还可以加上提取参数,参数关联更高级的功能!

    这可能是B站最详细的pytest自动化测试框架教程,整整100小时,全程实战!!!

  • 相关阅读:
    JUnit 5 单元测试教程
    【Pandas总结】第三节 Pandas 的显示设置(总结所有常用显示设置)
    I/O处理器与DMA控制器与I/O通道
    Linux中vim编译器
    单表简单查询
    kubernetes 亲和、反亲和、污点、容忍
    DM 集群软硬件环境需求
    开机信息与log
    Docker 常用命令总结
    长沙市2022年成人高考疫情防控补充公告
  • 原文地址:https://blog.csdn.net/dq565/article/details/134276658