postman接口测试—Restful接口开发与测试
开发完接口,接下来我们需要对我们开发的接口进行测试。接口测试的方法比较多,使用接口工具或者Python来测试都可以,工具方面比如之前我们学习过的Postman或者Jmeter ,Python脚本测试可以使用Requests + unittest来测试。
测试思路
功能测试:数据的增删改查
异常测试:未授权,参数异常等
Postman测试
使用测试工具Postman测试结果如下所示:
user接口测试
查询所有用户
创建用户
修改用户
删除用户
未授权测试
groups接口测试
查询所有groups数据
修改group数据
删除groups
Requests+Unittest
在api
目录下面新建一个test_unittest.py
,代码实现如下:
tests_unittest.py
import requests
import unittestclass UserTest(unittest.TestCase):def setUp(self):self.base_url='http://127.0.0.1:8000/users'self.auth=('51zxw','zxw20182018')def test_get_user(self):r=requests.get(self.base_url+'/1/',auth=self.auth)result=r.json()self.assertEqual(result['username'],'51zxw')self.assertEqual(result['email'],'51zxw@163.com')def test_add_user(self):form_data={'username':'zxw222','email':'zxw668@qq.com','groups':'http://127.0.0.1:8000/groups/2/'}r=requests.post(self.base_url+'/',data=form_data,auth=self.auth)result=r.json()self.assertEqual(result['username'],'zxw222')def test_delete_user(self):r=requests.delete(self.base_url+'/11/',auth=self.auth)self.assertEqual(r.status_code,204)def test_update_user(self):form_data={'email':'2222@163.com'}r=requests.patch(self.base_url+'/2/',auth=self.auth,data=form_data)result=r.json()self.assertEqual(result['email'],'2222@163.com')def test_no_auth(self):r=requests.get(self.base_url)result=r.json()self.assertEqual(result['detail'],'Authentication credentials were not provided.')class GroupTest(unittest.TestCase):def setUp(self):self.base_url='http://127.0.0.1:8000/groups'self.auth=('51zxw','zxw20182018')def test_group_developer(self):r=requests.get(self.base_url+'/7/',auth=self.auth)result=r.json()self.assertEqual(result['name'],'Developer')def test_add_group(self):form_data={'name':'Pm'}r=requests.post(self.base_url+'/',auth=self.auth,data=form_data)result=r.json()self.assertEqual(result['name'],'Pm')def test_update_group(self):form_data={'name':'Boss'}r=requests.patch(self.base_url+'/6/',auth=self.auth,data=form_data)result=r.json()self.assertEqual(result['name'],'Boss')def test_detele_group(self):r=requests.delete(self.base_url+'/6/',auth=self.auth)self.assertEqual(r.status_code,204)if __name__ == '__main__':unittest.main()
Django自带测试模块
打开api
目录下面的tests
文件,编写如下测试代码
tests.py
from django.test import TestCase
import requests# Create your tests here.
class UserTest(TestCase):def setUp(self):self.base_url='http://127.0.0.1:8000/users'self.auth=('51zxw','xxxxx')def test_get_user(self):r=requests.get(self.base_url+'/1/',auth=self.auth)result=r.json()self.assertEqual(result['username'],'51zxw')self.assertEqual(result['email'],'zxw886@qq.com')# @unittest.skip('skip add user')def test_add_user(self):form_data={'username':'zxw222','email':'zxw668@qq.com','groups':'http://127.0.0.1:8000/groups/2/'}r=requests.post(self.base_url+'/',data=form_data,auth=self.auth)result=r.json()self.assertEqual(result['username'],'zxw222')# @unittest.skip('skip test_delete_user')def test_delete_user(self):r=requests.delete(self.base_url+'/11/',auth=self.auth)self.assertEqual(r.status_code,204)def test_update_user(self):form_data={'email':'2222@163.com'}r=requests.patch(self.base_url+'/2/',auth=self.auth,data=form_data)result=r.json()self.assertEqual(result['email'],'2222@163.com')def test_user_already_exists(self):form_data = {'username': 'zxw222', 'email': 'zxw668@qq.com', 'groups': 'http://127.0.0.1:8000/groups/2/'}r = requests.post(self.base_url + '/', data=form_data, auth=self.auth)result = r.json()#预期返回值:{"username":["A user with that username already exists."]}self.assertEqual(result['username'][0], 'A user with that username already exists.')def test_no_auth(self):r=requests.get(self.base_url)result=r.json()self.assertEqual(result['detail'],'Authentication credentials were not provided.')class GroupTest(TestCase):def setUp(self):self.base_url='http://127.0.0.1:8000/groups'self.auth=('51zxw','xxxxxx')def test_group_developer(self):r=requests.get(self.base_url+'/3/',auth=self.auth)result=r.json()self.assertEqual(result['name'],'Pm')# @unittest.skip('skip test_add_group')def test_add_group(self):form_data={'name':'Leader'}r=requests.post(self.base_url+'/',auth=self.auth,data=form_data)result=r.json()self.assertEqual(result['name'],'Leader')def test_update_group(self):form_data={'name':'Boss'}r=requests.patch(self.base_url+'/6/',auth=self.auth,data=form_data)result=r.json()self.assertEqual(result['name'],'Boss')def test_detele_group(self):r=requests.delete(self.base_url+'/6/',auth=self.auth)self.assertEqual(r.status_code,204)
运行方式:打开cmd使用如下命令来运行即可:
D:\django_restful>python manage.py test
上面命令是默认测试全部的用例,如果想测试部分用例则可以使用如下命令:
测试指定的测试类
D:\django_restful>python manage.py test api.tests.UserTest
测试具体的某一条具体用例
D:\django_restful>python manage.py test api.tests.UserTest.test_get_user
报错相关
1.迁移数据库时没有权限写入
File "C:\Users\jli75\AppData\Local\Programs\Python\Python37\lib\site-packages\MySQLdb\connections.py", line 280, in query_mysql.connection.query(self, query)
django.db.utils.InternalError: (7, "Error on rename of '.\\httprunnermanager\\#sql-1178_7.frm' to '.\\httprunnermanager\\djcelery_taskstate.frm' (Errcode: 13 - Permission denied)")
原因:可能是杀毒软件通过阻止修改frm文件来解决此问题。通过在杀毒软件威胁防护高级选项中禁用按访问扫描,并杀毒软件设置为忽略这些扩展名来解决此问题
- 迁移数据库时没有清除之前的迁移文件
migrations
File "C:\Users\jli75\AppData\Local\Programs\Python\Python37\lib\site-packages\MySQLdb\connections.py", line 280, in query_mysql.connection.query(self, query)
_mysql_exceptions.OperationalError: (1050, "Table 'djcelery_crontabschedule' already exists")
解决方案:删除migrations
文件夹即可。
- setting配置错误
raise MigrationSchemaMissing("Unable to create the django_migrations table (%s)" % exc)
django.db.migrations.exceptions.MigrationSchemaMissing: Unable to create the django_migrations table ((1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(6) NOT NULL)' at line 1"))
解决方案:Django2.1不再支持MySQL5.5,必须5.6版本以上 可以使用如下命令 查看当前Mysql版本
mysql -V
mysql Ver 8.0.1-dmr for Win64 on x86_64 (MySQL Community Server (GPL))
【软件测试行业现状】2023年干测试,约等于49年入国军。未来已寄..测试人该何去何从?【自动化测试、软件测试面试、性能测试】
相关文章:

postman接口测试—Restful接口开发与测试
开发完接口,接下来我们需要对我们开发的接口进行测试。接口测试的方法比较多,使用接口工具或者Python来测试都可以,工具方面比如之前我们学习过的Postman或者Jmeter ,Python脚本测试可以使用Requests unittest来测试。 测试思路…...
RK3568-emmc控制器
emmc控制器 eMMC主机控制器具有高度的可配置性和可编程性,并提供高性能的eMMC主机控制器,以AXI作为数据传输的总线接口(主接口),以AHB作为其从接口。 它支持以下功能: - 支持SD-HCI主机版本4模式或更少的 …...
02-操作符及类型转换与控制流程语句
操作符及类型转换与控制流程语句 1.操作符1.1.算数运算符正常的数据运算进行数据运算时,除外,其他运算符可以自动将字符串数字隐形转成数字 1.2.一元运算符JavaScript中有8种常用的一元运算符 (正号)1.的第一种用法:进行数据相加2.放在数据的前面&#…...
判断一个字符串中是否包含中文字符
下面我将为你提供三种常用的方法: 方法一:使用正则表达式 import java.util.regex.Pattern; import java.util.regex.Matcher;public class ChineseCharacterChecker {public static boolean containsChineseCharacters(String input) {String regex …...

软件测试面试怎样介绍自己的测试项目?会问到什么程度?
想知道面试时该怎样介绍测试项目?会问到什么程度?那就需要换位思考,思考HR在这个环节想知道什么。 HR在该环节普遍想获得的情报主要是下面这2个方面: 1)应聘者的具体经验和技术能力, 2)应聘者的…...

莫名其妙el-table不显示问题
完全复制element-ui中table代码,发现表格仍然不显示,看别人都说让降低版本,可我不想降低啊,不然其他组件有可能用不了,后来发现可以通过配置vite.config.js alias: {: path.resolve(__dirname, src),vue: vue/dist/vue…...
ElasticSearch复杂数据类型
ElasticSearch入门到实战教程:点击查看 1. 对象类型(object) 一个字段下需要多种类型的属性字段,属性 attr 有身高、体重,添加映射语句如下: POST indexname/_mapping {"properties": {"…...

JavaScript_Pig Game保存当前分数
上个文章我们基本上完成了摇色子和切换当前玩家的功能。 现在我们开始写用户选择不再摇骰子的话,我们将用户的当前分数存入到持有分数中! ● 首先我们应该利用一个数组去存储两个用户的分数 const scores [0, 0];● 接着我们利用数组来对分数进行累…...

2023/10/30 JAVA学习
JAVA浮点型运算会出现精度问题 如果没break,不会立刻停止,会执行下一个语句,并且不会判断条件,执行完后break 也可以这样写定义动态数组 两个变量地址相同,指向了同一个数组对象,所以更改一个另一个也会进行更改 方法其实就是函数 OUT: 外部标签,一种神奇的方式, print是输出括…...
测试八股文-Selenium
测试八股文-Selenium 总结了一些selenium的常见问题,欢迎评论区补充,如需教学辅导可私信作者 什么是Selenium? Selenium是一个自动化测试框架,用于模拟用户在Web应用程序中的交互行为。它支持多种语言,包括Java、Py…...
数据库第8章作业
ps:本篇只为记录和分享 一. 单选题(共20题) 1. (单选题)E-R图是数据库设计的工具之一,它适用于建立数据库的( )。 A. 概念模型B. 物理模型C. 逻辑模型D. 结构模型 我的答案: A :概念模型; 2. (单选题)数…...

【OpenCV实现平滑图像金字塔,轮廓:入门】
文章目录 概要图像金字塔轮廓:入门 概要 文章内容的概要: 平滑图像金字塔: 图像金字塔是什么? 图像金字塔是指将原始图像按照不同的分辨率进行多次缩小(下采样)得到的一系列图像。这种处理方式常用于图像…...

Java JVM垃圾回收确定垃圾的两种方式,GC Root
文章目录 前言一、如何确定是垃圾?引用计数法根可达路径法 二、GC Root1、以下可作为GC Root对象2、判断可回收:GC Root不可达3、真正宣告对象死亡需经过两次标记过程(重要) 前言 对于Java两种确定对象为可回收的两种方式&#x…...
java集合之List接口实现类常用方法详解
目录 一、List集合概述 二、ArrayList类 三、ArrayList常用方法实例 四、LinkedList类 五、Linkedist常用方法实例 一、List集合概述 java.util.List接口继承自Collection接口,是单列集合的一个分支,通常将实现了List接口的对象称为List集合&#x…...

三分钟带你了解JS、原型、原型链
1.什么是JS? JavaScript是一种基于对象的脚本语言,它不仅可以创建对象,也能使用现有的对象; 它是基于原型编程、多范式的动态脚本语言,并且支持面向对象、命令式、声明式、函数式编程范式; 白话一点说就是…...

C# 基于腾讯云人脸核身和百度云证件识别技术相结合的 API 实现
目录 腾讯云人脸核身技术 Craneoffice.net 采用的识别方式 1、活体人脸核身(权威库): 2、活体人脸比对: 3、照片人脸核身(权威库): 调用成本 百度云身份证识别 调用成本 相关结合点 核心代码 实现调用人脸核身API的示例 实现调用身…...
LeetCode每日一题——275. H-Index II
文章目录 一、题目二、题解 一、题目 Given an array of integers citations where citations[i] is the number of citations a researcher received for their ith paper and citations is sorted in ascending order, return the researcher’s h-index. According to the…...
项目添加EZOpenSDK之后就开始报错:could not build module foundation等
最近修改一个老项目,出现了一个报错问题。困扰了很久。现在终于找到解决方法了。分享一下。 正常的项目,使用pod引入EZOpenSDK之后就开始报错了,下面就是错误信息: could not build module foundation错误 could not build modul…...

“智能科技·链接未来”2024中国国际人工智能产品展览会·智博会
2024年中国国际人工智能产品展览会(简称世亚智博会)将于3月份在上海举办,6月份在北京举办。本届展会以“智能科技链接未来”为主题,将集中展示全球前沿的人工智能技术和应用,以及人工智能在各个领域的新成果。 本届展会…...

华为NAT配置实例(含dhcp、ospf配置)
一、网络拓朴如下: 二、要求:PC1 能访问到Server1 三、思路: R2配置DHCP,R2和R1配OSPF,R1出NAT 四、主要配置: R2的DHCP和OSPF: ip pool 1gateway-list 10.1.1.1 network 10.1.1.0 mask 25…...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...

【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...

深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...

GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
字符串哈希+KMP
P10468 兔子与兔子 #include<bits/stdc.h> using namespace std; typedef unsigned long long ull; const int N 1000010; ull a[N], pw[N]; int n; ull gethash(int l, int r){return a[r] - a[l - 1] * pw[r - l 1]; } signed main(){ios::sync_with_stdio(false), …...