关于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 ,结果一样。
pytest中的yeild以及固件函数的作用域
最新推荐文章于 2024-04-24 15:18:04 发布