python中Pytest常用的插件

目录
  • 前言
  • 1. 用例依赖
  • 2. 失败重跑
  • 3. 指定用例执行顺序
  • 4. 分布式运行
  • 5. 多重断言
  • 6. 小结

前言

除了框架本身提供的功能外,Pytest还支持上百种第三方插件,良好的扩展性可以更好的满足大家在用例设计时的不同需求。本文将为大家详细介绍下面5项常用的插件。

1. 用例依赖

编写用例的时候,我们会注意用例之间的独立性,但部分用例之间确实存在关联,无法做到彻底独立,那么我们就可以通过使用插件pytest-dependency设置用例之间的依赖关系。当用例A依赖于用例B时,若用例B执行失败,则用例A将会自动跳过不执行。如此,就可以避免去执行一个必定会失败的用例,相当于pytest.mark.skip。

(1)安装:

pip install pytest-dependency

(2)使用说明:

首先,在标记被依赖用例时,需要在被依赖的用例上添加装饰器pytest.mark.dependency(),且被依赖用例需要在关联用例前执行。也可以给被依赖用例设置别名,通过添加参数name实现。

在关联的依赖用例上,同样需要添加装饰器pytest.mark.dependency(depends=['用例名称']),与之前不同的是,装饰器必须要填写depends参数完成用例的关联,关联的被依赖用例存在多个时可以使用“,”隔开。

此外,还可以通过scope参数指定用例依赖的范围,同样是session、package、module、class这四种类型,此处不详细展开。

具体通过下方的示例以及执行结果来进一步说明。

(3)示例及执行结果分析

示例:

import pytest
class TestCase:
    # 通过装饰器@pytest.mark.dependency()标记当前用例为被依赖用例,被依赖用例需要优先关联用例执行
    @pytest.mark.dependency()
    def test_01(self):
        print("测试用例01,执行失败")
        assert 1 == 2
    # 通过使用装饰器关联被依赖用例,通过depends参数指定用例名称关联用例
    @pytest.mark.dependency(depends=['test_01'])
    def test_02(self):
        print("测试用例02,跳过")
    # 标记被依赖用例时,可以通过name参数指定别名
    @pytest.mark.dependency(name="func_2")
    def test_03(self):
        print("测试用例03,执行成功!")
    # 使用depends参数指定定义的别名关联用例
    @pytest.mark.dependency(depends=['func_2'])
    def test_04(self):
        print("测试用例04,执行成功!")
    # depends参数可以关联多个测试用例,使用“,”分隔即可
    @pytest.mark.dependency(depends=['test_01', 'func_2'])
    def test_05(self):
        print("测试用例05,跳过")
if __name__ == '__main__':
    pytest.main(['-vs'])

执行结果如下:

我们可以看出,只有依赖用例执行成功时,当前用例才会被执行,否则会被跳过。依赖多个用例时,只有全部成功,才会执行,否则一样会跳过。

2. 失败重跑

有些情况下,用例在执行过程中可能会受到一些客观因素的影响,导致用例执行失败,通过使用pytest-rerunfailures插件,可以在失败后重新执行用例,并设置重新运行的最大次数。以此保证用例执行结果的准确性。

(1)安装:

pip install pytest-rerunfailures

(2)使用说明:

失败重跑共有两种使用方式,分别是通过装饰器执行和命令行执行。

使用装饰器时,需要在用例上添加装饰器pytest.mark.flaky(reruns=重新执行最大次数, reruns_delay=执行间隔时间(单位:秒)),在执行过程中,添加了装饰器的用例在执行失败后会按照设置的次数和时间重新执行。

通过在命令行执行时,同样需要指定"rerun"和"rerun-delay"两个参数来实现,如:pytest --reruns 重新执行最大次数 --reruns-delay 间隔时间。

注意:reruns是重新执行的最大次数,如果在达到这一数量前用例执行成功,则不会继续重跑,判断用例执行通过;否则执行到最大次数后,用例仍失败,则判断用例执行失败。

具体通过下方的示例和执行结果进一步说明。

(3)示例及执行结果分析

示例:

import pytest
import random
class TestCase:
    # 使用装饰器设置用例失败后的重新执行最大次数和每次执行的间隔时间(单位:秒)
    @pytest.mark.flaky(reruns=3, reruns_delay=1)
    def test_01(self):
        result = random.choice(['a', 'b', 'c', 'd', 'e'])
        print(f"result={result}")
        assert result == 'c'
if __name__ == '__main__':
    pytest.main(['-vs'])

执行结果如下:

我们可以看出,当用例断言失败后,会重新执行,直到达到设置的最大次数或执行成功为止。

3. 指定用例执行顺序

pytest在执行用例的时候,默认是按照文件中用例的先后顺序执行,有时我们可能在维护测试用例时遇到需要修改用例执行顺序的情况,但是如果每次都通过修改大段的用例代码先后位置来控制,并不利于维护。因此,使用插件pytest-ordering可以快速实现用例执行顺序的设置,后期维护时,也只需要修改对应的执行顺序参数即可。

(1)安装:

pip install pytest-ordering

