前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python测试框架pytest(19)插件 - 元数据、可选择URL地址、实时输出错误信息、失败重试

Python测试框架pytest(19)插件 - 元数据、可选择URL地址、实时输出错误信息、失败重试

作者头像
wangmcn
发布2022-07-26 14:31:09
5990
发布2022-07-26 14:31:09
举报
文章被收录于专栏:AllTests软件测试

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 标志不兼容。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AllTests软件测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目录
  • 1.1、安装
  • 1.2、查看元数据
  • 1.3、添加元数据
  • 1.4、访问元数据
  • 2.1、安装
  • 2.2、示例
  • 3.1、安装
  • 3.2、示例
  • 4.1、安装
  • 4.2、操作参数
  • 4.3、兼容性
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档