目录
pytest -k stringexpr 当测试文件、测试类名、测试方法中包含stringexpr关键字时,均可以被执行
pytest test_mod.py::test_func 仅运行与节点ID匹配的测试
简介
pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高。
根据pytest的官方网站介绍,它具有如下特点:
(1)非常容易上手,入门简单,文档丰富,文档中有很多实例可以参考
(2)能够支持简单的单元测试和复杂的功能测试
(3)支持参数化
(4)执行测试过程中可以将某些测试跳过,或者对某些预期失败的case标记成失败
(5)支持重复执行失败的case
(6)支持运行由nose, unittest编写的测试case
(7)pytest具有很多第三方插件,并且可以自定义扩展,比较好用的如pytest-selenium(集成selenium)、pytest-html(完美html测试报告生成)、pytest-rerunfailures(失败case重复执行)、pytest-xdist(多CPU分发)等
(8)方便的和持续集成工具集成
安装
py -3 -m pip install pytest
或者
py -3 -m pip install -U pytest
验证安装成功
pytest --version
pytest用例编写规则
(1)测试文件以test_开头(以_test结尾也可以),注意:pytest 文件名.py不受此规则限制。
(2)测试类以Test开头,并且不能带有 __init__ 方法
(3)测试函数以test_开头
(4)断言使用基本的assert即可
pytest执行方式
pytest 在当前目录下运行所有测试
# 执行pytest目录下所有test_开头(以_test结尾也可以)的py文件
# 子目录中以_test开头或结尾的py文件也会被执行
...\pytest>pytest
pytest test_mod.py 执行指定的测试文件
# 执行某个测试文件
...\pytest>pytest test_a.py
pytest somepath 在指定路径下运行所有测试
# 执行指定目录下所有test_开头(以_test结尾也可以)的py文件
...\pytest>pytest pytest_sub_path
pytest -k stringexpr 当测试文件、测试类名、测试方法中包含stringexpr关键字时,均可以被执行
# 测试文件、测试类名、测试方法中包含指定关键字,匹配成功时,均可以被执行
F:\LiFuChe\python_20_自动化\pytest>pytest -k fixture
================================ test session starts ================================
platform win32 -- Python 3.10.2, pytest-7.1.2, pluggy-1.0.0
rootdir: F:\LiFuChe\python_20_自动化\pytest
plugins: html-3.1.1, metadata-2.0.2, ordering-0.6, rerunfailures-10.2
collected 49 items / 29 deselected / 20 selected
test_fixture1.py . [ 5%]
test_fixture2.py ... [ 20%]
test_fixture3.py ... [ 35%]
test_fixture4.py ... [ 50%]
test_fixture5.py .F [ 60%]
test_fixture6.py .... [ 80%]
conftest\test_fixture_module.py FF [ 90%]
test_conftest\test_fixture_module.py FF
pytest test_mod.py::test_func 仅运行与节点ID匹配的测试
pytest test_a.py::test_case1 #执行test_a.py文件下的test_case1函数
pytest test_mod.py::TestClass::test_method #执行指定测试类TestClass中的test_method 方法
pytest常用命令
使用pytest --help可以查看全部选项
命令 | 说明 |
-q | 等价于pytest --quiet,简化输出信息 |
-s | 等价于pytest --capture=no,输出测试用例中的打印信息 |
-v | 等价于pytest --verbose,显示具体的详情信息(哪个测试用例的哪个测试方法被执行),一般显示错误的位置及错误的详细信息 |
-m | 用于标记测试并分组,以便快速选中并运行。需要先在待分组的方法前加上@pytest.mark.mark_name这样的装饰器,执行时用pytest-m mark_name。 -m还可以用表达式指定多个标记。使用-m "mark1 and mark2"可以同时选中带有这两个标记的所有测试用例。使用-m "mark1 and not mark2"则会选中带有mark1但不带mark2的测试用例;使用-m "mark1 or mark2"则选中带有mark1或mark2的所有测试用例 |
-k | 后面可为测试文件、测试类名、测试方法中包含的关键字,匹配成功时,均可以被执行 |
--lf | 等价于--last-failed,只重新运行上次运行失败的用例(如果没有失败的话,会全部跑) |
--ff | 等价于--failed-first,运行所有测试用例,但首先运行上次运行失败的测试 |
--x | 等价于--exitfirst,遇到错误或者用力不通过,则退出执行 |
--maxfailed=num | 指定执行失败次数后停止 |
pytest测试报告
生成测试报告需要安装插件:
py -3 -m pip install pytest-html
或:pip install -U pytest-html
执行用例的命令:
pytest --html=report.html
失败重跑
需要安装插件:
py -3 -m pip install pytest-rerunfailures
或:pip install -U pytest-rerunfailures
运行命令:
pytest test_sample2.py --reruns n
# n表示重试的次数
setup和teardown函数
setup和teardown:每个测试函数运行时,运行一次
import pytest
class Test_ST():
def setup(self):
print("------setup------")
def teardown(self):
print("------teardown------")
def test_001(self):
assert True
def test_002(self):
assert False
setup_class和teardown_class:一个测试类只运行一次
import pytest
class Test_ST():
def setup_class(cls):
print("------setup_class------")
def teardown_class(cls):
print("------teardown_class------")
def test_001(self):
assert True
def test_002(self):
assert True
控制测试函数的运行顺序
需要安装插件:
py -3 -m pip install pytest-ordering
使用访求:
- 使用 @pytest.mark.run(order=x) 标记被测试函数;
- 运行的顺序由order传入的参数决定;(order从小到大的顺序执行)
import pytest
class Test_ST():
@pytest.mark.run(order=3)
def test_001(self):
print("001...")
assert True
@pytest.mark.run(order=2)
def test_002(self):
print("002...")
assert True
@pytest.mark.run(order=1)
def test_003(self):
print("003...")
assert True
pytest.ini:通过配置文件配置要执行的测试用例
(1)pytest的配置文件存放位置及命名:
通常放在测试目录下,名称为pytest.ini,命令行运行时会使用配置文件中的配置
(2)配置pytest命令行运行参数
[pytest]
addopts=-s ... # 以空格分隔,可添加个命令行参数