Pytest 完整使用教程

一、框架简介https://docs.pytest.org/en/latest/getting-started.html

pytest 是 Python 主流自动化测试框架,简洁易用、功能强大,支持单元测试、接口测试、桌面 UI 自动化测试,兼容原生 unittest 测试用例,自带丰富断言、夹具、参数化、用例分组、失败重跑、多线程执行,支持生成多种可视化测试报告,企业项目通用,离线环境可正常部署使用。

核心优势

  1. 无强制编写格式,普通函数即可编写测试用例

  2. 自动扫描识别测试文件与测试函数,无需手动管理执行入口

  3. 内置强大断言机制,报错信息清晰直观

  4. 支持前置后置夹具,实现数据复用、业务依赖流程

  5. 插件生态丰富,可扩展各类测试需求

  6. 纯本地运行,无网络也可完整执行测试流程

二、安装方式

1. 在线联网安装

bash 复制代码
pip install pytest

2. 离线无网络安装(重点)

  1. 找一台可以联网的电脑,下载 pytest 及所有依赖包
bash 复制代码
pip download pytest -d pytest_packages
  1. pytest\_packages 整个文件夹拷贝至离线电脑

  2. 进入文件夹所在目录,执行离线安装命令

bash 复制代码
pip install --no-index --find-links=pytest_packages pytest

3. 环境验证

打开终端输入命令,输出版本号即安装成功

bash 复制代码
pytest --version

三、pytest 强制命名规则(必须遵守)

只有符合命名规范,框架才能自动识别并执行测试用例

  1. 测试脚本文件:test\_xxx\.py 开头 或 xxx\_test\.py 结尾

  2. 测试类:类名必须以 Test 开头

  3. 测试函数 / 测试方法:函数名必须以 test\_ 开头

  4. 测试类禁止定义 \_\_init\_\_ 构造方法

四、编写第一个基础测试用例

新建文件 test\_first\_demo\.py

python 复制代码
# 普通函数式测试用例(推荐)
def test_calc_add():
    """加法测试用例"""
    num1 = 20
    num2 = 30
    assert num1 + num2 == 50

def test_calc_sub():
    """减法测试用例"""
    assert 100 - 20 == 80

# 类形式测试用例
class TestCalc:
    def test_calc_mul(self):
        assert 6 * 8 == 48

五、常用运行命令

1. 基础运行

bash 复制代码
# 运行当前目录下所有符合规则的测试用例
pytest

# 运行指定单个测试文件
pytest test_first_demo.py

# 运行文件内指定单个测试函数
pytest test_first_demo.py::test_calc_add

# 运行测试类内指定测试方法
pytest test_first_demo.py::TestCalc::test_calc_mul

2. 常用执行参数

bash 复制代码
# -v 详细打印用例执行信息
pytest -v

# -s 打印代码内print输出内容
pytest -s

# -vs 组合使用,最常用
pytest -vs

# -x 执行失败立刻停止运行
pytest -x

# --lf 只执行上一次运行失败的用例
pytest --lf

# --durations=0 统计所有用例执行耗时
pytest --durations=0

3. 多线程并行执行(提升运行速度)

离线提前安装插件

bash 复制代码
pip install pytest-xdist
# 离线方式同上,下载包本地安装

执行命令

bash 复制代码
pytest -vs -n auto

六、pytest 断言用法

1. 常规通用断言

python 复制代码
def test_assert_base():
    assert 1 == 1
    assert "测试" in "自动化测试"
    assert 90 > 50
    assert None is None
    assert [] != [1,2]
    assert bool(1) is True

2. 异常捕获断言

用于测试代码抛出指定异常场景

python 复制代码
import pytest

def test_zero_error():
    # 断言代码执行抛出除零异常
    with pytest.raises(ZeroDivisionError):
        10 / 0

七、Fixture 夹具(核心重点)

作用:实现用例前置初始化、后置数据清理、全局数据共享、业务流程依赖,替代传统 setup/teardown

1. 基础夹具(前置 + 后置)

python 复制代码
import pytest

# 定义夹具
@pytest.fixture()
def init_env():
    # 用例执行前执行
    print("测试环境初始化完成")
    yield
    # 用例执行结束后执行
    print("测试环境数据清理完成")

# 测试用例调用夹具
def test_case_01(init_env):
    print("正式执行第一条测试用例")

2. 夹具返回测试数据

python 复制代码
@pytest.fixture()
def get_login_data():
    # 封装账号密码数据
    username = "admin"
    password = "123456"
    return username, password

# 接收夹具返回数据
def test_login(get_login_data):
    user, pwd = get_login_data
    print(f"登录账号:{user},登录密码:{pwd}")

3. 全局公共夹具

项目根目录新建固定文件 conftest\.py

特点:无需手动导入,项目所有测试文件自动调用

python 复制代码
import pytest

# session级别:整个项目运行只执行一次
@pytest.fixture(scope="session")
def global_login_token():
    print("全局前置:执行登录,获取token")
    token = "test_token_123654"
    yield token
    print("全局后置:退出登录,关闭接口连接")

