概述
Pytest 是一个比较成熟且功能完备的 Python 测试框架。其提供完善的在线文档,并有着大量的第三方插件和内置帮助,适用于许多小型或大型项目。Pytest 灵活易学,打印调试和测试执行期间可以捕获标准输出,适合简单的单元测试到复杂的功能测试。还可以执行 nose, unittest 和 doctest 风格的测试用例,甚至 Django 和 trial。支持良好的集成实践, 支持扩展的 xUnit 风格 setup,支持非 python 测试。支持生成测试覆盖率报告,支持 PEP8 兼容的编码风格。
主要特点有以下几点:
- 简单灵活,容易上手,文档丰富;
- 支持参数化,可以细粒度地控制要测试的测试用例;
- 能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest+requests);
- pytest具有很多第三方插件,并且可以自定义扩展,比较好用的如pytest-selenium(集成selenium)、pytest-html(完美html测试报告生成)、pytest-rerunfailures(失败case重复执行)、pytest-xdist(多CPU分发)等;
- 测试用例的skip和xfail处理;
- 可以很好的和CI工具结合,例如jenkins
- report框架----allure 也支持了pytest
Pytest官方文档:https://docs.pytest.org/en/latest/contents.html
python的测试工具大全:https://wiki.python.org/moin/PythonTestingToolsTaxonomy
Pytest 安装
安装:
pip install pytest
基本使用:
usage: py.test [options] [file_or_dir] [file_or_dir] [...]
# 展示已安装的版本
pytest --version
# 显示可用的内置函数参数
pytest --fixtures
# 通过命令行插件帮助信息及配置文件选项
pytest --help
Pytest 用例编写
编码约束
- 测试文件:必须满足 test_*.py 或 *_test.py 格式
- 测试类:以Test开头,并且不能带有 init 方法(pytest只运行以Test开头的class)
- 测试函数:以test_开头
- 断言使用基本的assert即可
- 在执行pytest命令时,会自动从当前目录及子目录中寻找符合上述约束的测试函数来执行。
@pytest.mark.marker 用例标签
# 跳过测试
@pytest.mark.skip(reason=None)
# 满足某个条件时跳过该测试
@pytest.mark.skipif(condition)
# 预期该测试是失败的
@pytest.mark.xfail(condition, reason=None, run=True, raises=None, strict=False)
# 参数化测试函数。给测试用例添加参数,供运行时填充到测试中
# 如果 parametrize 的参数名称与 fixture 名冲突,则会覆盖掉 fixture
@pytest.mark.parametrize(argnames, argvalues)
# 对给定测试执行给定的 fixtures
# 这种用法与直接用 fixture 效果相同
# 只不过不需要把 fixture 名称作为参数放在方法声明当中
@pytest.mark.usefixtures(fixturename1, fixturename2, ...)
# 让测试尽早地被执行
@pytest.mark.tryfirst
# 让测试尽量晚执行
@pytest.mark.trylast
参考文章:https://www.cnblogs.com/df888/p/13715187.html
setup/teardown 用例前置
setup_module/teardown_module:.py文件中最先/最后执行,例如打开/断开数据库链接、回收内存资源等
setup/teardown:在测试方法之前执行,完成准备/收尾工作,例如测试数据、打开文件/回收内存资源等
备注:也可以在fixture函数中通过yield实现setup和teardown功能
详情请参考文章:https://blog.csdn.net/anndy_/article/details/119885380