设置data 属性获取最新值

import pytest
import os #路径配置需要引入os 模块
import json

from common.myConf import MyConf
from common.my_path import conf_dir
from common.my_requests import MyRequests
from common.my_excel import MyExcel
from common.my_assert import MyAssert
from common.mylogger import logger
from common.my_path import testdata_dir

# 第一步:读取注册接口的测试数据 - 是个列表,列表中的每个成员,都是一个接口用例的数据。
excel_path = os.path.join(testdata_dir, "测试用例.xlsx")
print(excel_path)
me = MyExcel(excel_path, "充值接口")
cases = me.read_data()

# 第二步:遍历测试数据,每一组数据,发起一个http的接口
# 实例化请求对象
mq = MyRequests()
massert = MyAssert()


# 把前置写在fixture里面
#@pytest.fixture(scope="class"):表示pyteat用法的前置条件,放在类里面,这样做的好处是不需要重复登录
@pytest.fixture(scope="class")
def prepare():
    # 登陆
    conf = MyConf(os.path.join(conf_dir, "data.ini"))  #准备的数据
    user = conf.get("normal","user")
    passwd = conf.get("normal", "passwd")
    login_url = "member/login"
    data = {"mobile_phone":user,"pwd":passwd}

    # 发起请求,前面已经引入了发起请求的封装模块
    resp = mq.send_requests("post", login_url, data)

    # 拿token,id,leave_amount
    #因为我们并没有把提取封装,所以我们这里使用json 进行提取
    #leave_amount :是充值要传的一个参数
    resp_dict = resp.json()
    member_id = resp_dict["data"]["id"]
    token = resp_dict["data"]["token_info"]["token"]
    leave_amount = resp_dict["data"]["leave_amount"]
    yield token,member_id,leave_amount



@pytest.mark.usefixtures("prepare")
class TestRecharge:

    #设置前置条件:
    @pytest.mark.parametrize("case", cases)
    def test_recharge(self, case, prepare):
        # 1、在写用例的时候,接收到上一个接口以下三个值:
        token, member_id, leave_amount = prepare
        logger.info("从上一接口提取出来的数据为:\ntoken:{}\nmember_id:{}\nleave_amount:{}"
                    .format(token, member_id, leave_amount))

      
        if case["req_data"] and case["req_data"].find('#member_id#') != -1:
            # 替换掉占位符 -
            case["req_data"] = case["req_data"].replace('#member_id#', str(member_id)) #member_id 是str类型

        # 3、把替换之后的请求数据(json格式的字符串),转换成一个字典
        req_dict = json.loads(case["req_data"])

        # 4、发起请求,并接收响应结果
        #token=token:把token传进去,发起请求的时候需要鉴权
        resp = mq.send_requests(case["method"], case["url"], req_dict, token=token)
        logger.info(resp.json())

        # 结果空列表
        assert_res = []

        # 4、断言响应结果中的数据
        if case["assert_list"]:
            response_check_res = massert.assert_response_value(case["assert_list"], resp.json())
            assert_res.append(response_check_res)

        # 5、断言数据库 - sql语句、结果与实际、比对的类型
        if case["assert_db"]:
            db_check_res = massert.assert_db(case["assert_db"])
            assert_res.append(db_check_res)

        # 最终的抛AsserttionError
        if False in assert_res:
            raise AssertionError

