pytest框架的fixture使用

fixture特点

更加灵活–命名不受到之前的命名限定
更加智能–可以通过conftest.py实现自动寻找配置的能力
更好使用–可以通过装饰器模式来指定自己的作用范围

使用方式

fixture(scope=“function”, params=None, autouse=False, ids=None, name=None):
scope: 表示作用域 默认为function,可选择为 “class”, “module” or “session”.
params: 一个可选的参数列表,它将导致多个参数调用fixture功能和所有测试使用它
autouse: 如果为True,则为所有测试激活fixture func 可以看到它。 如果为False(默认值)则显式需要参考来激活fixture
ids: 每个字符串id的列表,每个字符串对应于params 这样他们就是测试ID的一部分。 如果没有提供ID它们将从params自动生成
name: fixture的名称。 这默认为装饰函数的名称。 如果fixture在定义它的同一模块中使用,夹具的功能名称将被请求夹具的功能arg遮蔽;
解决这个问题的一种方法是将装饰函数命名 “fixture_ ”然后使用”@ pytest.fixture(name =‘’)“”。
在这里插入图片描述
运行结果:
在这里插入图片描述
注意:方法1和方法3都是在执行前执行了fixture内容,而方法2没有执行,这就说明了插件配置的灵活性
同样的,在此基础上,我们可以针对于整个项目来进行插件设置–fixture的conftest
新建一个conftest.py 将之前的装饰器代码放进来
在这里插入图片描述
然后测试代码

import pytest
def test_1(login):
    print("我是test1我要登录后执行")


def test_2():
    print("我是test2,我不用登录,也能执行")


def test_3(login):
    print("我是test3,我要登录")





if __name__ == "__main__":
    pytest.main(['-vs'])

这时候,会发现conftest的执行会变为全局的内容

fixture中的yield函数

fixtrue的装饰器可以用于我们的用例的前置执行逻辑,相应的,如果我们需要在函数执行结束之后需要去做一些其他操作,那么我们也可以进行特定的操作,如yield函数,可以帮助到我们.
代码如下:

import pytest

@pytest.fixture()
def login():
    print("登录成功,账号是xiaoming")
   

    yield
    print("执行teardown操作")
    print("关闭浏览器" )

看一下运行结果:
在这里插入图片描述
总结:
yield前的代码为前置执行逻辑
yiled为分界线,后面的代码为用例结束后执行的代码逻辑
这里的调用都是直接将方法名当做参数传入的
执行流程 – 运行测试用例 --> 发现参数为方法名 --> 寻找同名的函数方法 --> 先执行同名的函数方法 -->碰到yield --> 执行测试用例 -->执行yield后续代码

思考: 如果在执行过程中出现了异常会怎么样?

代码如下:
在这里插入图片描述
看下运行结果:
在这里插入图片描述
由此可见,异常不会影响到yield的执行,会在异常结束后继续执行yield后续的代码。

同样,我们可以思考下,在setup出现异常的时候还会执行yield后续内容吗?

看下代码:

import pytest

@pytest.fixture()
def login():
    print("登录成功,账号是xiaoming")
    3/0


    yield
    print("执行teardown操作")
    print("关闭浏览器" )

看下运行结果:
在这里插入图片描述
当我们人为制造一个异常的时候,会发现,后续的yield不会继续执行了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值