pytest中fixture的scope使用方法
前置条件
在进行讲解之前,需要你有pycharm并且在pycharm中新建一个项目,本文使用项目waimai,然后在项目中新建package,package中新建文件conftest.py,以及test_login.py文件,如下即可
conftest.py文件为固定内容,只需修改scope作用域即可
import pytest
"""
"""
# ---------1、登录操作-----
@pytest.fixture(scope="function")
def login_init():
print('----1.开始执行的登录操作----')
token = 'token_value'
yield token
print('---登录完成---')
# ---------2、商店初始化操作-----
@pytest.fixture(scope='function')
def shop_init(login_init):
print('----2.创建商店实例操作----')
shop_object = login_init+'shop_object'
yield shop_object # 返回出去给---测试方法使用
print ("创建完成")
function
第一种scope=“function”简单理解也就是作用与函数,在test_Login.py中新建一个函数,以及参数化如下:
#test_Login.py
import pytest
@pytest.mark.parametrize('name',["tok","to"])
def test_login(name,shop_init):
assert name in shop_init
print ("hhhhh")
打印结果如下:
----1.开始执行的登录操作----
----2.创建店铺实例操作----
PASSED [ 50%]
hhhhh
创建完成
---我登录完成---
----1.开始执行的登录操作----
----2.创建店铺实例操作----
PASSED [ 100%]
hhhhh
创建完成
通过调试和结果可以看出:
作用域如果为function,传入function的每个值都会在固件中进行执行一遍
class
test_Login.py文件内容修改为:
#test_login.py
import pytest
class Test_login():
@pytest.mark.parametrize('name', ["tok", "to"])
def test_login(self,name,shop_init):
assert name in shop_init
print ("hhhhh")
@pytest.mark.parametrize('name', ["token", "toke"])
def test_facking(self,name,shop_init):
assert name in shop_init
print ("hhhhh")
if __name__ == '__main__':
pytest.main()
注:同步修改conftest.py中的scope=“class”
结果如下:
----1.开始执行的登录操作----
----2.创建店铺实例操作----
PASSED [ 25%]hhhhh
PASSED [ 50%]hhhhh
PASSED [ 75%]hhhhh
PASSED [100%]hhhhh
创建完成
---我登录完成---
可以看出,在执行类执行只执行一遍fixture中的内容
module
test_login.py中的内容修改为如下:
import pytest
class Test_login():
@pytest.mark.parametrize('name', ["tok", "to"])
def test_login(self,name,shop_init):
assert name in shop_init
print ("hhhhh")
class Test_lgo():
@pytest.mark.parametrize('name', ["token", "toke"])
def test_facking(self,name,shop_init):
assert name in shop_init
print ("hhhhh")
if __name__ == '__main__':
pytest.main()
注:同步修改fixture.py中的作用域为module
结果如下:
----1.开始执行的登录操作----
----2.创建店铺实例操作----
PASSED [ 25%]hhhhh
PASSED [ 50%]hhhhh
test_Login.py::Test_lgo::test_facking[toke]
PASSED [ 75%]hhhhh
PASSED [100%]hhhhh
创建完成
---我登录完成---
可以看出是作用与整个python文件上的
package
这个就不多赘述了,就是作用与整个package文件夹
目录结构如下图即可:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IBsaRjwG-1655627779387)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20220619163110382.png)]
session
这个也不多做赘述,不是耍流氓关键都差不多,就是在我们所有执行完成也就完成了,这样一个过程我们就叫做一个session他的层级是大于package的
总结
整体作用域大小为:
session>package>module>class>function
具体在使用过程中可以根据情况进行酌情选择,文档中可以介绍不是特别详细理解思路自己进行试验即可