pytest中的yeild以及固件函数的作用域

关于pytest中的yeild
yeild 在python中,是一个生成器,但是应用在pytest中的时候,结合固件使用,就变的有意思了,可以返回需要的值,
也可以作为装饰器插入部分,在没设置返回值的时候,在执行到yield的时候,就会执行测试函数了。
(个人的理解就是此时yeild 结合固件函数使用时,当函数引用到的固件中存在yeild的时候,函数会先执行固件函数的yeild的前面部分,碰到yeild的时候,就去执行函数本身,函数本身执行完毕后,再去执行yield的后面部分。当yield 后面带有返回值的时候,返回值就会带入到函数中去)
看看下面的例子
在pytest中,是这样的
conftest.py
@pytest.fixture()
def func1():
    a=1
    b=2
    yield a,b  #返回一个tuple
@pytest.fixture(scope='module')
def login():
    dr=webdriver.Chrome()
    dr.get('http://www.baidu.com')
    yield dr  #测试函数test_01引用后,会在执行完driver后去执行test_01 完毕后再去执行driver.quit()
    dr.quit()

test_01.py
def test_yeild(func1):
    print (type(func1))
    var1=func1[0]
    var2=func1[1]
    print (var1,var2)
def test_search1(login):
    dr=login  #将浏览器对象传递给dr,这个很重要
    dr.find_element_by_id('kw')..send_keys('aaa')
执行后显示,func1是一个tuple类型的。这里和通用的用法有点不一样。我们可以看下常规下的操作
debug.py
def func1():
    for i in range(10):
        yield i
a=func1()
print (type(a))
for i in func1():
    print (i)  #结果顺序输出从0到9



作用域 一个重要的概念
function: 函数级,每个测试函数都会执行一次固件;
class: 类级别,每个测试类执行一次,所有方法都可以使用;
module: 模块级,每个模块执行一次,模块内函数和方法都可使用;
session: 会话级,一次测试只执行一次,所有被找到的函数和方法都可用。
理解:这几个作用域,在什么场景下使用,需要结合自己的代码和固件函数本身,某些配置信息,只希望执行一次,就可以使用session级别,autouse=True,如果测试用例分成几个文件夹,每个文件夹下有单独的conftest,这里面的数据,只要在调用的时候执行一次,就可以设置为module级别。class的,就是class调用的时候会执行,function同理。这些配置信息,使用的多了,就知道如果去正确的配置了。
结合代码来说明
conftest.py
@pytest.fixture(scope='module')
def login():
    dr=webdriver.Chrome()
    dr.get('http://www.baidu.com')
    yield dr
    dr.quit()

test_01.py
def test_search1(login):
    dr=login
    dr.find_element_by_id('kw').send_keys('aaa')
    time.sleep(3)

def test_search2(login):
    dr=login
    dr.find_element_by_id('kw').send_keys('bbb')
    time.sleep(2)
 执行效果:在百度的输入框里面输入了aaabbb 这是因为scope设置的是modle级别执行的逻辑是login--test_search1--test_search2
再修改
conftest.py
@pytest.fixture(scope='function',autouse=True)
def login():
    dr=webdriver.Chrome()
    dr.get('http://www.baidu.com')
    print ('one')
    yield dr
    dr.quit()

test_01.py
def test_search1(login):
    dr=login
    dr.find_element_by_id('kw').send_keys('aaa')
    time.sleep(3)

def test_search2():
    print ('hello')

 结果如下:
 collected 2 items

test_01.py one
.one
hello
.
可以看到lgoin执行了两次  这是因为autouse 和scope共同作用的结果  function设置会让每个def执行的时候都会去执行login(前提是def有引用该固件),
当def没有引用该固件的时候,设置autouse为Ture,每个def执行的时候也会默认先去执行login。
引申:当测试场景要求每个def都需要单独开启新的浏览器,我们就要将login设置为默认值function,autouse设置为ture。
当测试场景要求只在开始阶段打开一个浏览器,我们就需要scope=session,
当测试场景要求每个class打开一个新浏览器,scope=class
当需要一个py文件打开一个新浏览器  scope=module(用两个文件做了测试,设置module的时候,一个py文件会执行一次固件函数)
conftest.py
@pytest.fixture(scope='module')
def login():
    dr=webdriver.Chrome()
    dr.get('http://www.baidu.com')
    print ('one')
    yield dr
    dr.quit()

test_01.py
def test_search1(login):
    dr=login
    dr.find_element_by_id('kw').send_keys('aaa')
    time.sleep(3)
test_sample.py
def test_search1(login):
    dr=login
    dr.find_element_by_id('kw').send_keys('ccc')
    time.sleep(3)
执行:pytest.main(['-s','test_01.py',"test_sample.py"])
test_01.py one
.hello
.
test_sample.py EF.one
.
换一种方式cmd方式执行 也是会输出两个one ,结果一样。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值