新增项目
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_replace import replace_case_with_re
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()
@pytest.mark.usefixtures("class_init")
class TestRecharge:
@pytest.mark.parametrize("case", cases)
def test_recharge(self,case,class_init):
chare_data = class_init
# 1、下一个接口的请求数据中,需要替换,替换为上一个接口中提取的数据。
case = replace_case_with_re(case,chare_data)
# 2、把替换之后的请求数据(json格式的字符串),转换成一个字典
req_dict = json.loads(case["req_data"])
# 3、发起请求,并接收响应结果
if hasattr(chare_data,"token"):
resp = mq.send_requests(case["method"], case["url"], req_dict, token=getattr(chare_data,"token"))
else:
resp = mq.send_requests(case["method"], case["url"], req_dict)
logger.info(resp.json())
# 结果空列表
assert_res = []
# 5、断言响应结果中的数据
if case["assert_list"]:
response_check_res = myassert.assert_response_value(case["assert_list"], resp.json())
assert_res.append(response_check_res)
if False in assert_res:
pass
else:
# 4、提取响应结果中的数据,并设置为全局变量
if case["extract"]:
# 调用提取处理函数
extract_data_from_response(case["extract"], resp.json(),chare_data)
# 6、断言数据库 - 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
测试用例的案例如下:
================================================================================================
审核项目
项目文档:
=========================================================================
Data类,是所有的测试类共享的全局变量。所有的测试类,都是向Data类存数据,取数据。
如果是多接口并发的(有2-3个接口用例同时执行), 同时向Data类存数据就会出现问题
为了在多并发的情况下,不影响各个接口类的执行,
每一个接口类,都使用一个Data类的实例化对象来存数据,取数据。
1、定义了一个conftest.py中,class级别的fixture
2、在提取方法、替换方法,都添加一个参数:Data类对象。
提取方法当中,是去向Data类对象设置属性和值
替换方法当中,向Data类对象当中,取属性值
3、在测试类当中:
调用class级别的fixture,接收它的返回值
在调用的提取方法、替换方法当中,传参,传Data类对象
# 存储全局变量 - 接口返回值中提取的
class Data:
user = "15886760471"
password = "12345678"
admin = "15886760472"
admin_pwd = "12345678"
global_user = [user,admin]
=========================================================================
import pytest
from common.my_data import Data
from common.my_phone import is_exist_phone
from common.my_requests import MyRequests
from common.py_log import LoggerHandler
logger = LoggerHandler()
@pytest.fixture(scope="session", autouse=True)
def global_init():
# 配置的全局用户信息 - 要确保一定是存在的
# 1、从 Data 里面拿出用户数据
# 2、调用 sql 从数据库查询。如果不存在则注册
for user in Data.global_user:
res = is_exist_phone(user)
if not res:
logger.info("全局使用账号 {} 不存在。现在注册一个用户".format(user))
# 调用注册方法
req_data = {"mobile_phone":user,"pwd":12345678}
res = MyRequests().send_requests("post", "http://api.lemonban.com/futureloan/member/recharge",req_data)
logger.info("注册结果为:{}".format(res.text))
@pytest.fixture(scope="class")
def class_init():
# 实例化Data类对象,作为每一个测试类的类级别的变量。
calss_share_data = Data()
yield calss_share_data
===============================================================================
import jsonpath
from common.my_data import Data
from common.py_log import LoggerHandler
logger = LoggerHandler()
def extract_data_from_response(extract_epr, response_dict, chare_data_obj:Data):
"""
从响应结果当中提取值,并设置为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表达式
logger.info("提取的变量名是:{},提取到的jsonpath表达式是:{}".format(key,value))
result = jsonpath.jsonpath(response_dict,value)
logger.info("jsonpath 提取之后的值为:{}".format(result))
# jsonpath找了就是列表,找不到返回False
# 如果提取到了真正的值,那么将它设置为Data类的属性。key是全局变量名,result[0]就是提取后的值
if result:
setattr(chare_data_obj, key, str(result[0]))
logger.info("提取的变量名是: {},是提取到的值是:{},并设置为 Data 类实例对象的属性和值。".format(key, str(result[0])))
===================================================================================
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_replace import replace_case_with_re
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()
@pytest.mark.usefixtures("class_init")
class TestRecharge:
@pytest.mark.parametrize("case", cases)
def test_recharge(self,case,class_init):
chare_data = class_init
# 1、下一个接口的请求数据中,需要替换,替换为上一个接口中提取的数据。
case = replace_case_with_re(case,chare_data)
# 2、把替换之后的请求数据(json格式的字符串),转换成一个字典
req_dict = json.loads(case["req_data"])
# 3、发起请求,并接收响应结果
if hasattr(chare_data,"token"):
resp = mq.send_requests(case["method"], case["url"], req_dict, token=getattr(chare_data,"token"))
else:
resp = mq.send_requests(case["method"], case["url"], req_dict)
logger.info(resp.json())
# 结果空列表
assert_res = []
# 5、断言响应结果中的数据
if case["assert_list"]:
response_check_res = myassert.assert_response_value(case["assert_list"], resp.json())
assert_res.append(response_check_res)
if False in assert_res:
pass
else:
# 4、提取响应结果中的数据,并设置为全局变量
if case["extract"]:
# 调用提取处理函数
extract_data_from_response(case["extract"], resp.json(),chare_data)
# 6、断言数据库 - 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"]))
测试用例的案例如下:
==========================================================================
投资项目

===========================================================
测试用例的案例如下:
该博客探讨了在接口自动化测试中如何处理数据管理,包括类级别的前置操作、接口间的参数关联以及响应数据的提取和断言。通过实例展示了如何确保预先存在的用户账号、接口返回值的提取和复用,以及如何进行数据库断言。同时,博客还介绍了全局变量的管理,确保在多接口并发执行时的数据一致性。





3982

被折叠的 条评论
为什么被折叠?



