当前位置: 首页 > news >正文

【Unittest】Requests实现小程序项目接口测试

文章目录

    • 一、搭建接口测试框架
    • 二、初始化日志
    • 三、定义全局变量
    • 四、封装接口
    • 五、编写测试用例
    • 六、生成测试报告

一、搭建接口测试框架

目录结构如下。

在这里插入图片描述

二、初始化日志

在utils.py文件中编写如下如下代码,初始化日志。

# 导入app.py全局变量文件
import app
import logging
from logging import handlers# 定义初始化日志的函数
def init_logging():# 创建日志器logger = logging.getLogger()# 设置日志等级logger.setLevel(logging.INFO)# 创建控制台处理器sh = logging.StreamHandler()# 创建文件处理器fh = logging.handlers.TimedRotatingFileHandler(app.BASE_DIR+"/log/mimi.log",when='M',interval=5,backupCount=3,encoding='utf-8')# 定义日志的格式(格式化器)fmt = "%(asctime)s %(levelname)s [%(name)s] [%(filename)s(%(funcName)s:%(lineno)d)] - %(message)s"formatter = logging.Formatter(fmt)# 将格式化器添加到处理器sh.setFormatter(formatter)fh.setFormatter(formatter)# 将处理器添加到日志器当中logger.addHandler(sh)logger.addHandler(fh)

在api下的init.py文件中编写如下代码,进行实际的初始化日志。

# 导入utils.py中编写的初始化日志的函数和logging模块
# 然后调用初始化日志的函数
# 最后测试日志是不是能够打印# 导包
import utils
import logging# 初始化日志
utils.init_logging()# 使用logging模块打印日志
logging.info("Test初始化日志后能不能打印日志")

三、定义全局变量

在app.py文件中编写如下代码,定义全局变量。

# 1 测试项目接口的代码项目地址
import osBASE_DIR = os.path.dirname(os.path.abspath(__file__))
print(BASE_DIR)
# 2 测试项目服务器的根URL
BASE_URL = "http://www.nidexiangmu.com:13140"
# 3 Token(令牌,维持登录状态)
TOKEN = "bd8f3599604107c0d7eebe1ffe15d84a"
# 4 HEADERS(请求一般都是固定的)
HEADERS = {"Content-Type":"application/json", "token": TOKEN}
# 5 Code(由微信小程序前端生成,用于发送给服务器,来获取token)
CODE = "023tA6DW1eYZoY0g0JzW1bY5DW1tA6DK"

四、封装接口

在api下创建ego_api.py项目,根据API文档编写如下格式的代码,封装所有待测试接口。

# 导入requests模块
import requests
import app
# 创建API接口类
class EgoApi:def __init__(self):# 定义轮播图的urlself.banner_url = app.BASE_URL + "/api/v1/banner/1"# 定义专题栏位的urlself.theme_url = app.BASE_URL + "/api/v1/theme"# 最近新品的URLself.recent_product_url = app.BASE_URL + "/api/v1/product/recent"# 获取商品分类urlself.category_url = app.BASE_URL + "/api/v1/category/all"# 获取商品分类下的某个商品self.by_category_url = app.BASE_URL + "/api/v1/product/by_category"# 获取商品详情self.product_detail_url = app.BASE_URL + "/api/v1/product"# 获取用户订单列表self.order_list_url = app.BASE_URL + "/api/v1/order/by_user"# 创建订单URLself.create_order_url = app.BASE_URL + "/api/v1/order"# 查看订单详情self.order_detail_url = app.BASE_URL + "/api/v1/order"# 获取Tokenself.get_token_url = app.BASE_URL + "/api/v1/token/user"# 验证token的urlself.verify_token_url = app.BASE_URL + "/api/v1/token/verify"# 获取地址信息的URLself.get_address_url = app.BASE_URL + "/api/v1/address"# 轮播图def get_banner(self):return requests.get(self.banner_url)# 专题栏位def theme(self, params):return requests.get(self.theme_url, params={"ids":params})# 最近新品def recent_product(self):return requests.get(self.recent_product_url)# 获取商品分类def get_product_category(self):return requests.get(self.category_url)# 获取商品分类下的某个商品def by_category(self, params):return requests.get(self.by_category_url, params={"id":params})# 获取商品信息def get_product_detail(self, product_id):return requests.get(self.product_detail_url + "/" + str(product_id))# 获取用户订单列表(登录后的接口)def get_order_list(self, page):return requests.get(self.order_list_url, params={"page":page}, headers=app.HEADERS)# 创建订单def create_order(self, jsondata):return requests.post(self.create_order_url, json=jsondata, headers=app.HEADERS)# 查看订单def get_order_detail(self, order_id):return requests.get(self.order_detail_url + "/" + str(order_id), headers=app.HEADERS)# 获取Tokendef get_token(self, code):return requests.post(self.get_token_url, json={"code": code})# Token验证接口def verify_token(self, token):return requests.post(self.verify_token_url, json={"token": token})# 获取地址信息def get_address(self):return requests.get(self.get_address_url, headers=app.HEADERS)

