• 接口测试项目实战,充值接口+取现接口,资深测试带你一文打通...



    前言

    1、充值接口

    首先,我们得去写测试用例,以下仅仅几条,不算完善,仅仅是想跑起来,测一次,你们可自行设计更加全面完善的用例,那么这个expected结果是需要自己在postman上面自己先测一遍,看返回的是什么东西

    在这里插入图片描述

    postman截图:

    在这里插入图片描述

    在代码中实现:

    import unittest
    import os
    import requests
    
    from common.handle_config import conf
    from common.handle_database import db
    from common.handle_excel import Excel
    from common.handle_log import log
    from common.handle_path import DATA_DIR
    from common import myddt
    from jsonpath import jsonpath
    
    
    @myddt.ddt
    class TestReCharge(unittest.TestCase):
        excel = Excel(os.path.join(DATA_DIR, "cases.xlsx"), "recharge")
        cases = excel.read_data()
    
        @classmethod
        def setUpClass(cls):
            """写该用例类执行之前的前置,先登录才有后续的充值操作"""
            """登录获取token,用户id"""
            # 这就涉及到两个接口之间的参数依赖,比如登录接口和充值接口,参数依赖就是token和用户id
            login_url = conf.get("env", "login_url")
            params = {
                "mobile_phone": conf.get("login_test_data", "mobile_phone"),
                "pwd": conf.get("login_test_data", "pwd")
            }
            headers = eval(conf.get("env", "headers"))
            response = requests.request(url=login_url, method="post", json=params, headers=headers)
            res_login = response.json()
            # 提取token
            token = jsonpath(res_login, "$..token")[0]
            cls.token = "Bearer" + " " + token
            # 提取用户id
            cls.member_id = jsonpath(res_login, "$..id")[0]
    
        @myddt.data(*cases)
        def test_recharge(self, item):
            # 第一步:准备数据
            # 接口地址
            url = conf.get("env", "base_url") + item["url"]
            # 请求参数
            if "#member_id#" in item["data"]:
                item["data"] = item["data"].replace("#member_id#", str(self.member_id))
            params = eval(item["data"])
            # 请求头
            headers = eval(conf.get("env", "headers"))
            # 请求头中添加token
            headers["Authorization"] = self.token
            # 需要鉴权
            # 请求方法
            method = item["method"]
            # 预期结果
            expected = eval(item["expected"])
            sql = item["check_sql"]
            # 请求之前的金额
            if sql:
                s_amount = db.find_data(sql.format(params["member_id"]))
                s_money = s_amount[0]["leave_amount"]
            # 第二步:请求接口,获取结果
            response = requests.request(url=url, method=method, json=params, headers=headers)
            res = response.json()
            print("预期结果:", expected)
            print("实际结果:", res)
    
            # 断言
            try:
                self.assertEqual(expected["code"], res["code"])
                self.assertEqual(expected["msg"], res["msg"])
                # 数据库校验
                if sql:
                    # 请求之后的金额
                    e_amount = db.find_data(sql.format(params["member_id"]))
                    e_money = e_amount[0]["leave_amount"]
                    self.assertEqual(float(e_money - s_money), params["amount"])
    
            except AssertionError as e:
                log.error("用例{},执行未通过".format(item["title"]))
                log.exception(e)
                raise e
            else:
                log.info("用例{},执行通过".format(item["title"]))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83

    请添加图片描述

    请添加图片描述

    很容易遇到的一些坑

    坑一:

    在这里插入图片描述

    这个是涉及到Decimal类型数据的校验,可以将decimal类型的数据转换为浮点数

    请添加图片描述

    坑二:

    在这里插入图片描述

    涉及到局部变量和全局变量

    请添加图片描述

    正确的代码应该是这样:

    请添加图片描述

    坑三:

    在这里插入图片描述

    这个是报错,布尔值无法进行切片操作,说明返回的对象不是token,而是False,那就说明取不到token,取不到token的原因,再往上推测,那就是登录没成功,失败了。

    登录失败,为什么会登录失败,说明有以下几种情形:请求路径、请求参数、请求头、请求方式,涉及到这四个,需要靠自己逐一排查,像这个问题就是路径错了

    请添加图片描述

    2、取现接口

    同样的,先设计测试用例…此处省略一万字

    在这里插入图片描述

    再上代码:

    import unittest
    import os
    import requests
    
    from common.handle_config import conf
    from common.handle_database import db
    from common.handle_excel import Excel
    from common.handle_log import log
    from common.handle_path import DATA_DIR
    from common import myddt
    from jsonpath import jsonpath
    
    
    @myddt.ddt
    class TestWithdraw(unittest.TestCase):
        excel = Excel(os.path.join(DATA_DIR, "cases.xlsx"), "withdraw")
        cases = excel.read_data()
    
        @classmethod
        def setUpClass(cls):
            """写该用例类执行之前的前置,先登录才有后续的充值操作"""
            """登录获取token,用户id"""
            # 这就涉及到两个接口之间的参数依赖,比如登录接口和充值接口,参数依赖就是token和用户id
            login_url = conf.get("env", "login_url")
            params = {
                "mobile_phone": conf.get("login_test_data", "mobile_phone"),
                "pwd": conf.get("login_test_data", "pwd")
            }
            headers = eval(conf.get("env", "headers"))
            response = requests.request(url=login_url, method="post", json=params, headers=headers)
            res_login = response.json()
            # 提取token
            token = jsonpath(res_login, "$..token")[0]
            cls.token = "Bearer" + " " + token
            # 提取用户id
            cls.member_id = jsonpath(res_login, "$..id")[0]
    
        @myddt.data(*cases)
        def test_withdraw(self, item):
            # 第一步:准备数据
            # 接口地址
            url = conf.get("env", "base_url") + item["url"]
            # 请求参数
            if "#member_id#" in item["data"]:
                item["data"] = item["data"].replace("#member_id#", str(self.member_id))
            params = eval(item["data"])
            # 请求头
            headers = eval(conf.get("env", "headers"))
            # 请求头中添加token
            headers["Authorization"] = self.token
            # 需要鉴权
            # 请求方法
            method = item["method"]
            # 预期结果
            expected = eval(item["expected"])
            sql = item["check_sql"]
            # 请求之前的金额
            if sql:
                s_amount = db.find_data(sql.format(params["member_id"]))
                s_money = s_amount[0]["leave_amount"]
            # 第二步:请求接口,获取结果
            response = requests.request(url=url, method=method, json=params, headers=headers)
            res = response.json()
            print("预期结果:", expected)
            print("实际结果:", res)
    
            # 断言
            try:
                self.assertEqual(expected["code"], res["code"])
                self.assertEqual(expected["msg"], res["msg"])
                # 数据库校验
                if sql:
                    # 请求之后的金额
                    e_amount = db.find_data(sql.format(params["member_id"]))
                    e_money = e_amount[0]["leave_amount"]
                    self.assertEqual(float(s_money - e_money), params["amount"])
    
            except AssertionError as e:
                log.error("用例{},执行未通过".format(item["title"]))
                log.exception(e)
                raise e
            else:
                log.info("用例{},执行通过".format(item["title"]))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83

    请添加图片描述

    提现的代码基本和充值一样,但是除了命名改一下,目前只需改这一行代码即可,附上运行结果截图

    在这里插入图片描述

    下面是我整理的2023年最全的软件测试工程师学习知识架构体系图

    一、Python编程入门到精通

    请添加图片描述

    二、接口自动化项目实战

    请添加图片描述

    三、Web自动化项目实战

    请添加图片描述

    四、App自动化项目实战

    请添加图片描述

    五、一线大厂简历

    请添加图片描述

    六、测试开发DevOps体系

    请添加图片描述

    七、常用自动化测试工具

    请添加图片描述

    八、JMeter性能测试

    请添加图片描述

    九、总结(尾部小惊喜)

    没有什么事情是轻而易举的,只有不停地学习、不断地探索和付出,才能取得成功。坚持自己的信念,努力追求梦想,终将收获无尽的喜悦和真正的幸福!

    在漫漫人生路上,不论遇到多少困难和挑战,都要保持坚定的信念和无限的勇气。相信自己的潜力,敢于追求,努力奋斗,你将点亮属于自己的璀璨星途!

    不要让过去的失败束缚你,也不要让未来的担忧打消你的勇气。用每一次努力和坚持,书写出属于自己的辉煌篇章,成就那个无限可能的你!

  • 相关阅读:
    C#获取声音信号并通过FFT得到声音频谱
    2023年中国自动化微生物样本处理系统竞争现状及行业市场规模分析[图]
    外包干了3天,技术退步明显.......
    Android Studio实现内容丰富的安卓校园超市
    好用的PDF解密工具哪个好?
    【云原生】FlexCloud可视化操作用户体验
    点云采样方法
    插件_创蓝图文滑动验证码
    【JS 构造|原型|原型链|继承(圣杯模式)|ES6类语法】下篇
    [附源码]计算机毕业设计基于Springboot设备运维平台出入库模块APP
  • 原文地址:https://blog.csdn.net/m0_70102063/article/details/133810169