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使用如下命令来运行即可:

  1. D:\django_restful>python manage.py test

上面命令是默认测试全部的用例,如果想测试部分用例则可以使用如下命令:

测试指定的测试类

  1. D:\django_restful>python manage.py test api.tests.UserTest

测试具体的某一条具体用例

  1. D:\django_restful>python manage.py test api.tests.UserTest.test_get_use

报错相关

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文件来解决此问题。通过在杀毒软件威胁防护高级选项中禁用按访问扫描,并杀毒软件设置为忽略这些扩展名来解决此问题

  1. 迁移数据库时没有清除之前的迁移文件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文件夹即可。

  1. 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))

7天练完接口自动化测试30个实战项目,28K入职字节测试岗。【自动化测试/接口测试/软件测试/性能测试/Jmeter】

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

在这里插入图片描述

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!   

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯每日一题2023.9.29

蓝桥杯大赛历届真题 - C&C 大学 B 组 - 蓝桥云课 (lanqiao.cn) 题目描述1 题目分析 看见有32位,我们以此为入手点, B代表字节1B 8b b代表位,32位即4个字节 (B) 1KB 1024B 1MB 1024KB (256 * 1024 * 1024) / 4 67108864 故答案…

面向对象【递归方法】

文章目录 递归编写递归函数递归的工作原理常见的递归应用场景递归注意点 递归 递归是一种解决问题的方法,其中一个函数调用自身以解决较小的实例,直到达到基本情况(停止条件),然后开始返回结果。递归可以让我们更容易地…

Linux 回收内存到底怎么计算anon/file回收比例,只是swappiness这么简单?

概述 Linux内核为了区分冷热内存,将page以链表的形式保存,主要分为5个链表,除去evictable,我们主要关注另外四个链表:active file/inactive file,active anon和inactive anon链表,可以看到这主要分为两类,file和anon page,内存紧张的时候,内核开始从inactive tail定…

AI写稿软件,最新的AI写稿软件有哪些

写作已经成为各行各业无法绕开的重要环节。不论是企业的广告宣传、新闻媒体的报道、还是个人自媒体的内容创作,文字都扮演着不可或缺的角色。随着信息的爆炸式增长,写作的需求也不断攀升,这使得许多人感到困扰。时间不够用、创意枯竭、写作技…

基于AI图像识别的智能缺陷检测系统,在钢铁行业的应用-技术方案

目录 概述 废钢智能检判方案简介 废钢智能检判系统优势及价值 废钢人工检判过程 废钢等级检判标准 废钢检判结果 智能检判方案-废钢智能检判算法 算法一:废钢等级识别算法 算法二:不合格料的位置识别算法 算法三:不合格料的类型识别…

uniapp iOS离线打包——如何创建App并提交版本审核?

uniapp 如何创建App,并提交版本审核? 文章目录 uniapp 如何创建App,并提交版本审核?登录 appstoreconnect创建AppiOS 预览和截屏应用功能描述技术支持App 审核信息 App 信息内容版权年龄分级 价格与销售范围App 隐私提交审核 登录…

QT使用前的知识

QT使用前的知识 常用的快捷键 源文件的内容解释 .pro文件的解释 头文件的解释 构建新的对象—组成对象树 槽函数 自定的信号和槽 槽函数的信号是一个重载函数时 电机按钮触发信号 调用无参数的信号 断开信号

ElementUI之首页导航+左侧菜单

文章目录 一、Mock.js1.1.什么是Mock.js1.2.安装与配置1.3使用 二、登录注册跳转2.1.在views中添加Register.vue2.2.在Login.vue中的methods中添加gotoRegister方法2.3.在router/index.js中注册路由 三、组件通信(总线)3.1 在main.js中添加内容3.2.在com…

FPGA 多路视频处理:图像缩放+视频拼接显示,HDMI采集,提供2套工程源码和技术支持

目录 1、前言版本更新说明免责声明 2、相关方案推荐FPGA图像缩放方案推荐FPGA视频拼接方案推荐 3、设计思路框架视频源选择IT6802解码芯片配置及采集动态彩条缓冲FIFO图像缩放模块详解设计框图代码框图2种插值算法的整合与选择 视频拼接算法图像缓存视频输出 4、vivado工程1&am…

ubuntu20.04 jammy 安装ros2

ubunut22.04 jammy(5.15) ros2版本: humble 安装参考: Ubuntu (Debian packages) — ROS 2 Documentation: Humble documentationl 按照官方给的操作指南进行操作即可,到安装软件包的时候,若只为开发&#xff0…

UE学习记录07----C++中使用事件委托

1.c定义多播委托,示例代码: #include "Delegates/Delegate.h"DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FMyDelegate, UObject*, SelectAgent);/****/ UCLASS(Blueprintable, DisplayName "VM_PlaceEntity") class PR_PLACEE…

求求,别在sql里格式化数据了

在shigen之前的文章《为什么我们总是被追赶着走》这篇文章中提到了很多的设计乱象,设计的恶心之处至今让我呕吐。其中的sql我说了动辄上百行,而一些略长的部分竟然就是为了一件事——格式化。我直接一个ca,格式化不能用一个VO去处理吗&#x…

基于微信小程序的游戏账号交易买卖平台设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能:具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

css自学框架之幻灯片展示效果

这一节,我自学了焦点图效果(自动播放,圆点控制),首先看一下效果: 下面我们还是老思路,css展示学习三个主要步骤:一是CSS代码,二是Javascript代码,三是Html代码。 一、css代码主要如…

使用KEIL自带的仿真器仿真遇到问题解决

*** error 65: access violation at 0x40021000 : no read permission 修改debug选项设置为下方内容。

Unity 制作登录功能02-创建和链接数据库(SQlite)

国际惯例:先看效果 1.SQlite是一种嵌入型数据库 在Unity开发游戏时使用SQLite有多种原因,以下是其中一些主要原因: 嵌入式数据库:SQLite是一个嵌入式数据库引擎,这意味着它不需要单独的服务器进程。这使得使用SQLite非…

构建个人云存储:本地电脑搭建SFTP服务器,开启公网访问,轻松共享与管理个人文件!

本地电脑搭建SFTP服务器,并实现公网访问 文章目录 本地电脑搭建SFTP服务器,并实现公网访问1. 搭建SFTP服务器1.1 下载 freesshd 服务器软件1.3 启动SFTP服务1.4 添加用户1.5 保存所有配置 2. 安装SFTP客户端FileZilla测试2.1 配置一个本地SFTP站点2.2 内…

【算法与数据结构】JavaScript实现十大排序算法(一)

文章目录 关于排序算法冒泡排序选择排序插入排序希尔排序归并排序 关于排序算法 稳定排序: 在排序过程中具有相同键值的元素,在排序之后仍然保持相对的原始顺序。意思就是说,现在有两个元素a和b,a排在b的前面,且ab&…

十九,镜面IBL--BRDF积分贴图

再回顾下镜面部分的分割求和近似法 现在关注第二部分 最后可化为 也就是说,这两部分积分可以获得F0的系数和F0的偏差。 这两个值可以存储到BRDF积分贴图的RG部分。void main() { vec2 integratedBRDF IntegrateBRDF(TexCoords.x, TexCoords.y); FragColor …

图扑软件受邀亮相 IOTE 2023 国际物联网展

IOTE 2023 国际物联网展,作为全球物联网领域的盛会,于 9 月 20 日 - 22 日在中国深圳拉开帷幕。本届展会以“IoT构建数字经济底座”为主题,由深圳市物联网产业协会主办,打造当前物联网最新科技大秀。促进物联网与各行业深度融合&a…