编写pytest + selenium的接口自动化脚本格式
参考资料:https://www.byhy.net/auto/pyatframework/pytest-01/
接口脚本模版:

UI测试用例模版
快速生成自动化测试用例的实践指南
一、环境准备
-
安装依赖库
pip install pytest requests selenium webdriver-manager allure-pytest
-
Allure 环境配置
- 下载 Allure 命令行工具
- 添加 Allure 的
bin
目录到系统环境变量。
二、项目结构规划
project/
├── api/ # 接口封装模块
│ ├── config.py # 环境配置
│ └── urls.py # 接口 URL 管理
├── tests/ # 测试用例模块
│ ├── conftest.py # 全局 Fixture
│ ├── test_api/ # API 测试
│ └── test_ui/ # UI 测试
├── requirements.txt # 依赖库清单
└── pytest.ini # Pytest 配置
三、快速生成用例的步骤
1. 解析接口文档,封装接口
-
根据接口文档提取关键信息:
- 请求方法(GET/POST/PUT/DELETE)
- URL 路径(如
/api/login
) - 请求参数(必填项、类型、取值范围)
- 响应结构(状态码、字段定义)
-
封装到
api/urls.py
:# api/urls.py from .config import EnvConfigclass MerchantUrls:@propertydef login(self):return f"{EnvConfig.BASE_URL}/api/login"def get_user_info(self, user_id):return f"{EnvConfig.BASE_URL}/users/{user_id}"
2. 编写数据工厂(Data Factory)
-
动态生成测试数据:
# tests/data_factory.py from faker import Fakerfake = Faker('zh_CN')class TestData:@staticmethoddef generate_user():return {"username": fake.user_name(),"phone": fake.phone_number(),"password": fake.password()}
-
参数化测试用例:
# tests/test_api/test_login.py import pytest @pytest.mark.parametrize("username, password", [("admin", "valid_password"),("", "invalid_password"), # 空用户名("admin", "") # 空密码 ]) def test_login(username, password):# 调用接口并断言
3. 实现基础 Fixture
-
全局 Token 管理:
# tests/conftest.py @pytest.fixture(scope="session") def auth_token():response = requests.post(MerchantUrls().login, json=VALID_CREDENTIALS)return response.json()["token"]
-
浏览器驱动管理(UI 测试):
# tests/conftest.py @pytest.fixture def browser():driver = webdriver.Chrome()yield driverdriver.quit()
4. 编写测试用例模板
-
API 测试用例模板:
# tests/test_api/test_user.py def test_get_user_info(auth_token):headers = {"Authorization": f"Bearer {auth_token}"}response = requests.get(MerchantUrls().get_user_info(1), headers=headers)assert response.status_code == 200assert "id" in response.json()
-
UI 测试用例模板(POM 模式):
# tests/test_ui/pages/login_page.py class LoginPage:def login(self, username, password):self.driver.find_element(By.ID, "username").send_keys(username)self.driver.find_element(By.ID, "password").send_keys(password)self.driver.find_element(By.ID, "login-btn").click()# tests/test_ui/test_login.py def test_ui_login(browser):login_page = LoginPage(browser)login_page.login("admin", "password")assert "dashboard" in browser.current_url
5. 集成 Allure 报告
-
添加 Allure 注解:
@allure.epic("用户管理") @allure.feature("登录功能") @allure.story("成功登录") def test_login_success():with allure.step("输入用户名密码"):# 操作步骤with allure.step("点击登录按钮"):# 操作步骤
-
生成并查看报告:
pytest --alluredir=./reports # 生成报告数据 allure serve ./reports # 启动本地报告服务
四、效率提升技巧
-
使用模板引擎
- 通过
Jinja2
或Cookiecutter
生成基础代码,减少重复编写。
- 通过
-
Excel/YAML 数据驱动
# 从 Excel 读取测试数据 import pandas as pd test_data = pd.read_excel("test_cases.xlsx").to_dict("records")@pytest.mark.parametrize("data", test_data) def test_api(data):requests.post(url, json=data)
-
接口自动化工具集成
- 使用
Postman
导出用例为JSON
,通过脚本转换为pytest
用例。
- 使用
-
代码片段复用
- 将常用操作封装为函数(如数据库清理、文件上传)。
五、常见问题解决
-
依赖接口的测试用例
- 方案:使用
pytest-dependency
标记用例依赖关系。
@pytest.mark.dependency(name="login") def test_login():pass@pytest.mark.dependency(depends=["login"]) def test_user_info():pass
- 方案:使用
-
环境切换问题
- 方案:通过环境变量动态加载配置。
ENV=prod pytest tests/ # 运行生产环境测试
-
测试数据清理
- 方案:在
fixture
中实现后置清理逻辑。
@pytest.fixture def temp_user(api_client):user_id = api_client.create_user()yield user_idapi_client.delete_user(user_id)
- 方案:在
六、总结
通过以下步骤可快速生成自动化测试用例:
- 解析文档 → 2. 封装接口 → 3. 数据驱动 → 4. 模板化用例 → 5. 集成报告
关键点:
- 模块化设计(API/UI 分离)
- 数据工厂动态生成参数
- 利用 Allure 增强报告可读性
- 使用 Fixture 管理依赖和资源
扩展方向:
- 集成 CI/CD(如 Jenkins、GitHub Actions)
- 添加性能测试(Locust)
- 实现智能断言(JSON Schema 校验)