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"]))