Pytest 框架常用功能介绍
一、简介
Pytest 是一个功能强大的 Python 测试框架,具有简单易用、测试用例清晰易读、支持参数化、可运行由 Nose 和 unittest 编写的测试用例、拥有丰富的第三方插件且可自定义扩展、支持重复执行失败的用例以及方便与持续集成工具集成等特点。
二、快速入门
- 安装 :使用
pip3 install pytest
命令进行安装。 - 查看版本 :通过
Pytest --version
查看版本。 - 快速入门示例 :
- 导入
pytest
。 - 定义测试用例方法和测试函数,使用
assert
进行断言。 - 通过
pytest.main(["-s", "test_sample.py"])
执行测试。
- 导入
三、基础使用
- 用例前置和后置执行
- unittest :通过
setUp
和tearDown
在每个用例执行前后执行,通过setUpClass
和tearDownClass
在类里面所有用例执行前后执行。 - pytest :函数级别为
setup/teardown
,运行于测试方法的始末,每个测试用例运行一次;类级别为setup_class/teardown_class
,运行于测试类的始末,一个测试内只运行一次。
- unittest :通过
- 默认运行规则
- 测试文件以
test_*.py
开头或*_test.py
结尾。 - 测试类以
Test
开头,且不能带有__init__
方法。 - 测试函数以
test_
开头。 - 运行参数:
-v
:用于显示每个测试函数的执行结果。-q
:只显示整体测试结果。-s
:用于显示测试函数中print()
函数输出。
- 测试文件以
- 自定义运行规则
- 在
pytest.ini
文件中配置,如addopts
(运行参数)、testpaths
(测试目录)、python_files
(测试文件)、python_classes
(测试类)、python_functions
(测试方法)等。
- 在
- 断言
- 使用标准的 Python
assert
断言语句,如assert xx
(判断 xx 为真)、assert not xx
(判断 xx 不为真)、assert a in b
(判断 b 包含 a)、assert a == b
(判断 a 等于 b)、assert a!= b
(判断 a 不等于 b)。
- 使用标准的 Python
四、标记(mark)使用
- 标记
- 一个测试函数可以有多个标记,一个标记也可以标记多个测试函数。
- 运行参数:
pytest -m test01
或pytest -m "test01 or test02"
。
- 跳过测试
skip
:标记skip
表示跳过该测试用例,运行不执行,可使用skip(reason=None)
。skipif
:条件判断验证是否忽略不执行,判断条件为表达式skipif(condition, reason=None)
。
五、数据参数化
- 传入单个参数 :
pytest.mark.parametrize(argnames, argvalues)
,argnames
为参数名,argvalues
为参数对应值,类型必须为可迭代类型,一般使用list
。 - 传入多个参数 :
@pytest.mark.parametrize(("username", "password"), [("xiaoming", "123456"), ("xiaohong", "456789")])
,list
的每个元素都是一个元组,元组里的每个元素和按参数顺序一一对应。
六、常用插件
- pytest-html :用于生成测试报告,安装命令为
pip3 install pytest-html
,在配置文件中的命令行参数中增加--html=用户路径/report.html
。 - pytest-rerunfailures :当失败后尝试再次运行,安装命令为
pip3 install pytest-rerunfailures
,在配置文件中的命令行参数中增加--reruns n
,如果期望加上出错重试的等待时间,可使用--reruns-delay
。
七、Fixture
- 作用 :
setup
、teardown
针对整个脚本全局生效,而fixture
可以让我们自定义测试用例的前置条件。 - 优势 :
- 命名方式灵活,不局限于
setup
和teardown
。 - 在
conftest.py
配置里可以实现数据共享,不需要import
就能自动找到fixture
。 scope="session"
可实现多个.py
跨文件使用一个session
来完成多个用例。
- 命名方式灵活,不局限于
- 如何使用 :
- 将
fixture
名称作为测试用例函数的输入参数:@pytest.fixture
。 - 测试用例加上装饰器:
@pytest.mark.usefixtures(fixture_name)
。 fixture
设置:@pytest.fixture(autouse=True)
。
- 将
- scope :
fixture
的作用域,默认为function
(函数级别),排序为:session > module > class > function
。 - autouse :默认
False
,手动调用该fixture
;如果是True
,所有作用域内的测试用例都会自动调用该fixture
。 - name:默认装饰器的名称。
- 实例化顺序 :
function
(函数级):每一个函数都会调用。class
(类级别):每个测试类只运行一次。module
(模块级):每一个.py
文件调用一次。session
(会话级):每次会话只需要运行一次,会话内所有方法及类,模块都共享这个方法,是针对.py
级别。