当前位置:   article > 正文

python接口篇-框架封装_python接口封装

python接口封装
  1. 封装公用的测试用例前置和后置操作

在 Pytest 中,我们可以使用 fixture 来封装测试用例的前置和后置操作。fixture 是一个带有装饰器@pytest.fixture 的函数,它可以在测试用例执行前后执行一些代码,例如登录、退出登录、清理测试数据等

  1. import pytest
  2. @pytest.fixture(scope="module")
  3. def login():
  4. # 执行登录操作
  5. yield
  6. # 执行退出操作
  7. @pytest.fixture(scope="function")
  8. def clear_data():
  9. # 执行清除测试数据操作
  10. pass
  11. def test_case1(login, clear_data):
  12. # 执行测试用例1,需要登录和清除测试数据的支持
  13. def test_case2(login, clear_data):
  14. # 执行测试用例2,需要登录和清除测试数据的支持
  15. @pytest.fixture(scope="module")
  16. def logout():
  17. # 执行退出操作
  18. pass
  19. def test_case3(logout):
  20. # 执行测试用例3,只需要退出操作的支持
  1. 封装公用的测试数据

例如测试环境的配置、测试数据的读取等,可以使用yaml 或者 json 等配置文件进行管理。

  1. #使用pytest和json文件封装测试环境配置和测试数据读取
  2. import pytest
  3. import os
  4. import json
  5. @pytest.fixture(scope='session')
  6. def test_config():
  7. # 读取测试环境配置
  8. config_file = os.path.join(os.path.dirname(__file__), 'config.json')
  9. with open(config_file, 'r') as f:
  10. config = json.load(f)
  11. return config
  12. @pytest.fixture(scope='session')
  13. def test_data():
  14. # 读取测试数据
  15. data_file = os.path.join(os.path.dirname(__file__), 'test_data.json')
  16. with open(data_file, 'r') as f:
  17. data = json.load(f)
  18. return data
'
运行
如上,我们将配置信息和测试数据分别存储在了config.json和test_data.json文件中。在fixture函数中,我们通过读取这两个文件来获取配置信息和测试数据。需要注意的是,我们需要使用os模块来获取json文件的路径。
  1. 封装公用的测试方法

例如发送 HTTP 请求、解析响应结果、断言等,可以使用 requests、jsonpath 等库进行实现。

  1. #封装发送 HTTP 请求、解析响应结果、断言
  2. import requests
  3. def send_request(method, url, data=None, headers=None):
  4. """
  5. 发送 HTTP 请求并返回响应结果
  6. """
  7. response = requests.request(method, url, data=data, headers=headers)
  8. return response
  9. def parse_response(response):
  10. """
  11. 解析 HTTP 响应结果并返回对应的数据
  12. """
  13. data = response.json()
  14. return data
  15. def assert_response(response, expected_status_code, expected_data=None):
  16. """
  17. 断言 HTTP 响应结果是否符合预期
  18. """
  19. assert response.status_code == expected_status_code
  20. if expected_data is not None:
  21. assert response.json() == expected_data
'
运行
以上代码中,send_request 函数用于发送 HTTP 请求并返回响应结果,parse_response 函数用于解
析 HTTP 响应结果并返回对应的数据,assert_response 函数用于断言 HTTP 响应结果是否符合预期。
  1. #在编写测试用例时,可以使用这些函数来封装测试用例的前置和后置操作,避免重复的代码
  2. def test_create_user():
  3. # 发送创建用户的请求
  4. data = {"username": "testuser", "password": "testpassword"}
  5. response = send_request("POST", "http://localhost:8000/api/users/", data=data)
  6. # 解析响应结果
  7. data = parse_response(response)
  8. # 断言响应结果是否符合预期
  9. assert_response(response, 201, {"id": data["id"], "username": "testuser"})
'
运行
在上面的测试用例中,我们使用 send_request 函数发送创建用户的请求,使用 parse_response 函数解析响应结果,使用 assert_response 函数断言响应结果是否符合预期。这样,我们就可以避免在每个测试用例中重复编写这些代码。
  1. 封装公用的测试报告生成工具

例如 pytest-html、allure-pytest 等,可以方便地生成美观的测试报告。

  1. pytest-html

  1. #安装
  2. pip install pytest-html
  3. import pytest
  4. from datetime import datetime
  5. from _pytest.config import Config
  6. @pytest.fixture(scope="session")
  7. def html_report(request: pytest.FixtureRequest, config: Config):
  8. report_path = config.getoption("--html-report-path")
  9. report_name = f"report_{datetime.now().strftime('%Y-%m-%d_%H-%M-%S')}.html"
  10. report_file = f"{report_path}/{report_name}"
  11. def _generate_report():
  12. yield
  13. with open(report_file, "w", encoding="utf-8") as f:
  14. f.write(request.config._html.report_html)
  15. yield _generate_report
  16. if request.config.getoption("--html-open"):
  17. import webbrowser
  18. webbrowser.open(report_file, new=2)
在这个 fixture 中,我们使用了 Pytest 的 Config 类来获取命令行参数 --html-report-path,这个参数指定了测试报告的保存路径。然后我们在 _generate_report 函数中生成测试报告,并将测试报告保存到指定的路径。最后,我们将 _generate_report 函数作为 fixture 的返回值,这样测试用例就可以使用这个 fixture 来生成测试报告了。
使用这个 fixture 很简单,只需要在测试用例中添加一个参数即可:
  1. def test_example(html_report):
  2. # 测试代码
