Python 零基础测开学习 12——pytest_进阶控制

EternalRights · 2025年11月14日 · 53 次阅读

前言

        pytest 的配置非常灵活,支持配置文件和命令行参数来定制测试行为

        若没有 pytest 基础,请点击前往:零基础测开学习 10——pytest_基础

        若已有 pytest 基础,但不了解 fixture,请点击前往:零基础测开学习 11——pytest_fixture


配置

创建与验证:

1.创建文件:

在你的项目根目录下(通常是与 src、tests 文件夹同级的位置),新建一个名为 pytest.ini 的文本文件。文件名必须是这个,不能更改。

2.基本配置示例:

你可以先从一个简单的配置开始。以下是一个最常见的示例,它设置了默认的详细输出、自动注册一些标记,并指定测试文件的位置。

[pytest]
# 默认命令行选项,-v: 详细输出 -s: 打印print信息
addopts = -v -s

# 注册自定义标记,避免使用未注册标记时出现警告
markers =
    smoke: 冒烟测试
    slow: 运行缓慢的测试

# 指定测试用例的搜索目录
testpaths = tests

3.验证配置是否生效:

创建并保存 pytest.ini 文件后,你可以在项目根目录下打开终端(命令行),运行以下命令来验证:

pytest -v

如果配置成功,可以在命令行输出内容中看到:configfile: pytest.ini

配置文件介绍

adopts

在此处添加的命令行参数,会在 pytest 每次执行时自动生效

  • -v/--verbose:输出更详细的信息

  • -s:允许测试中的所有输出打印到控制台

  • -k<表达式>:通过表达式筛选测试用例(如-k"test_login and not slow")

  • -m<标记表达式>:运行指定标记的测试(如-m smoke)

markers

用于注册自定义标记,防止 pytest 发出 “未知标记” 的警告。这是使用自定义标记前的必要步骤。

testpaths

指定测试用例的搜索目录


标记

简介

标记是 pytest 的强大核心功能之一,用于对测试进行分类、筛选和控制执行行为。

用户自定义标记

简介

你可以创建自己的标记来对测试用例进行分类,例如标记冒烟测试、集成测试等。

使用步骤

1.在 pytest.ini 中注册标记
2.在测试函数/类上使用你的标记 pytest.mark.你的标记
3.运行时使用 pytest -m "你的标记"来执行

标记表达式

支持使用 and,or,not 进行复杂筛选,例如:pytest -m “smoke and not slow”

框架内置标记

pytest 提供了一些开箱即用的标记。

数据驱动测试

数据驱动测试将数据逻辑与数据测试分离,使用多组数据执行相同的测试逻辑,能显著提高测试覆盖率和代码复用性。pytest 主要使用@pytest.mark.parametrize 装饰器实现。

基本用法:

@pytest.mark.parametrize 允许你为测试函数提供多组参数。

import pytest
@user7ize("input, expected", [
    (1, 2),
    (2, 3),
    (3, 4),
])
def test_increment(input, expected):
    assert input + 1 == expected

上述测试会独立运行三次

结合外部数据文件:

对于大量或复杂的测试数据,可以从外部文件中加载。

  • CSV:使用 Python 内置的 CSV 模块读取,适合表格型数据
  • JSON:使用 json 模块读取,适合结构化、嵌套的数据
  • Excel:需安装 openpyxl 等库,适合业务人员维护数据的场景

与 fixture 结合:

通过设置 indirect = True,可以将参数化的值传递给 fixture,实现更复杂的测试数据搭建和环境准备。

示例:

import pytest

# 定义一个接收参数的fixture
@pytest.fixture
def user_login(request):
    """根据参数化数据准备用户登录环境"""
    username = request.param  # 通过request.param获取参数值
    print(f"\n登录用户: {username}")

    # 这里可以执行一些预处理,如准备测试数据
    user_data = prepare_user_data(username)

    yield user_data  # 返回用户数据给测试用例

    # 测试后清理(可选)
    cleanup_user_data(username)

# 参数化数据
usernames = ['admin_user', 'regular_user', 'guest_user']

# indirect=True 表示参数先传递给fixture处理
@user9ize('user_login', usernames, indirect=True)
def test_user_permissions(user_login):
    """测试不同用户的权限"""
    print(f"测试用户权限: {user_login}")
    # 根据user_login测试用户权限
    assert check_permissions(user_login) == expected_permissions

后记

        这篇干货有点多,记得喝水,别噎着。

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册