五、pytest插件分享

1、关于pytest的插件说明

插件,其实就是一种辅助工具。pytest的插件,其实就是在测试过程中,起到辅助的作用。例如:指定用例执行顺序、多重校验、失败重跑、、等等。关于pytest更多的第三方插件,详情可见http://plugincompat.herokuapp.com/

 

2.assume插件使用介绍

assume 插件 安装方法:pip install pytest-assume(需要有 python 环境和 pytest 环境)

assume:assume 插件就是一个断言工具,和 pytest 自带的断言区别就在于:断言失败不会阻塞后面的用例

 

demo:

 

import time

import pytest

import random

# 普通断言

def func(x):

   return x + 1

def test_answer():

   assert func(3) == 5

   assert func(3) == 5

   assert func(3) == 5

普通的 assert 断言,在第一条用例出现错误时,就不会继续执行。

 

# assume断言

def test_answer():

    pytest.assume(3==3)

   pytest.assume(4 == 3)

   pytest.assume(5 == 3)

   pytest.assume(6 == 3)

assume 断言和 assert 断言唯一不同的地方就在于,即使第一条用例未通过,也会继续往下执行

 

适用场景:

如果,用例需要顺序执行,则不推荐使用 assume 断言。假设,B用例需要A用例通过后才能继续操作,如果使用 assume 断言,则不管A用例是否通过,都会继续执行B用例。这样的结果是不符合我们自动化测试的预期的。所以,如果是顺序执行的用例,还是使用 assert 断言比较好。

但是,有另外一种需求。比方说:对整个 web 页面进行自动化操作,功能与功能之间并没有很多联系,那此时就必须使用 assume 断言。可以设想,如果因为某个页面元素没有加载出来,导致该用例失败,则后面的用例也无法再继续进行测试。解决办法只有重新再跑一遍,这样的做法很浪费时间资源。

所以,两种断言方式,选择哪一种,看个人具体需求。用例与用例之间,没有依赖关系的,则使用 assume 断言,有依赖关系的,使用 assert 断言

3.rerunfailures插件使用介绍

rerunfailures 插件 安装方法:pip install pytest-rerunfailures(需要有 python 环境和 pytest 环境)

rerunfailures:rerunfailures 插件,顾名思义,失败重跑。在做UI自动化当中,最常见的问题就是页面加载超时。如果因为加载超时而定位不到元素,最后导致用例失败,这用例失败得很冤。所以我们需要再给用例一次机会,当用例执行成功后,即使还有剩余执行次数,也不会再继续执行。简单的说:执行结果 == False,rerunfailures生效,执行结果 == True,rerunfailures失效

demo:

 

import time

import pytest

import random

class TestRerun():

 

    @pytest.mark.flaky(reruns=10)

    def test_random(self):

        pytest.assume((random.randint(0,3)+4)==10)

 

    def test_random2(self):

        '''

        不加mark 命令行中添加:--reruns 5

        :return:

        '''

        pytest.assume((random.randint(0,4)+6)==5)

 

    @pytest.mark.flaky(reruns=6, reruns_delay=2)

    def test_example(self):

        print(3)

        assert random.choice([True, False])

 

1、在修饰符内传参@pytest.mark.flaky(reruns=10)

这是给下面的用例声明了,如果该用例失败了,可以再执行,总共可重复执行10次,10次过后还失败,则不再允许重复执行。

 

2、没有修饰符

如果没有修饰符,一样是可以让用例重复执行的。只需要在命令行中加入 --reruns N 即可。例如:pytest --reruns 5:这声明了,所有用例,如果失败了,可以再执行,总共可重复执行10次,10次过后还失败,则不再允许重复执行。但使用命令行声明的话,需要注意一点:该声明是全局生效,也就是说,所有用例执行失败,都可以重复执行5遍。

 

3、指定重试时间@pytest.mark.flaky(reruns=6, reruns_delay=2)

如果在修饰符内传参: reruns_delay=2,则说明指定了重试时间。每次失败后,间隔 2 再次执行

4.ordering插件使用介绍

ordering 插件 安装方法:pip install pytest-ordering(需要有 python 环境和 pytest 环境)

ordering:ordering 插件在调试中使用较多。如果我们的用例有依赖性,并且是顺序执行的,使用常规方法调试会比较麻烦。举个例子:后面所有的用例都必须依赖A用例,只有当A用例执行通过,后面的所有用例才能执行。但除了A用例外,其他用例并没有依赖关系,每次调试都需要重头到位跑一遍,这个过程太浪费时间资源,所以就需要使用 ordering 插件指定用例执行顺序。简单的说,就是打乱原先的顺序,让用例照着我们想要的顺序去执行。

demo:

 

import time

import pytest

import random

g@pytest.mark.run(order=2)

def test_order1():

    print("first test")

    assert True

 

@pytest.mark.run(order=1)

def test_order2():

    print("second test")

    assert True

用法其实超级简单,就在修饰符中传参 order=N 即可。ordering 插件的场景在介绍中已经说的很明白了,个人可根据需求,判断是否需要使用 ordering 插件。

5.总结

pytest还有很多很多的插件,但是使用这些插件的时候,建议做一些封装工作。如果没有封装直接调用,时间长了,会造成代码沉冗。插件虽好,但建议合理使用。

以后发现更多优秀的插件,本人会继续分享。

 

 

 

 

posted @ 2020-06-17 15:37  hongliangsam  阅读(256)  评论(1编辑  收藏  举报