(2)使用说明:

通过给用例添加装饰器pytest.mark.run(order=执行顺序)设置用例的执行顺序。在执行的时候,使用装饰器pytest.mark.run的用例会优先没有装饰器的用例执行,设置了执行顺序的用例则按照order参数设置的大小升序执行。

具体通过下方的示例和执行结果进一步说明。

(3)示例及执行结果分析

示例:

import pytest
class TestCase:
    def test_01(self):
        print("测试用例01")
    def test_02(self):
        print("测试用例02")
    # 使用装饰器设置执行顺序为2
    @pytest.mark.run(order=2)
    def test_03(self):
        print("测试用例03")
    # 使用装饰器设置执行顺序为1
    @pytest.mark.run(order=1)
    def test_04(self):
        print("测试用例04")
if __name__ == "__main__":
    pytest.main(['-vs'])

执行结果:

我们可以看出,执行的顺序和预期一致。优先执行标明了执行顺序的用例,并按照order的值由小到大执行。

4. 分布式运行

当项目的用例很多的时候,执行通常会耗时颇久,通过分布式运行,则可以大量缩短整体用例的执行时间。pytest-xdist插件就可以帮助我们完成测试用例的分布式运行。

(1)安装:

pip install pytest-xdist

(2)使用说明:

在命令行执行用例时,通过参数-n设置并行启动的进程数量。除了设置具体的数量外,还可以设置为auto,这种情况下,会依据当前设备的cpu数量执行。

此外,还可以通过--dist参数,设置用例分组,同一个组内的用例会在同一个进程中执行。

  • --dist=loadscope 同一个module或同一个class下的用例会分配为同一组,按class分组优先于module。
  • --dist=loadfile 同一个.py文件中的用例会分配为同一组。

具体通过下方的示例和执行结果进一步说明。

(3)示例及执行结果分析

示例:

import pytest
from time import sleep
class TestCase1:
    @pytest.mark.parametrize('keyword', ['a', 'b', 'c', 'd', 'e',                                        'f', 'g', 'h', 'i', 'j'])
    def test_baidu_search(self, keyword):
        sleep(1)
        print(f'搜索关键字{keyword}')
class TestCase2:
    @pytest.mark.parametrize('user', ['user1', 'user2', 'user3', 'user4', 'user5',                                    'user6', 'user7', 'user8', 'user9', 'user10'])    def test_login(self, user):
        sleep(1)
        print(f'用户{user}登录成功')
if __name__ == '__main__':
    # pytest.main(['-vs']) # 不使用pytest-xdist运行
    pytest.main(['-vs', '-n', '2']) # 使用pytest-xdist运行

执行结果:

从上方的两次执行结果中可以看出,使用分布式运行后,用例的运行时间明显缩短。示例中的用例彼此之间没有关联,如果实际使用时用例之间存在依赖关系,可以使用--dist参数为用例分组,确保关联的用例在同一组内。

5. 多重断言

有时,在一个用例中,我们需要对结果进行不同维度的多个断言,但是使用assert断言时,只要有一个断言失败,后续的断言就不会继续执行。现在,我们可以通过使用pytest-assume插件来解决这个问题,当断言失败后,仍会继续执行后续的断言。

(1)安装:

pip install pytest-assume

(2)使用说明:

在用例中,把使用assert进行的断言,改为使用pytest.assume()进行断言即可。

具体通过下方的示例和执行结果进一步说明。

(3)示例及执行结果分析

示例:

import pytest
class TestCase:
    # 使用assert断言
    def test_01(self):
        print("断言1")
        assert 1 == 1
        print('断言2')
        assert 2 == 1
        print("断言3")
        assert 3 == 3
        print('用例结束')
    # 使用pytest.assume()断言
    def test_02(self):
        print('断言1')
        pytest.assume(1 == 1)
        print('断言2')
        pytest.assume(2 == 1)
        print('断言3')
        pytest.assume(3 == 3)
        print('用例结束')
if __name__ == '__main__':
    pytest.main(['-vs'])

执行结果:

从执行结果中可以看出,使用assert断言时,断言失败不会再执行后续的内容;而使用pytest.assume()断言时,断言失败仍会执行至用例结束。这样更有利于我们一次性获取用例执行中全部错误信息。

6. 小结

本文为大家介绍了一些常用的pytest框架的插件,可以帮助我们解决一些实际使用过程中遇到的问题。目前,pytest支持的插件已经多达868个,除了本文介绍的5个常用插件外,还有很多支持其它需求的插件,大家可以根据自己的需要尝试查找使用相关的插件,以便能够更好的设计出符合业务场景的测试用例。