在运行测试用例时,可以使用 --html-report-path 参数来指定测试报告的保存路径,例如:
pytest --html-report-path=./reports
这样就可以将测试报告保存到 ./reports 目录下了。同时,我们还可以使用 --html-open 参数来在测试用例执行完毕后自动打开测试报告:
pytest --html-report-path=./reports --html-open
这样在测试用例执行完毕后,测试报告会自动在浏览器中打开。

  1. allure-pytest

  1. #安装
  2. pip install allure-pytest
  3. import pytest
  4. from datetime import datetime
  5. import os
  6. import shutil
  7. import subprocess
  8. @pytest.fixture(scope="session")
  9. def allure_report(request):
  10. report_dir = os.path.join(os.getcwd(), "allure-report")
  11. if os.path.exists(report_dir):
  12. shutil.rmtree(report_dir)
  13. cmd = f"pytest --alluredir={report_dir}"
  14. subprocess.call(cmd, shell=True)
  15. yield report_dir
  16. cmd = f"allure serve {report_dir}"
  17. subprocess.call(cmd, shell=True)
在这个 fixture 中,我们首先创建了一个新的测试报告目录,然后使用 Pytest 命令行工具来运行测试用例,并将测试报告保存到指定的目录中。在测试用例执行完毕后,我们使用 allure 命令行工具来生成并展示测试报告。

接下来,我们需要在测试用例中使用这个 fixture。在 Pytest 中,我们可以使用 @pytest.mark.usefixtures 装饰器来指定使用哪个 fixture。
  1. import pytest
  2. @pytest.mark.usefixtures("allure_report")
  3. def test_example():
  4. assert 1 + 1 == 2
'
运行
在这个测试用例中,我们使用了 @pytest.mark.usefixtures("allure_report") 装饰器来指定使用 allure_report fixture。这样,在测试用例执行前,Pytest 会自动执行 allure_report fixture 中定义的操作。
最后,我们可以使用 Pytest 命令行工具来运行测试用例,并生成测试报告。以下是一个运行测试用例并生成测试报告的命令:
pytest --alluredir=./allure-report
在这个命令中,我们使用 --alluredir 参数来指定测试报告生成的目录。
运行完毕后,我们可以使用以下命令来展示测试报告:
allure serve ./allure-report
  1. 封装公用的日志模块

在 pytest 中,我们可以使用 Python 内置的 logging 模块来记录日志。具体来说,我们可以在 conftest.py 文件中定义一个 fixture 来封装日志模块,然后在测试用例中使用该 fixture 来记录日志。

  1. import logging
  2. import pytest
  3. @pytest.fixture(scope="session")
  4. def logger(request):
  5. logger = logging.getLogger('pytest')
  6. logger.setLevel(logging.DEBUG)
  7. log_file = request.config.getoption("--log-file")
  8. fh = logging.FileHandler(log_file, mode='w')
  9. fh.setLevel(logging.DEBUG)
  10. ch = logging.StreamHandler()
  11. ch.setLevel(logging.DEBUG)
  12. formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
  13. fh.setFormatter(formatter)
  14. ch.setFormatter(formatter)
  15. logger.addHandler(fh)
  16. logger.addHandler(ch)
  17. return logger
'
运行
在上面的代码中,我们定义了一个名为 logger 的 fixture,它的作用域是 session 级别。我们使用 logging.getLogger('pytest') 来获取一个名为 pytest 的 logger 对象,并将其日志级别设置为 DEBUG。然后,我们使用 request.config.getoption("--log-file") 来获取命令行参数中的日志文件路径,并创建一个 FileHandler 对象和一个 StreamHandler 对象来分别将日志写入文件和控制台。最后,我们将这两个 handler 添加到 logger 对象中,并返回 logger 对象。
在测试用例中,我们可以像下面这样使用 logger fixture 来记录日志:
  1. def test_something(logger):
  2. logger.debug('This is a debug message')
  3. logger.info('This is an info message')
  4. logger.warning('This is a warning message')
  5. logger.error('This is an error message')
  6. logger.critical('This is a critical message')
'
运行
在上面的测试用例中,我们使用 logger.debug()、logger.info()、logger.warning()、logger.error() 和 logger.critical() 方法来记录不同级别的日志信息。这些日志信息将会被写入到我们在 conftest.py 文件中指定的日志文件中。

  1. 封装公用的异常处理模块

在 pytest 中封装公用的异常处理模块可以提高测试用例的可维护性和可读性,同时也可以减少代码重复。可以在 conftest.py 文件中定义 fixture 来封装异常处理模块。

  1. import pytest
  2. @pytest.fixture
  3. def exception_handler():
  4. try:
  5. yield
  6. except Exception as e:
  7. pytest.fail(str(e))
'
运行
在测试用例中,可以使用 exception_handler fixture 来封装需要进行异常处理的代码块
  1. def test_something(exception_handler):
  2. # some code that may raise an exception
  3. assert True
'
运行
如果测试用例中的代码块抛出异常,exception_handler fixture 会自动捕获并将异常信息转化为 pytest 的失败信息,从而使测试用例失败。如果代码块没有抛出异常,测试用例会正常执行。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/791523
推荐阅读
相关标签
  

闽ICP备14008679号