注意:该用例设计的缺点是:
第一条用例:
[{"expr":"$.code","expected":0,"type":"eq"},
{"expr":"$.msg","expected":"OK","type":"eq"},
{"expr":"$..leave_amount","expected":#leave_amount#+2000,"type":"eq"}
]
第二条用例:
[{"expr":"$.code","expected":0,"type":"eq"},
{"expr":"$.msg","expected":"OK","type":"eq"},
{"expr":"$..leave_amount","expected":#leave_amount#+2000.1,"type":"eq"}
]
从第一条和第二条用例当中:第2条用例替换的#leave_amount# 值并不是在第1条用例
#leave_amount#+2000 =9000的基础上再加2000.1的,而是用用基础的#leave_amount#+2000.1
我们需要做的事每次发送成功就会更新#leave_amount#的值

那么,我们需要如何去进行处理呢?
解决方法:
1、在common 文件夹下建立一个my_data.py 文件 2、把前置条件当中的设置Data 属性,然后在测试用例当中更改它的值,如果key 已经存在,则更新他的值,如果不存在,则添加一个值
3、在测试用例当中就不需要再接收需要关联的字段了

示例代码:加粗代码为修改的地方:
import pytest
import os  # 路径配置需要引入os 模块
import json

from common.myConf import MyConf
from common.my_path import conf_dir
from common.my_requests import MyRequests
from common.my_excel import MyExcel
from common.my_assert import MyAssert
from common.mylogger import logger
from common.my_path import testdata_dir
from common.my_data import Data  #引入data 模块
from common.my_extract import extract_data_from_response

# 第一步:读取注册接口的测试数据 - 是个列表,列表中的每个成员,都是一个接口用例的数据。
excel_path = os.path.join(testdata_dir, "测试用例.xlsx")
print(excel_path)
me = MyExcel(excel_path, "充值接口")
cases = me.read_data()

# 第二步:遍历测试数据,每一组数据,发起一个http的接口
# 实例化请求对象
mq = MyRequests()
massert = MyAssert()

"""
# 把前置写在fixture里面
# @pytest.fixture(scope="class"):表示pyteat用法的前置条件,
# 放在类里面,这样做的好处是不需要重复登录
"""
@pytest.fixture(scope="class")
def prepare():
    # 登陆
    conf = MyConf(os.path.join(conf_dir, "data.ini"))  # 准备的数据
    user = conf.get("normal" ,"user")
    passwd = conf.get("normal", "passwd")
    login_url = "member/login"
    data = {"mobile_phone" :user ,"pwd" :passwd}

    # 发起请求,前面已经引入了发起请求的封装模块
    resp = mq.send_requests("post", login_url, data)

    # 拿token,id,leave_amount
    # 因为我们并没有把提取封装,所以我们这里使用json 进行提取
    # leave_amount :是充值要传的一个参数
    resp_dict = resp.json()
    member_id = resp_dict["data"]["id"]
    token = resp_dict["data"]["token_info"]["token"]
    leave_amount = resp_dict["data"]["leave_amount"]


    """
 
    2、把前置条件当中的设置Data 属性,然后在测试用例当中更改它的值,
    如果key 已经存在,则更新他的值,如果不存在,则添加一个值
    """
    setattr(Data, "token", token)
    #为了方便获取使用,把这里改成str
    # setattr(Data, "member_id", member_id)
    setattr(Data, "member_id", str(member_id))
    # setattr(Data, "leave_amount", leave_amount)
    setattr(Data, "leave_amount", str(leave_amount))
    # yield token,member_id,leave_amount  这句话就可以不要了


@pytest.mark.usefixtures("prepare")
class TestRecharge:

    # 设置前置条件:
    @pytest.mark.parametrize("case", cases)
    def test_recharge(self, case, prepare):
        # 1、在写用例的时候,接收到上一个接口以下三个值:
# token, member_id, leave_amount = prepare #需要关联的字段在前置条件当中已经设置了从data当中获取,所以这里旧不需要再接收了,注释掉 # 2、下一接口的请求数据中,需要替换,替换为上一个接口中提取的数据。 if case["req_data"] and case["req_data"].find('#member_id#') != -1: # 替换掉占位符 - case["req_data"] = case["req_data"].replace('#member_id#', getattr(Data, "member_id")) if case["assert_list"] and case["assert_list"].find('#leave_amount#') != -1: # 替换掉占位符 - case["assert_list"] = case["assert_list"].replace('#leave_amount#', getattr(Data, "leave_amount")) # 3、把替换之后的请求数据(json格式的字符串),转换成一个字典 req_dict = json.loads(case["req_data"]) # 4、发起请求,并接收响应结果 if hasattr(Data, "token"): resp = mq.send_requests(case["method"], case["url"], req_dict, token=getattr(Data, "token")) else: resp = mq.send_requests(case["method"], case["url"], req_dict) logger.info(resp.json()) # 5、提取响应结果中的数据,并设置为全局变量 if case["extract"]: # 调用提取处理函数 extract_data_from_response(case["extract"], resp.json()) # 结果空列表 assert_res = [] # 4、断言响应结果中的数据sert_response_value(case["assert_list"], resp.json()) # assert_res.append(response_check_res) if case["assert_list"]: response_check_res = massert.as # 5、断言数据库 - sql语句、结果与实际、比对的类型 if case["assert_db"]: db_check_res = massert.assert_db(case["assert_db"]) assert_res.append(db_check_res) # 最终的抛AsserttionError if False in assert_res: raise AssertionError #从断言响应成功的结果当中,提取leave_amount 的值,并更新全局变量当中的eave_amount 的值 setattr(Data, "leave_amount", str(resp.json()["Data"]["leave_amount"]))

 


posted @ 2022-01-10 21:19  乘风破浪的小落夜  阅读(106)  评论(0编辑  收藏  举报