pytest实践学习日记一(pytest.fixture())

<1>conftest.py文件

conftest.py文件名称是固定的,pytest会自动识别该文件。放到项目的根目录下就可以全局调用了,如果放到某个package下,那就在该package内有效。
fixture为session级别是可以跨xx.py模块调用的,也就是当我们有多个.py文件的用例的时候,如果多个用例都不需要调用fixture修饰的前置处理函数,那就可以设置为scope=“session”,并且一定要写到conftest.py文件里,只在测试session开始前执行一次。
在这里插入图片描述

  1. conftest.py文件当中,它储存的都是fixture,就是给用例提供做前置准备工作和后置清理工作的一个东西
  2. conftest.py文件可以将它的fixtures修饰的函数共享到它自己目录下的所有用例,用例当中如果使用fixture的话,是不需用导入conftest.py这个文件的,会直接自动去查找(这是其他任何.py文件不能达到的效果,就算是__init__.py文件内定义的东西也需要导入才能使用)
  3. conftest.py它是属于层级共享的,也就是说,一个自动化项目当中,可以在不同的包下面去创建conftest.py这个文件,而且conftest.py文件是在__init__.py文件之后执行的,可以调用一个测试包的__init__.py中定义的类和方法

<2>@pytest.fixture()的用途

主要是用作前置处理器的效果,定义一些修饰的函数,做一些初始化的工作,比如数据库连接、测试数据准备加载等
它的使用格式如下:
fixture(scope=‘function’,params=None,autouse=False,ids=None,name=None)
1、autouse:autouse设置为True,自动调用fixture功能
如果True,则为所有测试用例不需要传参也会调用这个fixture修饰的函数,默认是false。如果为False则需要显示的调用fixture修饰的函数作为参数才会执行。如下图:
在这里插入图片描述
2、scope是指这个前置处理函数执行的范围,默认必须是显示调用才会执行,默认范围是function,即每个testcase调用,都会执行,但是定义为session时,整个session内所有.py文件中testcase执行都不会调用fixture修饰的函数,只有第一个testcase执行前才会调用,定义为class时,整个.py文件中单个class中有多个testcase调用fixture修饰的函数,都只在class内第一个testcase执行前执行一次,如下图:
在这里插入图片描述

在这里插入图片描述
scope=“module”
在当前.py脚本里面所有用例开始前只执行一次

<三>fixture嵌套使用

这里还有需要注意的是,fixture可以嵌套使用,如果你想在一个fixture执行前先执行另一个fixture,直接可以嵌套调用
例如下面的例子:

order = []

@pytest.fixture
def f1(f3):  # 这里f3这个fixture传到f1这个fixture中
    order.append("f1")

@pytest.fixture()
def f3():
    order.append("f3")

def test_1(f1):  # 参数为f1,调用f1的时候会先执行f1的参数f3
    print(order)
    assert order == ["f3","f1"]

执行结果为:f3、f1,测试结论为:pass

<四>在使用@pytest.fixture修饰的函数中,还可以添加yield关键字,用来时候tear_down()函数的效果,用来做一些收尾清理的操作,只是他不像tear_down()和tear_down_class()那样是一个实体的方法,只是定义一个关键字,然后关键字后续的操作都是与此前置处理器函数执行的位置对应,如果fixture修饰的函数是在整个session执行前执行,则yield后的操作在整个session中所有测试用例都执行完(包括用例的tear_down()执行完成后)后再执行yield修饰的所有操作,yield关键字后的操作内容和fixture修饰的函数,都是同一个函数,一般yield前后的内容都是相互对应的关系,比如前面是创建设备,yield后就应该是删除设备,如下图:
在这里插入图片描述
yield操作的执行情况
而且如果测试用例中的代码出现异常或者断言失败,并不会影响他的固件中yield后的代码执行;但是如果固件中的yield之前的代码也是相当于setup部分的代码,出现错误或断言失败,那么yield后的代码将不会再执行,当然测试用例中的代码也不会执行。
如下的代码执行顺序:
import pytest
@pytest.fixture(scope=“function”)
def login():
print(“登录成功”)
yield
print(“用例执行完成,收尾”)
def test1():
print(“操作1”)
print(“---------------------------------------”)
def test2(login):
print(“操作2”)
print(“---------------------------------------”)
def test3():
print(“操作3”)
print(“---------------------------------------”)

if name==“main”:
pytest.main([“-s”,“test_function2.py”])
结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值