五、pytest插件分享
插件,其实就是一种辅助工具。pytest的插件,其实就是在测试过程中,起到辅助的作用。例如:指定用例执行顺序、多重校验、失败重跑、、等等。关于pytest更多的第三方插件,详情可见http://plugincompat.herokuapp.com/
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 断言
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 再次执行
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 插件。
pytest还有很多很多的插件,但是使用这些插件的时候,建议做一些封装工作。如果没有封装直接调用,时间长了,会造成代码沉冗。插件虽好,但建议合理使用。
以后发现更多优秀的插件,本人会继续分享。