是什么:Python 最流行的单元测试框架之一,支持复杂的功能测试和插件扩展。
优点:
语法简洁(用 assert
替代 self.assertEqual
)。
自动发现测试用例。
丰富的插件生态(如失败重试、并发执行、报告生成)。
兼容unittest框架,比自带unittest框架更加简洁高效,在unittest框架迁移到pytest框架时不需要重写代码。
适用场景:单元测试、接口测试、UI 自动化测试。
bash
复制
pip install pytest
pip show pytest
bash
复制
pip install pytest-html # HTML 报告
pip install pytest-xdist # 并发执行
pip install pytest-rerunfailures # 失败重试
pip install allure-pytest # Allure 报告集成
文件命名:以 test_
开头或结尾(如 test_login.py
或 login_test.py
)。
函数/类命名:
测试函数:以 test_
开头(如 test_login_success
)。
测试类:以 Test
开头(如 TestLogin
),且类中不能有 __init__
方法。
断言:直接使用 assert
(如 assert response.status_code == 200
)。
setup_module和teardown_module,在整个测试用例文件中所有方法运行前后,仅运行1次
setup_class和teardown_class,在一个Class中所有用例前后运行1次
setup_method和teardown_method,在Class下的每个方法前后运行
setup_function和teardown_function,在非Class下的每个方法前后运行
python
复制
# 测试函数
def test_add():
assert 1 + 1 == 2
# 测试类
class TestMath:
def test_multiply(self):
assert 2 * 3 == 6
默认顺序:按文件名和测试函数/方法的 ASCII 码顺序执行。
自定义顺序:
使用 pytest-ordering
插件:
python
复制
@pytest.mark.run(order=1)
def test_login():
pass
使用插件:pytest-rerunfailures
命令行参数:
bash
复制
pytest --reruns 3 --reruns-delay 2 # 失败后重试3次,间隔2秒
使用插件:pytest-xdist
命令行参数:
bash
复制
pytest -n 4 # 启动4个进程并发执行
无条件跳过:
python
复制
@pytest.mark.skip(reason="功能未实现")
def test_unimplemented():
pass
条件跳过:
python
复制
@pytest.mark.skipif(sys.platform == "win32", reason="Windows 不支持")
def test_linux_only():
pass
结合 pytest.mark.skipif
或自定义条件逻辑:
python
复制
def test_feature():
if not has_feature():
pytest.skip("环境不支持此功能")
# 正常测试逻辑
fixture(scope='function', params=None, autouse=False, ids=None, name=None)
"function": 在conftest作用域下,每一个test开头的测试方法运行前都会执行一次
"class": 在conftest作用域下,每一个Test开头的测试类运行前都会执行一次
"module": 在conftest作用域下,每一个test开头的测试模块运行前都会执行一次
"session": 在conftest作用域下,这个包运行前只会执行一次
fixture的使用方法:
@pytest.mark.usefixtures('function_name')
直接在对应的接口函数里,加入一个形参,参数名就是fixture函数名
添加mark标签,可筛选出对应业务模块的部分接口:
@pytest.mark.标签名
pytestmark = pytest.mark.标签名
执行时可根据标签名来执行想要的用例,例如,运行所有标记为login的测试:
pytest -m login
其他运行参数:
核心装饰器:@pytest.mark.parametrize
示例:
python
复制
@pytest.mark.parametrize("a, b, expected", [
(1, 2, 3),
(0, 0, 0),
(-1, 1, 0),
])
def test_add(a, b, expected):
assert a + b == expected
常用插件:
pytest-html
:生成 HTML 测试报告。
pytest-cov
:生成代码覆盖率报告。
pytest-mock
:集成 Mock 功能。
pytest-django
:Django 项目测试支持。
bash
复制
# 安装插件
pip install pytest-html
# 执行并生成 HTML 报告
pytest --html=report.html
安装 Allure 命令行工具(需 Java 环境):
下载allure.zip
解压allure.zip到一个文件目录中
把解压路径添加到环境变量Path中
pip isntall pytest-allure
验证安装完成
方法一
执行pytest单元测试,生成Allure报告需要的数据存在的目录
pytest -sq --alluredir = ../report/tmp
执行命令生成测试报告
allure generate ../report/tmp -o ../report/report --clean
方法二
生成 Allure 结果数据:
bash
复制
pytest --alluredir=./allure-results
生成可视化报告:
bash
复制
allure serve ./allure-results # 本地查看
allure generate ./allure-results -o ./report --clean # 生成静态报告
简单文本报告:
bash
复制
pytest -v # 输出详细结果
HTML 报告:
bash
复制
pytest --html=report.html
Allure 报告(需集成):
bash
复制
pytest --alluredir=./results && allure serve ./results
核心优势:简洁语法 + 插件生态 + 高度可定制化。
最佳实践:
使用参数化减少重复代码。
结合 CI/CD(如 Jenkins、GitHub Actions)自动化测试。
通过 Allure 或 HTML 报告直观分析结果。