使用Data全局变量类+封装提取处理

1、给Data类或对象动态设置属性

1、定义一个全局变量类Data, 不设置任何属性。它的属性是动态设置的

"""
setattr(对象/类, attr, value)        设置,给谁设置属性
getattr(对象/类, attr)               获取
hasattr(对象/类, attr)				是否有这个属性, True表示有attr, False表示没有attr
delattr(对象/类, attr)				删除属性
"""
# 在代码运行的过程中,动态的给Data类设置/获取/删除属性。
class Data:				#	定义一个Data类
    pass

setattr(Data, "token", "1234564562314584555")		#	设置(Data, "token", "1234564562314584555")	

if hasattr(Data, "token"):							#	如果 有这个属性(Data, "token"):     (如果有这个属性,那么就去取,如果没有这个属性,它不会报错,不过怎么也不会输出、显示)
    value = getattr(Data,"token")					#	value = 获取(Data,"token")	
    print(value)
	# delattr(Data, "token")						# 	用完了,把它删掉,没有问题。不删也可以。
# 得到的结果为:1234564562314584555

=======================================================================

充值接口的前置设置

import os
import json
import pytest
from common.my_data import Data
from common.my_conf import MyConf
from common.my_path import conf_dir
from common.py_log import LoggerHandler
from common.my_assert import MyAssert
from common.My_excel import MyExcel
from common.my_requests import MyRequests
from common.my_path import testdata_dir
"""
前置:登陆成功(意味着要鉴权)
步骤:充值
断言:金额对不对
后置:释放资源/清理数据

1、类级别地的前置 -- 所有的充值用例,只需要登陆一次就够了。
   登陆帐号: 
       1、用固定的一个帐号 - 配置化(Conf目录下,data.ini里配置用户)
       2、已配置的帐号,如何保证它是已经存在的??
          用之前,查一下数据库,如果没有,就注册(session前置)。


2、接口关联处理 -- 登陆接口的返回值,要提取出来,然后作为充值接口的请求参数

准备知识 :re正则表达式、 postman是如何处理参数传递(接口关联的)。
"""

logger = LoggerHandler()

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

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

@pytest.fixture(scope="calss")
def prepare():
    # 登录
    conf = MyConf(os.path.join(conf_dir,"data.ini"))    # conf = 配置文件读取.os.path.join(拼到配置文件路径,Conf模块中的data.ini文件)
    user = conf.get("normal", "user")                   # user = 读取 data.ini 文件中的 normal 里面的 user
    password = conf.get("normal", "password")           # password = 读取 data.ini 文件中的 normal 里面的 password

    login_url = "member/login"            # 调用登录接口
    data = {"mobile_phone":user, "pwd":password}        # data = {"mobile_phone":user, "pwd":password}调用上面的user、password
    resp = mq.send_requests(login_url, "post", data)      # resp = 实例化请求头.调用请求的(login_url, post方法,data)

    # 拿token,id、leave_amount
    resp_dict = resp.json()                 # 如果接口的响应数据是json格式 ,可以用这个方法。这个方法执行后的结果,是一个字典。
    member_id = resp_dict["data"]["id"]     # member_id = resp_dict下的 data,再获取 data 下的 id
    token = resp_dict["data"]["token_info"]["token"]        # token = resp_dict下的 data,再获取 data 下的 token_info 在获取 token_info 的 token
    leave_amount = resp_dict["data"]["leave_amount"]        # leave_amount = resp_dict下的 data, 再获取 data下的 leave_amount
    setattr(Data,"token",token)
    setattr(Data,"member_id",str(member_id))
    setattr(Data,"leave_amount",str(leave_amount))

==========================================================================

Data 类定义为前置,在Excel中使用

import jsonpath
from common.my_data import Data

#   测试数据
extract_eqr = '{"token":"$..token","mamber_id":"$..id#","leave_amount":"$..leave_amount"}'
response = {"code":0,"msg":"OK","data":{"id":1000514035,"leave_amount":54401.89,"mobile_phone":"18015669362","reg_name":"白糖","reg_time":"2021-05-07 12:07:27.0","type":1,"token_info":{"token_type":"Bearer","expires_in":"2021-05-10 16:08:51","token":"eyJhbGciOiJIUzUxMiJ9.eyJtZW1iZXJfaWQiOjEwMDA1MTQwMzUsImV4cCI6MTYyMDYzNDEzMX0.pw4ZhtAgSGKNLLKJDF77FZP5Vtehaqm0Y7tmm0O4nnSlxweyYCkGmusVyboa3xemGAHrUTwULoLpD0_uQmhdmQ"}},"copyright":"Copyright 柠檬班 © 2017-2020 湖南省零檬信息技术有限公司 All Rights Reserved"}

