接口自动化框架搭建:python+yaml+request+pytest+allure,实现单接口自动化测试

python+yaml+request+pytest+allure,实现单接口自动化测试

之前的接口自动化中只用excel管理用例,但是用过yaml之后,恩,真香。


前言

框架思想:本框架是python+requests+yaml+pytest+allure实现接口自动化框架。结合数据驱动和分层思想,将代码与数据分离,易维护,易上手。使用yaml编写编写测试用例,利用requests库发送请求,使用pytest管理用例,allure生成测试报告。后续可能加上jenkins持续集成。


提示:以下是本篇文章正文内容,下面案例可供参考

一、数据驱动

什么是数据驱动?
在接口测试中,测试用例可能有上百条,如果将用例全部写在代码中,一旦需要修改,将会消耗大量的时间,不容易维护。所以,我们就要测试数据,或者测试用例存储到文件中,用代码读取文件获取数据,实现数据驱动。
数据驱动分为两种:
1、参数的数据驱动
2、用例的数据驱动
数据格式的选择:

excel 生成数据方便,但是是二进制文件,不利于版本管理
yaml 格式完备,格式简单
csv 可以使用excel编辑,文本格式方便管理
yaml 格式完备,格式简单,可注释
xml 格式完备,冗长复杂
json 格式完备,格式死板,不能写注释

以上总结,选择yaml管理测试用例

二、yaml基本语法

大小写敏感
使用缩进表示层级关系
缩进时不允许使用Tab键,只允许使用空格。
缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
yaml支持三种数据结构:
对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
纯量(scalars):单个的、不可再分的值

对象:animal: pets ,也可写成:hash: { name: Steve, foo: bar }
数组:

- Cat
- Dog
- Goldfish

也可写成:列表嵌套列表

-
 - Cat
 - Dog
 - Goldfish

字典与列表嵌套:

-
  id:login_02

三、读取yaml

yaml.load和safe_load()
两者区别:
safe_load()可以解析简单的数据结构,而且比较安全,load可以解析比较复杂的数据结构,通常一般使用的最多的还是load()

四、测试用例数据驱动

-
  id: login_01
  title: 登录成功
  url: member/login
  method: POST
  request_data: {
   
   "mobile_phone": "17866554324","pwd":"188888"}
  expect: {
   
   "code":0,"msg":"OK"}

读取yaml

    def read_yaml(self):
        with open(self.filename, encoding='utf-8') as fs:
            # 避免报警告:yaml.FullLoader
            data = yaml.load(fs, Loader=yaml.FullLoader)
            return data

五、参数化数据驱动

将测试用例部分数据进行参数化,比如用户名密码之类的数据。 然后将数据放入配置文件中
[case_data]
mobile_phone = 11111111111
pwd = 123456789

六.使用正在表达式替换参数化数据

