一、框架简介https://docs.pytest.org/en/latest/getting-started.html
pytest 是 Python 主流自动化测试框架,简洁易用、功能强大,支持单元测试、接口测试、桌面 UI 自动化测试,兼容原生 unittest 测试用例,自带丰富断言、夹具、参数化、用例分组、失败重跑、多线程执行,支持生成多种可视化测试报告,企业项目通用,离线环境可正常部署使用。
核心优势
-
无强制编写格式,普通函数即可编写测试用例
-
自动扫描识别测试文件与测试函数,无需手动管理执行入口
-
内置强大断言机制,报错信息清晰直观
-
支持前置后置夹具,实现数据复用、业务依赖流程
-
插件生态丰富,可扩展各类测试需求
-
纯本地运行,无网络也可完整执行测试流程
二、安装方式
1. 在线联网安装
bash
pip install pytest
2. 离线无网络安装(重点)
- 找一台可以联网的电脑,下载 pytest 及所有依赖包
bash
pip download pytest -d pytest_packages
-
将
pytest\_packages整个文件夹拷贝至离线电脑 -
进入文件夹所在目录,执行离线安装命令
bash
pip install --no-index --find-links=pytest_packages pytest
3. 环境验证
打开终端输入命令,输出版本号即安装成功
bash
pytest --version
三、pytest 强制命名规则(必须遵守)
只有符合命名规范,框架才能自动识别并执行测试用例
-
测试脚本文件:
test\_xxx\.py开头 或xxx\_test\.py结尾 -
测试类:类名必须以
Test开头 -
测试函数 / 测试方法:函数名必须以
test\_开头 -
测试类禁止定义
\_\_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. 夹具作用域优先级
-
function默认级别:每一条测试用例执行一次 -
class级别:每一个测试类执行一次 -
module级别:每一个 py 测试文件执行一次 -
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 精美测试报告
- 安装依赖
bash
pip install allure-pytest
- 收集测试运行数据
bash
pytest -vs --alluredir=allure_report_data
- 本地生成并打开可视化报告
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/ # 所有测试报告存放目录
十四、离线项目实战常用场景
-
接口自动化:pytest + requests 组合,批量调用业务接口
-
桌面 UI 自动化:pytest + pywinauto 管理桌面控件操作用例
-
流程依赖测试:全局夹具完成登录获取 token,下游业务用例直接调用
-
批量回归测试:一键执行全量用例,本地生成报告留存
-
无网络调试:本地编写用例、调试断言、整理测试流程
十五、常见问题解决
-
测试用例不执行:检查文件命名、函数命名是否以 test_开头
-
全局夹具无法调用:确认 [conftest.py](conftest.py) 放在项目根目录
-
控制台中文乱码:在 pytest.ini 中添加编码配置
-
插件无法使用:离线下载对应 whl 包本地手动安装
-
夹具数据无法传递:确认夹具返回值与用例接收参数一致
保存方式
-
全选上面所有文字 → 复制
-
桌面右键新建 文本文档 (.txt) / 新建 Word 文档
-
粘贴内容 → 保存,离线随时打开查阅使用