Sparkle CodesSparkle
项目 / web测试 / Day11

Web 自动化实战:Pytest 核心机制与数据驱动

x
xpx
Jun 22, 2024
Editorial Insight
#Automation#DDT#Pytest

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、网络超时或代码逻辑错误导致(脚本维护概率大)。

继续进阶: Pytest 进阶-利用 Hooks 与 Allure 自动化构建故障证据链

BACK TO BLOG
The End of Interaction