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

news2024/10/3 8:22:07

目录:导读

    • 前言
    • 一、Python编程入门到精通
    • 二、接口自动化项目实战
    • 三、Web自动化项目实战
    • 四、App自动化项目实战
    • 五、一线大厂简历
    • 六、测试开发DevOps体系
    • 七、常用自动化测试工具
    • 八、JMeter性能测试
    • 九、总结(尾部小惊喜)


前言

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

请添加图片描述

请添加图片描述

很容易遇到的一些坑

坑一:

在这里插入图片描述

这个是涉及到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"]))

请添加图片描述

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

在这里插入图片描述

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

一、Python编程入门到精通

请添加图片描述

二、接口自动化项目实战

请添加图片描述

三、Web自动化项目实战

请添加图片描述

四、App自动化项目实战

请添加图片描述

五、一线大厂简历

请添加图片描述

六、测试开发DevOps体系

请添加图片描述

七、常用自动化测试工具

请添加图片描述

八、JMeter性能测试

请添加图片描述

九、总结(尾部小惊喜)

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1089170.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代理IP在保护跨境商家网络安全中的重要作用

在当前全球化的背景下,跨境电商成为一种重要的商业模式,越来越多的商家涌入国际市场,商家们通过互联网平台将商品远销国外,但网络安全风险随之而来。跨境商家因为需要处理大量的在线交易和产品数据,如果未能对这些敏感…

Spark中的Driver、Executor、Stage、TaskSet、DAGScheduler等介绍

工作流程: Driver 创建 SparkSession 并将应用程序转化为执行计划,将作业划分为多个 Stage,并创建相应的 TaskSet。Driver 将 TaskSet 发送给 TaskScheduler 进行调度和执行。TaskScheduler 根据资源情况将任务分发给可用的 Executor 进程执…

KubeVela跨地域的多集群管理方案

随着公司全球化战略的布局,业务呈点状分布在亚太、美东、欧洲等多个地域,云原生kubevela在跨地域多集群管控方面也遇到网络上的互通问题。 在公司网络规划上只允许一个区域的一个VPC跟另一个区域的一个VPC打通,同区域不同机房的网络都可以打通的网络架构基础上,由于一个区…

深度学习系列51:hugging face加速库optimum

1. 普通模型 Optimum是huggingface transformers库的一个扩展包,用来提升模型在指定硬件上的训练和推理性能。Optimum支持多种硬件,不同硬件下的安卓方式如下: 如果是国内安装的话,记得加上-i https://pypi.tuna.tsinghua.edu.c…

五笔字根查询接口,五笔输入法数据

一、接口介绍 可对五笔字根口诀及五笔编码查询,希望能为您学习五笔输入法提供帮助。 二、功能体验 三、产品特点 四、API文档 4.1 五笔字根查询查询 4.1.1接入点说明 查询五笔字根。 4.1.2接口地址 http[s]://route.showapi.com/1861-1?showapi_appid替换自己的值&…

基于springboot实现校园博客系统项目【项目源码+论文说明】

基于springboot实现校园博客系统演示 摘要 随着现在网络的快速发展,网上管理系统也逐渐快速发展起来,网上管理模式很快融入到了许多网站的之中,随之就产生了“校园博客系统”,这样就让校园博客系统更加方便简单。 对于本校园博客…

linux中使用ps查看进程的所有线程

在 Linux 系统中&#xff0c;可以使用 ps 命令和 ps H 命令结合来查看进程的线程信息。ps 命令用于显示系统中当前运行的进程信息&#xff0c;而 ps H 命令则可以显示进程中的所有线程。 使用以下命令可以查看指定进程的所有线程信息&#xff1a; ps H -T <PID>将 替换…

vite+v3批量一次性引入本地图片(简单做法)

效果&#xff1a; 开发步骤&#xff1a; 在assets/fileTypes文件夹中将你需要的png图片导入&#xff0c;并使用文件类型来命名图片(如docx.png)使用import.meta.globEager将assets/fileTypes下所有的png图片引入通过遍历Object.keys(files)使用正则匹配出每个图片的名称&#…

专业吃鸡行家教你秒转高手,掌握绝地求生战斗技巧!

各位吃鸡玩家大家好&#xff01;今天我将为大家分享一些关于提高游戏战斗力的独家技巧和顶级游戏作战干货&#xff01;如果你想成为吃鸡高手&#xff0c;就千万不要错过这篇文章&#xff01; 首先&#xff0c;让我们来谈谈如何提高游戏战斗力。提升游戏战斗力可以帮助您在游戏中…

