Python 接口自动化测试框架:Pytest + Allure + YAML + Requests
Python 接口自动化测试框架:Pytest + Allure + YAML + Requests
本指南将带您构建一个基于 Python 的接口自动化测试框架,涵盖 Pytest 用于测试执行、Allure 生成美观报告、YAML 用于管理配置和接口定义、Requests 用于发送 HTTP 请求。
1. 安装依赖库
使用以下命令安装必要的库:
pip install pytest
pip install allure-pytest
pip install pyyaml
pip install requests
2. 创建 conftest.py 文件
conftest.py 文件用于存放测试用例的公共方法和配置信息。
import pytest
import yaml
import requests
@pytest.fixture(scope='session')
def config():
with open('config.yaml', 'r') as f:
config = yaml.safe_load(f)
return config
@pytest.fixture(scope='session')
def api():
with open('api.yaml', 'r') as f:
api = yaml.safe_load(f)
return api
@pytest.fixture(scope='session')
def session():
session = requests.Session()
return session
@pytest.fixture(scope='session')
def headers(api):
headers = api['headers']
return headers
def api_request(session, method, url, headers=None, params=None, data=None, json=None):
response = session.request(method=method, url=url, headers=headers, params=params, data=data, json=json)
return response
def api_get(session, url, headers=None, params=None):
response = api_request(session=session, method='GET', url=url, headers=headers, params=params)
return response
def api_post(session, url, headers=None, data=None, json=None):
response = api_request(session=session, method='POST', url=url, headers=headers, data=data, json=json)
return response
解释:
config:读取config.yaml文件,包含基础配置信息,例如接口地址、用户名、密码等。api:读取api.yaml文件,包含接口定义,例如接口地址、请求方法、请求头等。session:创建requests.Session对象,用于管理 HTTP 请求会话。headers:从api中获取默认请求头信息。api_request:通用请求方法,支持各种 HTTP 方法,并返回响应对象。api_get:简化 GET 请求的调用。api_post:简化 POST 请求的调用。
3. 创建 config.yaml 文件
base_url: 'https://api.example.com'
username: 'admin'
password: '123456'
4. 创建 api.yaml 文件
headers:
Content-Type: 'application/json'
Authorization: 'Bearer xxxxxxxx'
users:
- name: 'get_user'
url: '/users/{user_id}'
method: 'GET'
- name: 'create_user'
url: '/users'
method: 'POST'
- name: 'update_user'
url: '/users/{user_id}'
method: 'PUT'
- name: 'delete_user'
url: '/users/{user_id}'
method: 'DELETE'
5. 创建测试用例文件(例如:test_users.py)
import allure
from conftest import *
@allure.feature('用户管理')
class TestUsers:
@allure.story('获取用户信息')
@pytest.mark.parametrize('user_id', [1, 2, 3])
def test_get_user(self, session, headers, api, user_id):
url = config['base_url'] + api['users'][0]['url'].format(user_id=user_id)
response = api_get(session=session, url=url, headers=headers)
assert response.status_code == 200
assert response.json()['user_id'] == user_id
@allure.story('创建用户')
def test_create_user(self, session, headers, api):
url = config['base_url'] + api['users'][1]['url']
data = {
'username': 'test_user',
'password': '123456'
}
response = api_post(session=session, url=url, headers=headers, json=data)
assert response.status_code == 200
assert response.json()['username'] == 'test_user'
@allure.story('更新用户信息')
@pytest.mark.parametrize('user_id', [1, 2, 3])
def test_update_user(self, session, headers, api, user_id):
url = config['base_url'] + api['users'][2]['url'].format(user_id=user_id)
data = {
'email': 'test_user@example.com'
}
response = api_post(session=session, url=url, headers=headers, json=data)
assert response.status_code == 200
assert response.json()['email'] == 'test_user@example.com'
@allure.story('删除用户')
@pytest.mark.parametrize('user_id', [1, 2, 3])
def test_delete_user(self, session, headers, api, user_id):
url = config['base_url'] + api['users'][3]['url'].format(user_id=user_id)
response = api_post(session=session, url=url, headers=headers)
assert response.status_code == 200
解释:
- 使用
allure.feature和allure.story装饰器为测试用例添加 Allure 标签,用于生成更清晰的报告。 pytest.mark.parametrize用于参数化测试用例,提高测试效率。- 使用
api_get和api_post发送请求,并使用assert语句进行断言,确保预期结果。
6. 运行测试并生成报告
pytest --alluredir=./report
allure serve ./report
解释:
pytest --alluredir=./report:运行测试用例,并将结果保存到./report目录。allure serve ./report:启动 Allure 报告服务,在浏览器中查看测试报告。
总结
本指南展示了如何使用 Python + Pytest + Allure + YAML + Requests 构建一个接口自动化测试框架。该框架可以帮助您:
- 组织和管理测试用例。
- 简化请求发送和响应验证。
- 生成清晰、可读的测试报告。
- 提高测试效率和代码可维护性。
请根据您的实际需求进行调整和扩展。
原文地址: https://www.cveoy.top/t/topic/lfkH 著作权归作者所有。请勿转载和采集!