编写其它接口的用例+框架根据接口微调

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

新增项目

在这里插入图片描述

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

测试用例的案例如下:
在这里插入图片描述

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

投资项目

在这里插入图片描述

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

测试用例的案例如下:
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值