pytest + yaml 框架 - 41.postman 和 python代码自动录制成yaml用例

python代码 和postman 写的接口也能通过录制功能自动生成yaml格式用例了。

python 代码运行后自动录制

环境准备参考前面一篇https://www.cnblogs.com/yoyoketang/p/17495374.html

在项目本地新建一个recorde.py ,名称随便定义

from pytest_yaml_yoyo.mitm_http import RecoderHTTP
"""
步骤:1.pip 安装 mitmproxy 环境
> pip install mitmproxy
2.复制这里的代码,新建recorde.py 文件,设置过滤环境如:http://127.0.0.1:8001
3.启动服务
> mitmweb -s ./recorde.py -p 8099
4.电脑开启代理,设置对应端口
5.自动录制抓包转成 yaml 用例
"""

addons = [
    RecoderHTTP(['http://httpbin.org'])   # 设置过滤环境
]

本地 python 代码如下

import requests

url = "http://httpbin.org/post"
body = {
    "user": "test",
    "password": "123456"
}
r = requests.post(url, json=body)
print(r.text)

执行后会自动抓到对应接口,转成 test_post_post.yml 测试用例

config:
  base_url: http://httpbin.org
post_post:
  request:
    method: POST
    url: /post
    headers:
      Content-Type: application/json
    json:
      user: test
      password: '123456'
  validate:
  - eq: [status_code, 200]
  - eq: [headers."Content-Type", application/json]
  - eq: [$.data, '{"user": "test", "password": "123456"}']
  - eq: [$.origin, 183.193.25.125]
  - eq: [$.url, http://httpbin.org/post]

postman 上接口也能抓取

如果你之前接口写在postman 上,想转成yaml 用例也很简单,只需执行对应的接口,就可以自动抓取转成yaml用例了.

常用的参数配置

RecoderHTTP 实例化时,可以设置以下几个参数

  • filter_host: 抓取的环境地址,可以是多个

  • ignore_cookies: 是否忽略掉cookies,默认False

  • save_base_url: 是否在 pytest.ini 保存全局base_url环境地址, 默认False

  • save_case_dir: 设置用例保存目录,默认cases

1.默认情况下,只需传一个参数,抓取的环境地址,可以是一个,也可以是多个

addons = [
    RecoderHTTP(['http://httpbin.org'])
]

也可以抓取多个环境地址

addons = [
    RecoderHTTP(['http://httpbin.org', 'https://www.baidu.com'])
]

2.ignore_cookies 是设置是否忽略cookies抓取,默认False

设置为True, 录制的yaml 用例中不会带上cookies

3.save_base_url是否在 pytest.ini 保存全局base_url环境地址, 默认False.
默认情况下,每个yaml 用例中在config 添加base_url 环境地址,兼容抓取多个环境的情况

如果只需抓一个环境的地址,设置全局base_url地址,设置save_base_url=True

addons = [
    RecoderHTTP(['http://httpbin.org'], save_base_url=True)
]

抓取用例时会自动创建pytest.ini文件

[pytest]
log_cli = true
base_url = http://httpbin.org

yaml 用例中不带base_url了

post_post:
  request:
    method: POST
    url: /post
    headers:
      Content-Type: application/json
    json:
      user: test
      password: '123456'
  validate:
  - eq: [status_code, 200]
  - eq: [headers."Content-Type", application/json]
  - eq: [$.data, '{"user": "test", "password": "123456"}']
  - eq: [$.origin, 183.193.25.125]
  - eq: [$.url, http://httpbin.org/post]

4.save_case_dir 参数设置用例保存目录,yaml 用例默认保存目录cases

最后:下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

全部资料获取

<think>好的,我现在需要帮助用户构建一个基于Python、requests、pytest、Allurelogging的接口自动化测试框架。首先,我要回顾用户之前的问题对话历史,确保我理解他们的需求。 用户之前询问了如何在Postman中创建集合,现在他们想转向自动化测试框架的搭建。根据提供的引用内容,用户已经有一些技术选型的知识,比如使用Python+Requests发送请求,Pytest作为测试执行器,YAML管理测试数据,Allure生成报告,Logging记录日志。用户现在希望整合这些工具来构建框架,所以我需要提供一个结构化的步骤指南。 首先,我需要确定框架的基本结构。通常,一个自动化测试框架会有目录结构来组织测试用、配置、数据、工具方法等。比如,创建config目录存放配置文件,data存放YAML测试数据,test_cases存放测试脚本,utils放置公共方法,logs存放日志,reports生成Allure报告。 接下来是依赖安装。用户需要安装必要的库,比如requests发送HTTP请求,pytest运行测试,pyyaml处理YAML文件,allure-pytest生成报告。这些可以通过pip安装,确保用户的环境正确设置。 然后是配置文件管理,使用YAML来存储基础URL日志配置。比如在config/settings.yaml中定义base_url日志路径、级别。这样配置代码分离,方便维护。 测试数据管理也是关键部分。用户需要使用YAML文件来参数化测试数据,每个接口的测试用可以包括请求方法、路径、参数、预期结果等。这样测试数据与测试脚本分离,提高可维护性。 编写公共方法模块,比如在utils/api_client.py中创建一个类处理requests请求,封装GET、POST等方法,并集成日志记录。这样可以在测试用中重复使用,减少代码冗余。 测试脚本部分需要使用pytest编写,利用参数化来加载YAML中的测试数据。每个测试函数对应一个测试用,调用公共方法发送请求,进行断言验证。同时,添加Allure装饰器来增强报告的可读性,比如添加feature、story、title等标签。 日志配置需要在框架初始化时设置,比如在conftest.py中配置logging模块,定义日志格式、文件名级别。确保测试过程中的关键步骤错误信息被记录下来。 运行测试时,使用pytest命令行参数,指定测试目录、生成Allure结果文件,并清理之前的报告。用户可能还需要在main_run.py中编写一个运行脚本,自动执行测试并生成报告,可以选择直接打开Allure服务或者生成HTML报告。 最后,生成Allure报告,通过allure serve命令查看实时报告,或者生成静态报告供后续查看。同时,确保日志文件被正确保存,方便问题排查。 需要验证用户可能遇到的问题,比如环境变量配置是否正确,依赖库是否安装,YAML文件格式是否正确,以及Allure报告的生成路径是否有权限。用户可能还需要进一步的优化,比如添加异常处理、数据库校验、环境切换等功能,但当前需要先完成基础框架的搭建。 总结步骤,确保每个部分都清晰,并参考之前的引用内容,特别是用户提到的技术选型,确保答案符合他们的需求。同时,生成相关问题,帮助用户深入理解框架的扩展优化方法。</think>### 分步构建接口自动化测试框架 以下是整合Python、Requests、Pytest、AllureLogging的完整实现方案: --- #### **1. 项目结构规划** ```bash project_root/ ├── config/ # 配置文件 │ └── settings.yaml # 全局配置(如base_url) ├── data/ # 测试数据 │ └── test_cases.yaml # YAML格式接口用 ├── test_cases/ # 测试脚本 │ ├── conftest.py # Pytest夹具配置 │ └── test_api_demo.py # 测试用文件 ├── utils/ # 工具模块 │ ├── api_client.py # Requests封装类 │ └── logger_config.py # 日志配置 ├── logs/ # 日志文件 ├── reports/ # Allure报告 ├── requirements.txt # 依赖清单 └── main_run.py # 执行入口 ``` --- #### **2. 安装依赖** ```bash # requirements.txt 内容 requests==2.31.0 pytest==8.0.2 PyYAML==6.0.1 allure-pytest==2.13.5 python-dotenv==1.0.0 ``` 执行安装命令: ```bash pip install -r requirements.txt ``` --- #### **3. 配置文件示YAML)** `config/settings.yaml`: ```yaml base_url: "https://api.example.com" log: path: "./logs/api_test.log" level: "INFO" ``` --- #### **4. Requests封装与日志集成** `utils/api_client.py`: ```python import requests import logging from typing import Union class APIClient: def __init__(self, base_url: str): self.session = requests.Session() self.base_url = base_url self.logger = logging.getLogger(__name__) def _send_request(self, method: str, endpoint: str, **kwargs) -> requests.Response: url = f"{self.base_url}{endpoint}" self.logger.info(f"Sending {method} request to {url}") response = self.session.request(method, url, **kwargs) self.logger.debug(f"Response: {response.status_code} - {response.text[:200]}") return response def get(self, endpoint: str, params=None) -> requests.Response: return self._send_request('GET', endpoint, params=params) def post(self, endpoint: str, data: Union[dict, str] = None) -> requests.Response: return self._send_request('POST', endpoint, data=data) ``` --- #### **5. 测试用实现(Pytest参数化)** `test_cases/test_api_demo.py`: ```python import pytest import allure from utils.api_client import APIClient from utils.yaml_loader import load_test_cases # 需实现YAML读取工具 @allure.feature("用户管理接口") class TestUserAPI: @allure.story("用户登录") @allure.title("验证登录功能") @pytest.mark.parametrize("case", load_test_cases("login_cases.yaml")) def test_user_login(self, case): client = APIClient(case["base_url"]) response = client.post( endpoint=case["endpoint"], data=case["payload"] ) assert response.status_code == case["expected"]["status_code"] assert case["expected"]["message"] in response.json().get("msg", "") ``` --- #### **6. 日志配置实现** `utils/logger_config.py`: ```python import logging import os from datetime import datetime def setup_logger(log_path: str, level: str = "INFO"): if not os.path.exists(os.path.dirname(log_path)): os.makedirs(os.path.dirname(log_path)) formatter = logging.Formatter( "%(asctime)s - %(name)s - %(levelname)s - %(message)s" ) file_handler = logging.FileHandler( filename=log_path.replace(".log", f"_{datetime.now().strftime('%Y%m%d%H%M')}.log"), mode='a' ) file_handler.setFormatter(formatter) console_handler = logging.StreamHandler() console_handler.setFormatter(formatter) logger = logging.getLogger() logger.setLevel(level) logger.addHandler(file_handler) logger.addHandler(console_handler) ``` --- #### **7. 执行入口与Allure集成** `main_run.py`: ```python import pytest import os import shutil from utils.logger_config import setup_logger def run_tests(): # 清理历史报告 if os.path.exists("./reports"): shutil.rmtree("./reports") # 初始化日志 setup_logger("./logs/api_test.log", "DEBUG") # 执行测试并生成Allure结果 pytest.main([ "-v", "./test_cases", "--alluredir=./reports/allure_results", "--clean-alluredir" ]) # 生成HTML报告 os.system("allure generate ./reports/allure_results -o ./reports/html --clean") os.system("allure open ./reports/html") # 自动打开报告 if __name__ == "__main__": run_tests() ``` --- #### **8. 关键优化点** 1. **环境隔离**:通过`pytest-base-url`插件实现多环境切换 2. **数据驱动**:YAML文件中定义测试场景: ```yaml # data/login_cases.yaml - name: 正确密码登录 base_url: "{{BASE_URL}}" endpoint: "/login" method: POST payload: username: "admin" password: "correct_pwd" expected: status_code: 200 message: "登录成功" ``` 3. **异常处理**:在`APIClient`中添加重试机制超时控制 4. **Allure增强**:使用装饰器添加测试特征标记: ```python @allure.severity(allure.severity_level.CRITICAL) @allure.link(url="https://jira.example.com/ISSUE-123") ``` --- ### 验证与调试 1. 执行`python main_run.py`启动测试 2. 检查`./logs`目录下的日志文件 3. 查看`./reports/html`中的Allure交互式报告 4. 通过`pytest -k "test_user_login"`执行指定用 --- ### 常见问题解决方案 1. **Allure报告空白**:检查是否安装`allure-commandline`工具 2. **变量替换失败**:确保YAML中使用`{{variable}}`语法且变量已定义 3. **日志不输出**:检查文件路径权限日志级别设置 4. **依赖冲突**:使用`pip freeze > requirements.txt`生成精确版本控制 --- ### 进阶扩展方向 1. **Mock服务集成**:使用`responses`库模拟第三方接口 2. **数据库校验**:添加`SQLAlchemy`进行数据一致性验证 3. **性能监控**:集成`locust`实现接口压测 4. **CI/CD对接**:通过`Jenkinsfile`配置自动化流水线 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值