到此这篇关于python中Pytest常用的插件的文章就介绍到这了,更多相关python Pytest 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python+pytest接口自动化之token关联登录的实现

    目录 一. 什么是token 二. token场景处理 这里介绍如下两种处理思路. 1. 思路一 2. 思路二 三. 总结 在PC端登录公司的后台管理系统或在手机上登录某个APP时,经常会发现登录成功后,返回参数中会包含token,它的值为一段较长的字符串,而后续去请求的请求头中都需要带上这个token作为参数,否则就提示需要先登录. 这其实就是状态或会话保持的第三种方式token. 一. 什么是token token 由服务端产生,是客户端用于请求的身份令牌.第一次登录成功时,服务端会生成一个

  • Python测试框架pytest介绍

    目录 一.Pytest简介 二.Pytest安装 三.Pytest测试执行 四.测试类主函数 五.断言方法 六.常用命令详解 七.接口调用 一.Pytest简介 Pytest is a mature full-featured Python testing tool that helps you write better programs.The pytest framework makes it easy to write small tests, yet scales to support

  • Python自动化测试框架pytest的详解安装与运行

    目录 1. pytest的介绍 2. pytest的安装 1. 使用以下命令进行安装 2. 检查是否成功安装正确版本 3. pytest识别测试的条件 4. pytest的运行 4.1 Pycharm中调用 4.2 Python代码中调用 4.3 使用命令行调用 常用参数列表 参数演示示例: 1. pytest的介绍 pytest是一个非常成熟的全功能的python测试工具,它主要有以下特征: 简单灵活,容易上手: 支持简单的单元测试和复杂的功能测试 显示详细的断言失败信息 能自动识别测试模块和

  • Python测试框架pytest高阶用法全面详解

    目录 前言 1.pytest安装 1.1安装 1.2验证安装 1.3pytest文档 1.4 Pytest运行方式 1.5 Pytest Exit Code 含义清单 1.6 如何获取帮助信息 1.7 控制测试用例执行 1.8 多进程运行cases 1.9 重试运行cases 1.10 显示print内容 2.Pytest的setup和teardown函数 函数级别setup()/teardown() 类级别 3.Pytest配置文件 4 Pytest常用插件 4.1 前置条件: 4.2 Pyt

  • Python基础教程之pytest参数化详解

    目录 前言 源代码分析 装饰测试类 装饰测试函数 单个数据 一组数据 组合数据 标记用例 嵌套字典 增加测试结果可读性 总结 前言 上篇博文介绍过,pytest是目前比较成熟功能齐全的测试框架,使用率肯定也不断攀升.在实际 工作中,许多测试用例都是类似的重复,一个个写最后代码会显得很冗余.这里,我们来了解一下 @pytest.mark.parametrize装饰器,可以很好的解决上述问题. 源代码分析 def parametrize(self,argnames, argvalues, indir

  • python单元测试之pytest的使用

    一.前提准备 1.前提:需要安装pytest和pytest-html(生成html测试报告) pip install pytest 和 pip install pytest-html 安装插件:pip install 插件名 2.命名规范 Pytest单元测试中的类名和方法名必须是以test开头,执行中只能找到test开头的类和方法,比unittest更加严谨 Pytest: setup, setup_class 和 teardown, teardown_class 函数 ( 和 unittes

  • Python Pytest装饰器@pytest.mark.parametrize详解

    Pytest中装饰器@pytest.mark.parametrize('参数名',list)可以实现测试用例参数化,类似DDT 如:@pytest.mark.parametrize('请求方式,接口地址,传参,预期结果',[('get','www.baidu.com','{"page":1}','{"code":0,"msg":"成功"})',('post','www.baidu.com','{"page"

  • Python教程之pytest命令行方式运行用例

    目录 前言 pycharm里命令行运行用例 终端中使用pytest 用例全部运行 打印详情-v 指定组别 使用表达式指定某些用例-k 遇到失败即停止运行-x 指定运行某个测试py文件 指定运行某个class 指定运行某个方法: 其他 总结 前言 用命令行方式调用用例是我们最常用的方式,这方面确实比java的TestNG框架要好用许多,至少不用写xml文件,为了提供定制化运行用例的方式,pytest提供了许多运行命令以供定制化运行某一类测试用例或者某个测试用例等: pycharm里命令行运行用例

  • Appium+Python+pytest自动化测试框架的实战

    菜鸟一枚,写的不好勿喷,大家一起学习 先简单介绍一下目录,再贴一些代码,代码里有注释 Basic目录下写的是一些公共的方法,Data目录下写的是测试数据,image存的是测试失败截图,Log日志文件,Page测试的定位元素,report测试报告,Test测试用例,pytest.ini是pytest启动配置文件,requirements.txt需要安装的py模块,run.py运行文件 Basic/base.py 里面封装了 一些方法,元素的点击,输入,查找,还有一些自己需要的公共方法也封装在里面,

  • python+pytest接口自动化之日志管理模块loguru简介

    目录 安装 简单示例 add()常用参数说明 使用 python自带日志管理模块logging,使用时可进行模块化配置,详细可参考博文Python日志采集(详细). 但logging配置起来比较繁琐,且在多进行多线程等场景下使用时,如果不经过特殊处理,则容易出现日志丢失或记录错乱的情况. python中有一个用起来非常简便的第三方日志管理模块--loguru,不仅可以避免logging的繁琐配置,而且可以很简单地避免在logging中多进程多线程记录日志时出现的问题,甚至还可以自定义控制台输出的

随机推荐