three.js入门 —— 实现第一个3D案例

前言&#xff1a; three.js入门&#xff0c;根据文档实现第一个3D案例 效果图&#xff1a; 代码实现&#xff1a; const scene new THREE.Scene();//创建一个长方体几何对象Geometryconst geometry new THREE.BoxGeometry(100, 100, 100);//创建一个网络基础材质的材质对象…

swift ui 布局 ——Stack(HStack、VStack、ZStack)

一、HStack 水平布局 将其子视图排列在水平线上 import Foundation import SwiftUI struct MyView: View {var body: some View {HStack{Text("text")Image("yuyin").resizable().frame(width: 102,height: 80)}} } 默认子视图是水平中心对齐的,可添加al…

季涨约3~8%,DRAM合约价大幅回升 | 百能云芯

据TrendForce的研究显示&#xff0c;第4季DRAM与NAND Flash均价将开始全面上涨。特别是DRAM&#xff0c;预计第4季的合约价将季涨幅约在3%到8%之间。然而&#xff0c;这波上涨是否能持续&#xff0c;取决于供应商是否坚守减产策略以及实际需求的回升程度&#xff0c;尤其值得关…

ThreeJS-3D教学九-line的绘制

three.js 画线比较繁琐一些&#xff0c;我们先展示正常的操作&#xff0c;先看效果图&#xff1a; 本案例用到的方法是&#xff1a; LineBasicMaterial 和 LineSegments。 1、材质 Three.js中提供了两种线条材质&#xff1a; LineDashedMaterial const material new THREE.…

微信还有双击功能?可以怎么用呢?

微信已成为每个人日常生活中不可或缺的社交工具&#xff0c;假如没有它&#xff0c;大家会很不习惯不方便。 微信功能不断更新丰富&#xff0c;许多人仅限于聊天刷圈。微信其实还是有很多小技巧的&#xff0c;有很多实用方便的小功能&#xff0c;只是大家平时都不知道。 比如我…

如何处理”此 SAP 系统不是当前编辑对象的原始系统“的问题

今天想在开发机修改一个程序时&#xff0c;跳出了一个弹窗如下&#xff1a; 点卡详细信息&#xff0c;显示如下&#xff1a; 仅在紧急时执行非原始系统的修复 消息编号 TR850 诊断 此 SAP 系统不是当前编辑对象的原始系统。 系统响应 该功能继续执行。 步骤 仅执行紧急修复并在…

什么是美颜SDK?如何创建自定义美颜直播应用?

在今天的数字时代&#xff0c;直播应用变得越来越流行&#xff0c;而美颜SDK已经成为这些应用的不可或缺的一部分。 一、了解直播美颜SDK 在开发之前&#xff0c;了解SDK的功能和特性是至关重要的。这些SDK通常提供肤色识别、皮肤磨皮、特征增强、滤镜效果等功能。目前已经广…

【发烧期间随笔】第一次游戏开发经历的总结与反思

一、前言 这两天三阳了&#xff0c;头疼头晕恶心发烧打喷嚏流鼻涕咳嗽嗓子疼气管疼都找上门来了&#xff0c;这导致一周以来都没学什么东西&#xff0c;无意间又刷到各个游戏厂关于本人目标岗位HC骤减且要求造火箭的能力的消息&#xff0c;这两天一直是在病痛和焦虑中度过的&a…

Unity实现简易坦克移动打炮

功能&#xff1a;坦克可以前后移动、左右旋转、打炮 动态演示效果 静态展示图片 核心代码 1、Bullet.cs挂载在Bullet预设体上 using UnityEngine;public class Bullet : MonoBehaviour {// 移动方向private Vector3 moveDir;// 移动速度private float moveSpeed 2;/// <…

RFID防伪防窜货管理系统—保护品牌声誉和市场秩序的利器

在现代市场经济中&#xff0c;知名品牌的产品常常面临着仿冒和假冒的问题&#xff0c;这给企业的利益和品牌声誉带来了严重的损害&#xff0c;跨区域销售和窜货现象也导致市场秩序的紊乱和价格体系的破坏。 一、系统需求分析 防伪需求&#xff1a;企业需要一种可靠的防伪手段&…

软件测试人必须清楚的测试基础知识详解

一、软件测试概述 1、软件缺陷 软件缺陷&#xff1a;又称之为“Bug”。即计算机软件或程序中存在的某种破坏正常运行能力的问题、错误&#xff0c;或者隐藏的功能缺陷。 缺陷的表现形式&#xff1a; 软件没有实现产品规格说明书所要求的功能模块&#xff1b;软件中出现了产…