Python测试框架pytest(19)
插件
元数据、可选择URL地址、实时输出错误信息、失败重试
目录
- 1、pytest-metadata(元数据)
- 1.1、安装
- 1.2、查看元数据
- 1.3、添加元数据
- 1.4、访问元数据
- 2、pytest-base-url(可选择URL地址)
- 2.1、安装
- 2.2、示例
- 2.2.1、使用命令行
- 2.2.2、使用配置文件
- 3、pytest-instafail(实时输出错误信息)
- 3.1、安装
- 3.2、示例
- 4、pytest-rerunfailures(失败重试)
- 4.1、安装
- 4.2、操作参数
- 4.2.1、重新运行所有失败的用例
- 4.2.2、重新运行指定的测试用例
- 4.3、兼容性
1、pytest-metadata(元数据)
元数据是关于数据的描述,存储着关于数据的信息,为人们更方便地检索信息提供了帮助。
pytest 框架里面的元数据可以使用 pytest-metadata 插件实现。
1.1、安装
在命令行中运行以下命令进行安装:
代码语言:javascript复制pip install pytest-metadata
或者(使用国内的豆瓣源,数据会定期同步国外官网,速度快。)
代码语言:javascript复制pip install pytest-metadata -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
1.2、查看元数据
使用 pytest 执行用例的时候加上参数 --verbose,在控制台输出报告的头部就会输出元数据 (metadata) 信息。
例如执行test_Demo用例:
代码语言:javascript复制pytest --verbose test_Demo.py
控制台输出的信息,元数据是以键值对 (key-value) 方式存储的:
代码语言:javascript复制wangmeng@wangmengdeMacBook-Pro My_pytest_Demo % pytest --verbose test_Demo.py
=========================================== test session starts ============================================
platform darwin -- Python 3.7.9, pytest-6.2.2, py-1.9.0, pluggy-0.13.1 -- /Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7
cachedir: .pytest_cache
metadata: {'Python': '3.7.9', 'Platform': 'Darwin-20.4.0-x86_64-i386-64bit', 'Packages': {'pytest': '6.2.2', 'py': '1.9.0', 'pluggy': '0.13.1'}, 'Plugins': {'assume': '2.4.2', 'allure-pytest': '2.8.19', 'Faker': '8.6.0', 'metadata': '1.10.0', 'rerunfailures': '9.1.1', 'html': '3.0.0', 'xdist': '2.1.0', 'ordering': '0.6', 'cov': '2.10.1', 'repeat': '0.9.1', 'forked': '1.3.0'}, 'JAVA_HOME': '/Library/Java/JavaVirtualMachines/jdk1.8.0_261.jdk/Contents/Home'}
rootdir: /Users/wangmeng/PycharmProjects/My_pytest_Demo
plugins: assume-2.4.2, allure-pytest-2.8.19, Faker-8.6.0, metadata-1.10.0, rerunfailures-9.1.1, html-3.0.0, xdist-2.1.0, ordering-0.6, cov-2.10.1, repeat-0.9.1, forked-1.3.0
1.3、添加元数据
1、在命令行用 --metadata 参数添加键值对 (key, value) 的元数据。
例如:
代码语言:javascript复制pytest --metadata author Meng
2、如需添加多个元数据,可以使用多次 --metadata 参数添加。
例如:
代码语言:javascript复制pytest --metadata author Meng --metadata version v1.0
3、还可以将元数据作为 JSON 字符串传入
例如:
代码语言:javascript复制pytest --metadata-from-json '{"cat_says": "bring the cat nip", "human_says": "yes kitty"}'
1.4、访问元数据
1、要在元数据收集结束时添加/修改/删除元数据,可以使用 hook 函数 pytest_metadata。
代码语言:javascript复制#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信公众号:AllTests软件测试
"""
import pytest
@pytest.mark.optionalhook
def pytest_metadata(metadata):
metadata.pop("password", None)
2、要从测试用例或 fixture 访问元数据,可以使用元数据 metadata fixture。
代码语言:javascript复制#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信公众号:AllTests软件测试
"""
def test_metadata(metadata):
assert 'metadata' in metadata['Plugins']
3、要从插件访问元数据,可以使用 config 对象的 _metadata 属性,这可用于读取/添加/修改元数据。
代码语言:javascript复制#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信公众号:AllTests软件测试
"""
def pytest_configure(config):
if hasattr(config, '_metadata'):
config._metadata['foo'] = 'bar'
关于 pytest-metadata 插件更详细的使用,可查看官方网址:
https://pypi.org/project/pytest-metadata/#description
2、pytest-base-url(可选择URL地址)
在自动化测试执行中,我们可能会根据不同的环境(测试环境、预发环境、生产环境等)来执行用例,需要把URL地址单独提取出来,希望通过命令行或配置文件来执行。
pytest-base-url 是 pytest 插件,它通过命令行或配置文件提供一个可选的URL地址。
2.1、安装
在命令行中运行以下命令进行安装:
代码语言:javascript复制pip install pytest-base-url
或者(使用国内的豆瓣源,数据会定期同步国外官网,速度快。)
代码语言:javascript复制pip install pytest-base-url -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
2.2、示例
pytest-base-url 提供了一个 base_url 固定装置,它返回指定的基本URL地址。
创建test_base_url.py文件
脚本代码:
代码语言:javascript复制#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信公众号:AllTests软件测试
"""
def test_case(base_url):
print("URL地址:" base_url)
assert "https://www.cnblogs.com/alltests/" == base_url
2.2.1、使用命令行
命令行执行时,加上参数 --base-url
例如:
代码语言:javascript复制pytest -s test_base_url.py --base-url https://www.cnblogs.com/alltests/
运行结果:
2.2.2、使用配置文件
pytest.ini 配置文件里添加 base_url 地址
项目根目录下,创建pytest.ini配置文件
配置文件内容:
代码语言:javascript复制[pytest]
base_url = https://www.cnblogs.com/alltests/
打开命令行执行(不需要加上参数 --base-url)
代码语言:javascript复制pytest -s test_base_url.py
运行结果:
3、pytest-instafail(实时输出错误信息)
pytest 执行全部用例的时候,如果有用例失败,不会实时在控制台打印出来,而是要等到全部用例执行完成后,才会把所有的报错信息一起抛到控制台上显示,不方便实时查看报错信息。
pytest-instafail 插件可以在运行用例的时候,如用例失败,可实时查看报错信息。
使用参数 --instafail
3.1、安装
在命令行中运行以下命令进行安装:
代码语言:javascript复制pip install pytest-instafail
或者(使用国内的豆瓣源,数据会定期同步国外官网,速度快。)
代码语言:javascript复制pip install pytest-instafail -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
3.2、示例
创建test_instafail.py文件
脚本代码:
代码语言:javascript复制#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信公众号:AllTests软件测试
"""
def test_case1():
assert 1 == 1
def test_case2():
assert 0 == 1
创建test_instafail2.py文件
脚本代码:
代码语言:javascript复制#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信公众号:AllTests软件测试
"""
def test_case3():
assert 0 == 0
def test_case4():
assert 1 == 1
1、默认执行
打开命令行执行:
代码语言:javascript复制pytest test_instafail.py test_instafail2.py
运行结果:
用例全部执行完后,报错信息才抛出来。
2、使用参数 --instafail
打开命令行执行:
代码语言:javascript复制pytest test_instafail.py test_instafail2.py --instafail
运行结果:
用例执行过程中,有失败用例,则实时抛出失败信息。
4、pytest-rerunfailures(失败重试)
4.1、安装
在命令行中运行以下命令进行安装:
代码语言:javascript复制pip install pytest-rerunfailures
或者(使用国内的豆瓣源,数据会定期同步国外官网,速度快。)
代码语言:javascript复制pip install pytest-rerunfailures -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
4.2、操作参数
- 命令行参数:--reruns n(重新运行次数),--reruns-delay m(等待运行秒数)
- 装饰器参数:reruns=n(重新运行次数),reruns_delay=m(等待运行秒数)
4.2.1、重新运行所有失败的用例
创建test_rerunfailures.py文件
脚本代码:
代码语言:javascript复制#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信公众号:AllTests软件测试
"""
import pytest
def test_case1():
print("n==== 执行 test_case1 ====")
assert 1 == 1
@pytest.fixture()
def fixturefun():
print("n==== 执行 fixturefun ====")
assert 2 == 2
return 3
def test_case2(fixturefun):
print("n==== 执行 test_case2 ====")
assert fixturefun == 4
class TestCase():
def setup_class(self):
print("n==== 执行 setup_class ====")
assert 4 == 5
def teardown_class(self):
print("n==== 执行 teardown_class ====")
assert 5 == 6
def test_case3(self):
print("n==== 执行 test_case3 ====")
assert 6 == 6
4.2.1.1、重新运行次数
要重新运行所有测试失败的,使用 --reruns 命令行选项,并指定要运行测试的最大次数。
例如:
代码语言:javascript复制pytest test_rerunfailures.py --reruns 2 -s
运行结果:
设置失败最大重新执行次数为2次
函数test_case2执行失败后,又重新执行2次,同时引用的fixture也重新执行2次。
由于setup_class报错,重新执行还是报错,则类方法test_case3没有被执行。
4.2.1.2、等待运行秒数
要在两次重试之间增加延迟时间,使用 --reruns-delay 命令行选项,指定下次测试重新开始之前等待的秒数。
例如:
代码语言:javascript复制pytest test_rerunfailures.py --reruns 2 --reruns-delay 5 -s
两次重试之间等待5秒。
4.2.2、重新运行指定的测试用例
要将单个测试用例添加 flaky 装饰器 @pytest.mark.flaky(reruns=n) ,并在测试失败时自动重新运行,需要指定最大重新运行的次数n。
创建test_rerunfailures2.py文件
脚本代码:
代码语言:javascript复制#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信公众号:AllTests软件测试
"""
import pytest
@pytest.mark.flaky(reruns=2)
def test_case1():
print("n==== 执行 test_case1 ====")
assert 1 == 2
@pytest.mark.flaky(reruns=5, reruns_delay=2)
def test_case2():
print("n==== 执行 test_case2 ====")
assert 3 == 4
4.2.2.1、重新运行指定的测试用例
函数test_case1、test_case2添加flaky装饰器@pytest.mark.flaky(reruns=n)
运行结果:
函数test_case1设置失败最大重新执行次数为2次
函数test_case2设置失败最大重新执行次数为5次
注意:
如果指定了用例的重新运行次数,则在命令行执行添加 --reruns n 对这些用例是不会生效的。
例如:在命令行输入命令
代码语言:javascript复制pytest test_rerunfailures2.py --reruns 1 -s
执行时,并没有按照失败最大重新执行次数设置的1次,还是按照指定用例里的设置,函数test_case1设置失败最大重新执行次数为2次,函数test_case2设置失败最大重新执行次数为5次。
4.2.2.2、等待运行秒数
在装饰器里添加参数 reruns_delay=m(等待运行秒数)
例如:函数test_case2添加装饰器@pytest.mark.flaky(reruns=5, reruns_delay=2)
两次重试之间等待2秒。
4.3、兼容性
此插件不能与装饰器 @pytest.fixture() 级别为(class, module, package)一起使用。
此插件与 pytest-xdis 的 –looponfail 标志不兼容。
此插件与 core –pdb 标志不兼容。