关于pytest中的yeild
yeild 在python中,是一个生成器,但是应用在pytest中的时候,结合固件使用,就变的有意思了,可以返回需要的值,
也可以作为装饰器插入部分,在没设置返回值的时候,在执行到yield的时候,就会执行测试函数了。
(个人的理解就是此时yeild 结合固件函数使用时,当函数引用到的固件中存在yeild的时候,函数会先执行固件函数的yeild的前面部分,碰到yeild的时候,就去执行函数本身,函数本身执行完毕后,再去执行yield的后面部分。当yield 后面带有返回值的时候,返回值就会带入到函数中去)
看看下面的例子
在pytest中,是这样的
conftest.py
@pytest.fixture()
def func1():a=1b=2yield 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 drdr.quit()test_01.py
def test_search1(login):dr=logindr.find_element_by_id('kw').send_keys('aaa')time.sleep(3)def test_search2(login):dr=logindr.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 drdr.quit()test_01.py
def test_search1(login):dr=logindr.find_element_by_id('kw').send_keys('aaa')time.sleep(3)def test_search2():print ('hello')结果如下:collected 2 itemstest_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 drdr.quit()test_01.py
def test_search1(login):dr=logindr.find_element_by_id('kw').send_keys('aaa')time.sleep(3)
test_sample.py
def test_search1(login):dr=logindr.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 ,结果一样。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!