五、编写测试用例

在script下创建test_ego.py文件,根据接口测试用例文档编写测试代码,以下代码为正向测试用例示例。

import unittest
import logging
import app
from api.ego_api import EgoApiclass TestEgo(unittest.TestCase):def setUp(self):# 手动设置tokenapp.HEADERS["token"] = ""@classmethoddef setUpClass(cls):cls.ego_api = EgoApi()def test01_get_banner_success(self):# 使用实例化的ego_api发送获取轮播图的接口请求response = self.ego_api.get_banner()# 打印响应数据logging.info("正向用例获取轮播图的测试结果为:{}".format(response.json()))# 断言结果self.assertEqual(200, response.status_code)self.assertEqual("首页轮播图", response.json().get("description"))def test02_get_theme_success(self):response = self.ego_api.theme("1,2,3")logging.info("正向用例获取专题栏位的测试结果为:{}".format(response.json()))self.assertEqual(200, response.status_code)self.assertEqual("专题栏位一", response.json()[0].get("name"))def test03_get_recent_product(self):response = self.ego_api.recent_product()logging.info("测试获取最近新品接口:{}".format(response.json()))self.assertEqual(200, response.status_code)self.assertEqual("芹菜 半斤", response.json([0].get("name")))def test04_get_product_category(self):response = self.ego_api.get_product_category()logging.info("测试获取商品分类接口:{}".format(response.json()))self.assertEqual(200, response.status_code)self.assertEqual("果味", response.json([0].get("name")))# 获取商品分类下的商品def test05_get_product(self):# 使用封装的接口获取商品分类下的商品response = self.ego_api.by_category(2)# 打印结果logging.info("获取商品分类下的商品为:{}".format(response.json()))# 断言self.assertEqual(200, response.status_code)self.assertEqual("梨花带雨 3个", response.json()[0].get("name"))# 获取商品详情def test06_get_product_detail(self):# 使用封装的接口获取商品详情response = self.ego_api.get_product_detail(2)# 打印结果logging.info("获取商品商品详情:{}".format(response.json()))# 断言self.assertEqual(200, response.status_code)self.assertEqual("梨花带雨 3个", response.json().get("name"))

六、生成测试报告

在run_suite.py文件中编写如下代码,可生成测试报告。

# 导包
import unittest
import app
from script.test_ego import TestEgo
from lib.HTMLTestRunner import HTMLTestRunner
# 创建测试套件
suite = unittest.TestSuite()
# 将测试用例的代码添加到测试套件中
suite.addTest(unittest.makeSuite(TestEgo))
# 定义测试报告的路径和名称
report_name = app.BASE_DIR + "/report/mini.html"
# 使用HTMLTestRunner运行测试套件生成测试报告
with open(report_name, 'wb') as f:# 初始化HTMLTestRunnerrunner = HTMLTestRunner(f, verbosity=1, title="Ego微商", description="测试Ego微商的常见接口")# 使用实例化的runner运行测试套件,并生成测试报告runner.run(suite)

七、运行结果

1、日志结果如下:

在这里插入图片描述

2、测试报告结果如下(生成的测试报告位于report文件夹下):

在这里插入图片描述

相关文章:

【Unittest】Requests实现小程序项目接口测试

文章目录 一、搭建接口测试框架二、初始化日志三、定义全局变量四、封装接口五、编写测试用例六、生成测试报告 一、搭建接口测试框架 目录结构如下。 二、初始化日志 在utils.py文件中编写如下如下代码,初始化日志。 # 导入app.py全局变量文件 import app import l…...

