**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

posted @ 2021-06-08 16:16  太白之魔童降世  阅读(119)  评论(0编辑  收藏  举报