**fixture 用法:**
将fixture 写入conftest中,import pytest.fixture
def fixture(scope="function", params=None, autouse=False, ids=None, name=None): 重点说下
scope 四组参数的意义:
- function:每个方法(函数)都会执行一次。
- class:每个类都会执行一次。类中有多个方法调用,只在第一个方法调用时执行。
- module:一个 .py 文件执行一次。一个.py 文件可能包含多个类和方法。
- package/session:多个文件调用一次,可以跨 .py 文件。
fixture运行方式:
1- 自动调用 自动化测试前,检查环境,访问项目,检验账号,可以自动化执行方式做
2- 手动调用 实际的接口的前置条件 每一个模块的前置条件不一样!
@pytest.fixture(scope="session", autouse=True)
def start_running():
#1- 初始化操作
print('---自动化测试前---初始化操作----')
try:
for one in os.listdir('../report/tmp'):#one 是每一个文件名
if '.json' in one or '.txt' in one:#以后有环境配置文件在里面,所以做了判定!
os.remove(f'../report/tmp/{one}')
except:
print('第一次运行pytest.main()')
#数据清除
yield
print('---自动化测试完成---数据清除----')
#就是你本次自动化测试,因为测试需求,增加了一些测试数据,或者修改一些数据
#恢复!
#1- 登录操作--初始化,为后续业务获取鉴权-token--需要手动调用fixture
@pytest.fixture(scope='class')
def login_init():
token = Login().login({"username":"xxx","password":"xxx"},getToken=True)
print('-----1、登录初始化操作-----')
return token
#2- 创建店铺操作--- 创建店铺实例
@pytest.fixture(scope='class')
def shop_init(login_init):#(写前置的fixture名字---就是他的返回值)
shopObject = Shop(login_init)
print('-----2、创建店铺实例操作-----')
return shopObject
@pytest.fixture(scope='function')#只有店铺更新的接口需要!
def update_shop_init(shop_init):#(写前置的fixture名字---就是他的返回值)
#获取店铺id
shopID = shop_init.shop_list({"page":1,"limit":20})['data']['records'][0]['id']
imageInfo = shop_init.file_upload('123.png','../data/123.png','image/png')['data']['realFileName']
print('-----3、店铺更新操作-----')
return shop_init,shopID,imageInfo #就是元组类型
@pytest.fixture(scope='function')
def update_shop_db():
db=DBConnection(ip='192.168.19.149',db="sq-waimai")
res1=db.select('select * from t_sys_dept where id=1;')
print(res1)
db.update("UPDATE sq-waimai.t_sys_dept SET fullname= '淘汰郎小火锅桐乡店1' WHERE id = 1;")
res2=db.select('select * from t_sys_dept where id=1;')
print(res2)
fixture 使用技巧:
1- 使用函数名直接调用,但是没有返回值
@pytest.mark.usefixtures('update_shop_init')#写入函数名
2- 需要使用到 fixture 返回值
直接在对应的接口函数里,加入一个形参,参数名就是fixture函数名
#3- 食品的实例化,初始化条件
@pytest.fixture(scope='class')
def food_init(login_init):#
food= FoodManage(login_init)#先登录创建一个实例
print('---正在操作食品初始化---')
return food
#店铺更新接口的前置操作
@pytest.fixture(scope='function')
def update_food_init(food_init):
#菜单id
idMenu = food_init.list_food({"page": 1, "limit": 1})['data']['records'][0]['category_id']
#店铺id
shopid = food_init.list_food({"page": 1, "limit": 1})['data']['records'][0]['restaurant_id']
#食品id
foodid = food_init.list_food({"page": 1, "limit": 1})['data']['records'][0]['item_id']
print('正在执行---update_food_init---')
return idMenu,shopid,foodid
#4- 订单的实例化,初始化条件
@pytest.fixture(scope='class')
def order_init(login_init):#
order= Order_admin(login_init)#先登录创建一个实例
print('---正在操作食品初始化---')
return order
#5- 退出操作
@pytest.fixture(scope='class')
def user_logout(login_init):#
loginObject= Login()
#退出操作
loginObject.logout(login_init)
#mongodb操作
@pytest.fixture(scope='class')
def food_db_init(shop_init):
shopid=shop_init[0]
db=MongoDB()
res=db.find_all('foods',{'restaurant_id':shopid})
for one in res:
print(one)
db.delete_all('foods',{'restaurant_id':shopid})
res2=db.find_one('foods',{'restaurant_id':shopid})
if res2 ==None:
print('食品清空完毕')
print('添加食品操作')
db.insert('foods',{'restaurant_id':shopid,"category_id":3333,"description":'非常好吃',"item_id":6872,'name':'烤肉饭'})
res=db.find_one('foods',{"item_id":6872})
#assert res != None
嗨~今天你暴躁了吗?
~~~关注我,更多精彩内容带给你,关注私聊带走绝密知识~~~