Mac 搭建本地服务器

文章目录 一、启动服务器二、添加文件到本地服务三、手机/其他电脑 访问本机服务器 MacOS 自带Apatch 服务器。所以我这里选择Apatch服务器搭建 一、启动服务器 在safari中输入 http://127.0.0.1/ ,如果页面出现 it works,则代表访问成功。启动服务器 …...

区块链基础之编写合约二

一、了解solidity中的关键字。 二、了解solidity中的类型。 三、编写合约 1.这里列出一些solidity中的关键字,有哪些。 pragma 作用:是告知编译器如何处理源代码的通用指令(例如, pragma once )。public 作用&#…...

【前端基础】js 如何判断一个值是数组

在JavaScript中,可使用不同的方法来判断一个值是否是一个数组。以下是一些常用的方法: 使用 Array.isArray() 方法: if (Array.isArray(value)) {// 值是一个数组 } else {// 值不是一个数组 }Array.isArray() 方法是最简单和推荐的方法&…...

Linux之NFS服务器

目录 Linux之NFS服务器 简介 NFS背景介绍 生产应用场景 NFS工作原理 NFS工作流程图 流程 NFS的安装 安装nfs服务 安装rpc服务 启动rpcbind服务同时设置开机自启动 启动nfs服务同时设置开机自启动 NFS的配置文件 主配置文件分析 示例 案例 --- 建立NFS服务器&#…...

ES delete_by_query条件删除的几种方式

es 查询删除的几种方式 1.根据id删除 #根据id删除 POST /indexname/_delete_by_query {"query": { "match": {"id": "100000"}} } 2.根据多个id删除 #根据多个id删除 POST /indexname/_delete_by_query {"query": {"…...

1.springboot 集成elasticsearch组件

1.前置条件已经安装和搭建好了elasticsearch中间件 一&#xff1a;项目中引入elasticsearch相关依赖 我安装的elasticsearch版本是7.10.2 对应依赖的版本保持一致 此处省略springboot 搭建及必要的依赖项 <dependency><groupId>org.elasticsearch.client</group…...

【学习笔记】元学习如何解决计算机视觉少样本学习的问题?

目录 1 计算机视觉少样本学习 2 元学习 3 寻找最优初始参数值方法&#xff1a;MAML 3.1 算法步骤 3.2 代码&#xff1a;使用MAML 和 FO-MAML、任务增强完成Few-shot Classification 4 距离度量方法&#xff1a;Siamese Network,ProtoNet,RN 4.1 孪生网络&#xff08;Sia…...

【C语言】17-函数-3

1. 链接属性 当组成一个程序的各个源文件分别被编译之后,所有的目标文件以及那些从一个或多个函数库中引用的函数将链接在一起,形成可执行程序。然而,如果相同的标识符出现在几个不同的源文件中时,它们是表示同一个实体,还是表示不同的实体?标识符的链接属性决定如何处理…...

人工智能:为你提供的未来工作岗位

随着科技的快速发展&#xff0c;人工智能(Artificial Intelligence,AI)正逐渐渗透到各个领域。本文探讨一下人工智能可以提供的工作岗位&#xff0c;以期帮助大家更好地了解这个新兴行业的就业前景。 文章目录 1 机器学习工程师2 数据科学家3 自然语言处理工程师4 机器视觉工程…...

HashMap、LinkedHashMap、ConcurrentHashMap、ArrayList、LinkedList的底层实现。

HashMap、LinkedHashMap、ConcurrentHashMap、ArrayList、LinkedList的底层实现。 HashMap相关问题 1、你用过HashMap吗&#xff1f;什么是HashMap&#xff1f;你为什么用到它&#xff1f;用过&#xff0c;HashMap是基于哈希表的Map接口的非同步实现&#xff0c; 它允许null键…...

flink学习之广播流与合流操作demo

广播流是什么&#xff1f; 将一条数据广播到所有的节点。使用 dataStream.broadCast() 广播流使用场景&#xff1f; 一般用于动态加载配置项。比如lol&#xff0c;每天不断有人再投诉举报&#xff0c;客服根本忙不过来&#xff0c;腾讯内部做了一个判断&#xff0c;只有vip3…...

PPT架构师架构技能图

PPT架构师架构技能图 目录概述需求&#xff1a; 设计思路实现思路分析1.软素质2.核心输出&#xff08;office输出&#xff09; 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,ma…...

STM32微控制器的低功耗模式

STM32微控制器的低功耗模式(Low-power modes):Sleep mode、Stop mode 和 Standby mode。 1.1 Sleep Mode(睡眠模式): 把STM32微控制器当作一位劳累的工人,他在工作过程中需要短暂的休息。在Sleep模式下,微控制器会关闭一部分电路,减小功耗,但仍然保持对中央处理单…...

tensorflow QAT

tensorflow qat https://www.wpgdadatong.com/tw/blog/detail/70672 在边缘运算的重点技术之中&#xff0c;除了简化复杂的模块构架&#xff0c;来简化参数量以提高运算速度的这项模块轻量化网络构架技术之外。另一项技术就是各家神经网络框架&#xff08;TensorFlow、Pytorc…...

[杂谈]-快速了解LoRaWAN网络以及工作原理

快速了解LoRaWAN网络以及工作原理 文章目录 快速了解LoRaWAN网络以及工作原理1、LoRaWAN网络元素1.1 终端设备&#xff08;End Devices&#xff09;1.2 网关&#xff08;Gateways&#xff09;1.3 网络服务器&#xff08;Net Server&#xff09;1.4 应用服务器&#xff08;Appli…...

MySQL--MySQL表的增删改查(基础)

排序&#xff1a;ORDER BY 语法&#xff1a; – ASC 为升序&#xff08;从小到大&#xff09; – DESC 为降序&#xff08;从大到小&#xff09; – 默认为 ASC SELECT … FROM table_name [WHERE …] ORDER BY column [ASC|DESC], […]; *** update...

Vue中启动提示polyfill缺少-webpack v5版本导致

安装 npm i node-polyfill-webpack-plugin 因为我们的项目使用webpack v5&#xff0c;其中polyfill Node核心模块被删除。所以&#xff0c;我们安装它是为了在项目中访问这些模块 vue.config.js文件 const { defineConfig } require("vue/cli-service"); const No…...

Hugging Face实战-系列教程3:AutoModelForSequenceClassification文本2分类

&#x1f6a9;&#x1f6a9;&#x1f6a9;Hugging Face 实战系列 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在notebook中进行 本篇文章配套的代码资源已经上传 下篇内容&#xff1a; Hugging Face实战-系列教程4&#xff1a;padding与attention_mask ​输出我…...

《TCP/IP网络编程》阅读笔记--Socket类型及协议设置

目录 1--协议的定义 2--Socket的创建 2-1--协议族&#xff08;Protocol Family&#xff09; 2-2--Socket类型&#xff08;Type&#xff09; 3--Linux下实现TCP Socket 3-1--服务器端 3-2--客户端 3-3--编译运行 4--Windows下实现 TCP Socket 4-1--TCP服务端 4-2--TC…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

Xcode 16 集成 cocoapods 报错

基于 Xcode 16 新建工程项目&#xff0c;集成 cocoapods 执行 pod init 报错 ### Error RuntimeError - PBXGroup attempted to initialize an object with unknown ISA PBXFileSystemSynchronizedRootGroup from attributes: {"isa">"PBXFileSystemSynchro…...

【Ftrace 专栏】Ftrace 参考博文

ftrace、perf、bcc、bpftrace、ply、simple_perf的使用Ftrace 基本用法Linux 利用 ftrace 分析内核调用如何利用ftrace精确跟踪特定进程调度信息使用 ftrace 进行追踪延迟Linux-培训笔记-ftracehttps://www.kernel.org/doc/html/v4.18/trace/events.htmlhttps://blog.csdn.net/…...

CppCon 2015 学习:Reactive Stream Processing in Industrial IoT using DDS and Rx

“Reactive Stream Processing in Industrial IoT using DDS and Rx” 是指在工业物联网&#xff08;IIoT&#xff09;场景中&#xff0c;结合 DDS&#xff08;Data Distribution Service&#xff09; 和 Rx&#xff08;Reactive Extensions&#xff09; 技术&#xff0c;实现 …...