pytest快速上手指南【pytest】
pytest 框架简介与入门指南
在基于 Python 的自动化测试领域,最常见的三大测试框架包括:
unittest
pytest
robotframework
其中,unittest
和 pytest
更多用于白盒测试,主要聚焦在单元测试层面;而 robotframework
则偏向于系统级的黑盒测试,更适合自动化验收测试等场景。
尽管 pytest
本身定位为单元测试框架,但它同样可以胜任系统测试的自动化任务。相比其他框架,pytest
拥有以下优势:
- 使用简单:测试用例用原生 Python 编写,语法直观。
- 结构清晰:测试目录和文件的组织可以自然地映射到人工测试用例的分层结构。
- 灵活的初始化和清理机制:支持精细化控制测试资源的 setup 和 teardown。
- 用例选择方便:支持按模块、类、方法甚至标签选择要执行的用例。
- 插件生态丰富:通过插件(如 pytest-html)可生成详尽的测试报告等。
一、安装 pytest 及报告插件
安装 pytest
非常简单,直接运行以下命令即可:
pip install pytest
为了生成图形化的测试报告,还需要安装插件 pytest-html
:
pip install pytest-html
二、pytest 自动发现测试用例的规则
pytest 会自动识别哪些是测试用例,主要依据如下规则:
- 若未指定路径,则从当前目录(或配置中的 testpath)开始递归查找;
- 默认会搜索以
test_*.py
或*_test.py
命名的 Python 文件; - 在这些文件中,pytest 会寻找:
- 以
test
开头的函数; - 以
Test
开头的类中,以test
开头的方法。
- 以
✅ 小提示:为了让 pytest 能正确发现用例,类名和函数名的命名非常关键。
三、测试用例示例
假设我们在项目根目录 autotest
下的 cases/登录/
目录中创建了一个文件 test_错误登录.py
,其中包含如下用例类:
class Test_错误密码:def test_C001001(self):print('\n用例C001001')assert 1 == 1def test_C001002(self):print('\n用例C001002')assert 2 == 2def test_C001003(self):print('\n用例C001003')assert 3 == 2
该类符合 pytest 要求的结构:类名以 Test
开头,方法名以 test_
开头。断言语句 assert
是 pytest 中判断测试结果的核心机制:只要表达式结果为 True
,用例就通过;否则失败。
四、运行测试
进入项目根目录(如 autotest
),可以通过以下命令执行测试:
python -m pytest
执行后,pytest 会自动查找并运行当前目录下的所有测试用例,并在终端输出结果:
- 绿色的
.
表示通过; - 红色的
F
表示失败; - 失败用例后会展示失败原因和具体断言语句位置。
常用运行参数
-s
:显示测试用例中的print()
输出,适用于调试;-v
:显示每个用例的详细名称;-sv
:同时启用上述两个选项。
python -m pytest -sv
此外,为了避免 pytest 误将其他目录(如 lib
、cfg
)下的文件识别为用例,可以在命令中指定测试用例目录:
python -m pytest cases
五、生成测试报告
借助 pytest-html
插件,我们可以通过以下命令生成图形化的测试报告:
python -m pytest cases --html=report.html --self-contained-html
这样会在当前目录生成名为 report.html
的报告文件,使用浏览器打开即可查看详细信息。
🔍 注:旧版本插件存在中文显示乱码的问题,但在最新版中已被修复,测试类名或路径中包含中文也能正常显示。
补充建议
- 在中大型项目中,建议结合
pytest.ini
配置文件自定义测试路径、添加标记(markers)、忽略目录等设置; - 可进一步了解
fixture
、参数化
、断言重写
等高级功能,提升自动化能力; - 利用 CI 工具(如 Jenkins、GitHub Actions)集成 pytest 测试流程,可实现持续测试与报告归档。