4. 夹具作用域优先级

  1. function 默认级别:每一条测试用例执行一次

  2. class 级别:每一个测试类执行一次

  3. module 级别:每一个 py 测试文件执行一次

  4. session 级别:整个测试项目全程只执行一次(登录场景首选)

八、参数化测试

批量传入多组测试数据,一键执行多场景用例,减少重复代码

python 复制代码
import pytest

# 格式:@pytest.mark.parametrize("参数名", 数据列表)
@pytest.mark.parametrize("num1,num2,result",[(1,2,3),(10,5,15),(20,30,50)])
def test_param_calc(num1,num2,result):
    assert num1 + num2 == result

九、测试用例分组执行

1. 给用例打自定义标签

python 复制代码
import pytest

# 冒烟测试标签
@pytest.mark.smoke
def test_smoke_case():
    assert 1 == 1

# 功能测试标签
@pytest.mark.function
def test_func_case():
    assert 2 == 2

2. 配置标签(消除运行警告)

项目根目录新建 pytest\.ini 配置文件

ini 复制代码
[pytest]
markers =
    smoke: 冒烟测试用例
    function: 业务功能测试用例

3. 按标签筛选执行

bash 复制代码
# 只执行冒烟测试用例
pytest -vs -m smoke

# 只执行功能测试用例
pytest -vs -m function

十、跳过测试用例

1. 强制跳过用例

python 复制代码
import pytest

@pytest.mark.skip(reason="该用例暂未开发完成,暂时跳过")
def test_skip_demo():
    pass

2. 条件跳过用例

根据系统、版本、环境自动判断是否跳过

python 复制代码
import sys
import pytest

@pytest.mark.skipif(sys.platform == "win32", reason="Windows系统跳过此用例")
def test_system_limit():
    pass

十一、失败用例自动重跑

1. 离线安装插件

bash 复制代码
pip install pytest-rerunfailures

2. 执行重跑命令

bash 复制代码
# 运行失败用例自动重跑3次
pytest -vs --reruns 3

十二、生成自动化测试报告

1. 简易 HTML 测试报告

安装插件

bash 复制代码
pip install pytest-html

生成报告命令

bash 复制代码
pytest -vs --html=测试报告.html

2. 企业级 Allure 精美测试报告

  1. 安装依赖
bash 复制代码
pip install allure-pytest
  1. 收集测试运行数据
bash 复制代码
pytest -vs --alluredir=allure_report_data
  1. 本地生成并打开可视化报告
bash 复制代码
allure serve allure_report_data

十三、企业标准项目目录结构

Plain 复制代码
autotest_project/
├── conftest.py        # 全局公共夹具
├── pytest.ini         # pytest全局配置文件
├── testcases/         # 所有测试用例存放目录
│   ├── test_login.py
│   ├── test_order.py
│   └── test_user.py
├── test_data/         # 测试数据存放目录
├── logs/              # 运行日志目录
└── reports/           # 所有测试报告存放目录

十四、离线项目实战常用场景

  1. 接口自动化:pytest + requests 组合,批量调用业务接口

  2. 桌面 UI 自动化:pytest + pywinauto 管理桌面控件操作用例

  3. 流程依赖测试:全局夹具完成登录获取 token,下游业务用例直接调用

  4. 批量回归测试:一键执行全量用例,本地生成报告留存

  5. 无网络调试:本地编写用例、调试断言、整理测试流程

十五、常见问题解决

  1. 测试用例不执行:检查文件命名、函数命名是否以 test_开头

  2. 全局夹具无法调用:确认 [conftest.py](conftest.py) 放在项目根目录

  3. 控制台中文乱码:在 pytest.ini 中添加编码配置

  4. 插件无法使用:离线下载对应 whl 包本地手动安装

  5. 夹具数据无法传递:确认夹具返回值与用例接收参数一致


保存方式

  1. 全选上面所有文字 → 复制

  2. 桌面右键新建 文本文档 (.txt) / 新建 Word 文档

  3. 粘贴内容 → 保存,离线随时打开查阅使用

相关推荐
SWAGGY..2 小时前
Linux系统编程:(六)编译器gcc/g++
linux·运维·服务器
蜡笔婧萱2 小时前
Linux——Web服务器网址建立(http和https的分离)
linux·运维·服务器
wzl202612133 小时前
基于企销宝定时群发接口的私域自动化触达系统设计与实现
运维·自动化
闲适达人4 小时前
nginx传递url的获取方案
java·服务器·前端
IT大白鼠4 小时前
Linux故障分析与排查:系统日志、启动故障与文件系统修复
linux·运维·服务器
老詹图解IT4 小时前
统信 UOS 登录界面转圈闪退/卡登录等常见原因及处理
linux·服务器·网络
视***间4 小时前
算力为核,智驱无界——视程空间硬核赋能机器狗与机器人,解锁具身智能产业新未来
大数据·运维·人工智能·机器人·采集卡·机器狗·视程空间
Yang96114 小时前
交通一线运维优选:Smart-S3 多模光时域反射仪
运维
sbjdhjd4 小时前
02 (中)| K8s Pod 生产化落地:从配置到优化全流程
linux·运维·云原生·kubernetes·开源·podman·kubelet