Pytest作为Python生态中最流行的测试框架之一,以其简洁灵活的特性广受开发者欢迎。本指南将为你提供Pytest的快速入门技巧、系统学习计划以及优质文档参考,帮助你高效掌握这一强大工具。
Pytest相比Python自带的unittest框架具有显著优势,这也是它成为Python测试领域事实标准的原因:
Python测试框架"鄙视链":pytest > unittest > robotframework > 记流水账 > "hello world"小白
pip install -U pytest
验证安装:
pytest --version
Settings > Tools > Python Integrated Tools
Default test runner
设置为 pytest
官方推荐使用venv作为Python解释器,通过pip安装相关依赖,保证与系统Python环境隔离
python -m venv .venv
source .venv/bin/activate # Linux/Mac
.venv\Scripts\activate # Windows
pip install pytest
Pytest通过以下规则自动发现测试用例:
test_
开头或 _test.py
结尾Test
开头,且不能有 __init__
方法test_
开头test_
开头示例:
# test_sample.py
def func(x):
return x + 1
def test_answer():
assert func(3) == 5 # 这个断言会失败
运行测试:
pytest test_sample.py
Pytest提供了丰富的命令行选项来控制测试执行:
-v
:显示详细输出-s
:打印所有输出(如print语句)-k
:按名称匹配测试用例(如 pytest -k "test_add"
)-m
:运行标记的测试(如 pytest -m smoke
)-x
:遇到第一个失败时停止--maxfail=n
:n次失败后停止--lf
:仅运行上次失败的测试--ff
:先运行上次失败的测试,再运行其余的使用@pytest.mark.parametrize
实现数据驱动测试:
import pytest
@pytest.mark.parametrize("a,b,expected", [
(1, 1, 2),
(2, 3, 5),
(5, 5, 10),
])
def test_addition(a, b, expected):
assert a + b == expected
Fixture是Pytest的核心功能之一,用于测试前后的准备和清理工作:
import pytest
@pytest.fixture
def db_connection():
# 测试前建立数据库连接
conn = create_db_connection()
yield conn # 提供连接给测试用例
# 测试后关闭连接
conn.close()
def test_query(db_connection):
result = db_connection.execute("SELECT 1")
assert result == 1
Fixture作用域:
function
:默认,每个测试函数执行一次class
:每个测试类执行一次module
:每个模块执行一次package
:每个包执行一次session
:每次会话执行一次import pytest
@pytest.mark.skip(reason="尚未实现")
def test_not_implemented():
assert False
@pytest.mark.skipif(sys.version_info < (3, 7),
reason="需要Python 3.7或更高版本")
def test_python37_feature():
assert True
@pytest.mark.xfail
def test_expected_failure():
assert False # 预期会失败
基于搜索结果并优化后的系统学习计划:
测试用例未被发现:
__init__.py
文件pytest --collect-only
查看发现的测试用例Fixture未生效:
参数化测试数据过多:
pytest_generate_tests
钩子动态生成参数测试执行速度慢:
pytest-xdist
进行并行测试保持测试独立:每个测试应该能够独立运行,不依赖其他测试的状态
命名清晰:测试名称应明确表达测试意图,如test_add_two_positive_numbers
合理使用Fixture:
测试数据管理:
持续集成:
学习建议:从简单的单元测试开始,逐步扩展到集成测试和系统测试。每学一个新功能,立即在项目中实践应用。参与开源项目或Pytest社区讨论,也是快速提升的好方法。