# 1、从Excel中提取表达式,并转化成字典对象
extract_dict = eval(extract_eqr)

# 2、遍历 1 中字典的key、value 。
#    value 是 jsonpath 表达式。
for key,value in extract_dict.items():

    # 根据 jsonpath 从响应结果当中,提取真正的值。  value就是 jsonpath 表达式
    result = jsonpath.jsonpath(response,value)
    
    # jsonpath 找到了就是列表,找不到就是False
    # 如果提取到了真正的值,那么将它设置为 Data 类的属性。 key 是全局变量名, result 就是提取后的值。
    if result:                          # 如果 result 存在:
        setattr(Data, key, res[0])              #   设置(Data, key, result[0])

for key,value in Data.__dict__.items():
    print(key,value)

===========================================================================================

封装 Data 类为前置,在Excel中使用


import jsonpath
from common.my_data import Data

def extract_data_from_response(extract_epr, response_dict):
    """
    从响应结果当中提取值,并设置为Data类的属性。
    :param extract_epr: excel当中extract列中的提取表达式。是一个字典形式的字符串。
                        key为全局变量名。value为jsonpath提取表达式。
                        '{"token":"$..token","member_id":"$..id","leave_amount":"$..leave_amount"}'
    :param response: http请求之后的响应结果。字典类型。
    :return:None
    """
    # 1、从excel中读取的提取表达式,转成字典对象
    extract_dict = eval(extract_epr)

    # 2、遍历1中字典的key,value.key是全局变量名,value是jsonpath表达式。
    for key,value in extract_dict.items():
        # 根据jsonpath从响应结果当中,提取真正的值。value就是jsonpath表达式
        result = jsonpath.jsonpath(response_dict, value)
        # jsonpath找了就是列表,找不到返回False
        # 如果提取到了真正的值,那么将它设置为Data类的属性。key是全局变量名,result[0]就是提取后的值
        if result:
            setattr(Data, key, str(result[0]))

		# for key,value in Data.__dict__.items():
    		#     print(key,value)
        	

=============================================================

import json
import os
import pytest
from common.my_data import Data
from common.py_log import LoggerHandler
from common.my_path import conf_dir
from common.my_conf import MyConf
from common.my_requests import MyRequests
from common.My_excel import MyExcel
from common.my_assert import MyAssert
from common.my_path import testdata_dir
from common.my_extract import extract_data_from_response

logger = LoggerHandler()
"""
前置:登陆成功(意味着要鉴权)
步骤:充值
断言:金额对不对
后置:释放资源/清理数据

1、类级别地的前置 -- 所有的充值用例,只需要登陆一次就够了。
   登陆帐号: 
       1、用固定的一个帐号 - 配置化(Conf目录下,data.ini里配置用户)
       2、已配置的帐号,如何保证它是已经存在的??
          用之前,查一下数据库,如果没有,就注册(session前置)。


2、接口关联处理 -- 登陆接口的返回值,要提取出来,然后作为充值接口的请求参数

准备知识 :re正则表达式、 postman是如何处理参数传递(接口关联的)。
"""

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

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


class Test_Recharge:

    @pytest.mark.parametrize("case", cases)
    def test_recharge(self,case):
        # 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["url"], case["method"], req_dict, token=getattr(Data,"token"))
        else:
            resp = mq.send_requests(case["url"], case["method"], req_dict)
        logger.info(resp.json())

        # 5、提取响应结果中的数据,并设置为全局变量。 全局变量设置好了,在这里调用。
        if case["extract"]:
            # 调用提取处理的函数
            extract_data_from_response(case["extract"], resp.json())


        # 结果空列表
        assert_res = []

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

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


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

        # # 从响应结果当中,提取 leave_amount 的值,并更新全局变量当中,leave_amount 的值。
        # setattr(Data, "leave_amount", str(resp.json()["data"]["leave_amount"]))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值