<think>好的,用户想了解如何使用PytestYAML、Excel和Allure搭建接口自动化测试框架,并实现登录接口测试的数据驱动示例。我需要结合之前的引用内容,特别是用户提到的技术栈和已有的解决方案,来构建一个详细的回答。首先,用户提到的技术选型是Python+Requests+Pytest+YAML+Allure,还有Excel。之前的回答中已经涉及了YAML和Excel的数据驱动实现,所以现在需要整合这些内容,特别是登录接口的测试案例。用户需要数据驱动示例,这意味着需要展示如何用YAML和Excel来管理测试数据,并用Pytest来执行测试用例。同时,生成Allure报告也是关键点。可能需要分步骤讲解框架结构、数据驱动实现、登录接口测试示例以及报告生成。要注意之前回答中的代码示例,比如Excel数据加载器和YAML解析器,可能需要调整以适应登录接口的具体情况。例如,登录接口通常需要用户名和密码,这些可以从Excel或YAML中读取。另外,用户之前的问题涉及到如何处理Excel中的公式、热加载等问题,但当前问题更关注框架搭建和登录测试,所以可能需要先聚焦在核心实现上,再在相关问题中提及其他问题。 需要确保回答结构清晰,分步骤说明,并提供代码示例和文件结构。同时,要引用之前提到的引用内容,比如使用YAML管理测试数据,Pytest作为执行器,Allure生成报告等。 可能还需要考虑如何将Excel和YAML结合使用,比如在YAML中引用Excel数据,或者在Excel中管理多个测试用例的数据。数据驱动的关键点在于分离测试逻辑和数据,所以需要展示如何通过参数化来实现这一点。最后,生成相关问题时要涵盖用户可能遇到的后续问题,比如环境切换、参数关联、断言方法等,这些在之前的引用中也有提到,需要自然地引出。</think>### 基于Pytest+YAML+Excel+Allure接口自动化框架实现 #### 一、框架结构设计 ``` project/ ├── data/ # 数据驱动层 │ ├── login_data.xlsx # Excel测试数据 │ └── test_login.yml # YAML测试用例 ├── core/ # 核心逻辑层 │ ├── api_client.py # 接口请求封装 │ └── data_loader.py # 数据加载器 ├── tests/ # 测试用例层 │ └── test_login.py # Pytest测试用例 ├── conftest.py # Pytest全局配置 └── report_allure/ # Allure报告目录 ``` #### 二、登录接口数据驱动实现 1. **Excel数据存储设计**(login_data.xlsx) | test_id | username | password | expected_code | expected_msg | |---------|----------|----------|---------------|-----------------------| | case_01 | admin | 123456 | 200 | login success | | case_02 | test | wrong_pw | 401 | invalid credentials | 2. **YAML用例配置**(test_login.yml) ```yaml - test_id: case_01 request: url: /api/login method: POST headers: Content-Type: application/json json: username: ${EXCEL_DATA('login', 'case_01', 'username')} password: ${EXCEL_DATA('login', 'case_01', 'password')} validate: - eq: [status_code, ${expected_code}] - contains: [response.json().msg, ${expected_msg}] ``` 3. **核心代码实现** ```python # core/api_client.py import requests class APIClient: def __init__(self, base_url): self.session = requests.Session() self.base_url = base_url def request(self, method, endpoint, **kwargs): url = f"{self.base_url}{endpoint}" return self.session.request(method, url, **kwargs) ``` ```python # core/data_loader.py from openpyxl import load_workbook import yaml class DataLoader: def __init__(self): self.excel_data = {} def load_excel(self, file_path): """加载Excel测试数据""" wb = load_workbook(file_path) sheet = wb.active headers = [cell.value for cell in sheet[1]] for row in sheet.iter_rows(min_row=2): test_id = row[0].value self.excel_data[test_id] = { headers[i]: cell.value for i, cell in enumerate(row) } def load_yaml(self, file_path): """加载YAML测试用例""" with open(file_path) as f: return yaml.safe_load(f) ``` #### 三、Pytest测试用例实现 ```python # tests/test_login.py import pytest import allure @allure.feature("登录模块") class TestLogin: @pytest.mark.parametrize("case_data", loader.load_yaml('data/test_login.yml')) def test_login(self, case_data, api_client): """数据驱动测试示例""" with allure.step("准备测试数据"): test_id = case_data['test_id'] excel_data = loader.excel_data[test_id] with allure.step("发送登录请求"): response = api_client.request( method=case_data['request']['method'], endpoint=case_data['request']['url'], json=case_data['request']['json'] ) with allure.step("验证响应结果"): for validation in case_data['validate']: key, expected = validation['eq'] actual = eval(key) assert actual == eval(str(expected)), \ f"断言失败: {actual} != {expected}" ``` #### 四、Allure报告集成 执行命令配置: ```python # conftest.py import pytest import os def pytest_addoption(parser): parser.addoption("--env", action="store", default="test") @pytest.fixture(scope="session") def api_client(pytestconfig): env = pytestconfig.getoption("--env") base_urls = { "test": "https://test.api.com", "prod": "https://api.com" } return APIClient(base_urls[env]) ``` 执行脚本: ```bash pytest tests/ -s -v --alluredir=./results allure serve ./results ``` #### 五、数学建模示例 设接口响应时间$T$与并发数$N$满足: $$ T(N) = T_0 + \alpha N^{\beta} $$ 其中: - $T_0$为单请求基准时间 - $\alpha$为系统处理系数 - $\beta$为负载指数(通常$\beta \geq 1$) #### 六、数据驱动执行流程 ```mermaid graph TD A[读取YAML用例模板] --> B{解析数据占位符} B -->|提取Excel引用| C[加载Excel测试数据] C --> D[生成完整请求体] D --> E[发送接口请求] E --> F[执行断言验证] F --> G[生成Allure报告] ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姑娘别秃头

你的鼓励是为我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值