Pytest 实战:从零构建工程化自动化骨架
在 Web 自动化中,Selenium 负责「如何点」,而 Pytest 负责「如何组织」。一个成熟看自动化工程,必须具备灵活的数据驱动、清晰的环境隔离和工业级的报告。
一、 数据驱动 (DDT) —— @pytest.mark.parametrize
当测试逻辑相同,仅输入数据不同时(如验证 50 组异常账号),数据驱动是最高效的选择。
- 核心价值: 实现「脚本逻辑」与「测试数据」的彻底解耦。
- ids 妙用: 为每组数据命名,让 Allure 报告中的执行列表具备极高的可读性。
PYTHON
# 示例:账号边界值测试
@pytest.mark.parametrize('user, pwd, expected', [
('admin', '123456', '登录成功'),
('', '123456', '用户名不能为空'),
('admin', '', '密码不能为空'),
], ids=["Success_Case", "Invalid_User", "Invalid_Password"])
def test_login_scenario(user, pwd, expected):
# 关键字调用逻辑
# ...
assert actual_res == expected
二、 环境管理中枢 —— conftest.py 与 fixture
面对「每条用例都需要前置登录」这类需求,传统的 setUp/tearDown 显得力不从心。
1. fixture (夹具) 的作用域控制
- function (默认):函数级。适合临时清理或单个操作的数据预设。
- class:类级别。建议用于 UI 自动化中的浏览器启动/关闭,提高执行效率。
- session:项目级。最强实战:实现全局登录态共享。
2. conftest.py:共享配置的物理层
这是一个特殊的配置文件,Pytest 会自动向子目录递归搜索。它允许我们在不显式导入的情况下,在任何地方调用其中定义的 fixture。
PYTHON
# conftest.py
import pytest
from selenium import webdriver
@pytest.fixture(scope='session')
def driver():
# 前置:启动并配置浏览器
driver = webdriver.Chrome()
driver.implicitly_wait(5)
yield driver
# 后置:清理现场,关闭进程
driver.quit()
三、 生成工业级报告 —— Allure
Allure 是目前公认的最美观、信息最充实的开源测试报告工具。
- allure.feature / story:构建层级清晰的业务地图。
- allure.step:在代码中标记步骤,将脚本执行过程「语义化」。
- allure.attach:在关键环节(如断言失败)自动注入截图或日志。
PYTHON
@allure.feature("账户交易系统")
@allure.story("转账功能")
def test_transfer_money(driver):
with allure.step("1. 发起转账请求"):
# 操作代码...
with allure.step("2. 验证额度扣除"):
# 断言代码...
四、 工业级避坑:Failure vs Error
在分析报告时,务必区分两者的本质差异:
- Failure:业务断言失败。代码跑通了,但页面表现与预期不符(Bug 概率大)。
- Error:脚本运行崩溃。由于 NoSuchElementException、网络超时或代码逻辑错误导致(脚本维护概率大)。