开发完接口,接下来我们需要对我们开发的接口进行测试。接口测试的方法比较多,使用接口工具或者Python来测试都可以,工具方面比如之前我们学习过的Postman或者Jmeter ,Python脚本测试可以使用Requests + unittest来测试。

测试思路

  • 功能测试:数据的增删改查

  • 异常测试:未授权,参数异常等

Postman测试

使用测试工具Postman测试结果如下所示:

user接口测试

查询所有用户

创建用户

修改用户

删除用户

未授权测试

groups接口测试

查询所有groups数据

修改group数据

删除groups

Requests+Unittest

api目录下面新建一个test_unittest.py,代码实现如下:

tests_unittest.py

import requestsimport unittest

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

  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 -Vmysql  Ver 8.0.1-dmr for Win64 on x86_64 (MySQL Community Server (GPL))

更多干货

  • Restful接口开发与测试—集成Swagger

  • Restful接口开发与测试—Django安装

  • Restful接口开发与测试—Rest简介

  • Python接口自动化——Requests基础功能

  • Python接口自动化——Requests

  • Jmeter+Ant+Jenkins接口自动化测试平台

  • Jmeter+Ant+Jenkins接口自动化测试平台

  • Jmeter用例数据分离

  • Jmeter CSV文件管理与正则匹配

  • Jmeter变量设置

  • Jmeter简介与安装

  • 断言与参数设置

  • Jmeter简介与安装

  • Postman批量执行与集成Jenkins

  • Mac 环境Appium自动化测试环境搭建

  • 众里寻他千百度—Appium Android 元素定位方式

  • Android自动化测试设备弹窗处理

  • Appium iOS 元素定位与操作

  • Ubuntu+Docker+STF环境搭建

  • Anyproxy抓包代理安装使用

  • Python自动化日志收集

  • Android 测试工具——Monkeyrunner API

关注公众号,更多干货秒得到

restful接口开发实例_Restful接口开发与测试—接口测试相关推荐

  1. 开发android 输入法,Android输入法开发实例解析 Android开发技术

    Android输入法开发实例解析 Android开发技术 2013 年 4 月 13 日 这里我们建立表1为BiHua,同时构建两个字段,字段1为"input"来存放输入的,字段2 ...

  2. web api接口开发实例_C# 物联网开发API接口系列(4)

    C# 物联网开发API接口系列(四) #久爱物联网#MQTT# [提纲] 1)获取设备列表(某用户的) 2)单独检查设备是否存在合法 [正文] /// /// 获取设备列表 /// /// 令牌 // ...

  3. java restful开发规范_restful api 开发规范

    1.协议 http && https 2.域名 https://api.example.com && https://example.org/api/ 3.版本  ht ...

  4. Python开发实例:TPYBoard开发板制作声光控开关

    2019独角兽企业重金招聘Python工程师标准>>> 声光控开关在我们日常生活中已经非常普遍了,几乎每个小区的楼道里都能有声光控开关的影子.现在也逐渐出现了声光控的小夜灯,晚上起夜 ...

  5. eclipse java开发实例_eclipse+webservice开发实例

    1.參考文献: 2.实例1(主要看到[2]) 2.1.系统功能: 开发一个计算器服务CalculateService,这个服务包括加(plus).减(minus).乘(multiply).除(divi ...

  6. MicroPython开发实例之TurniBit开发板DIY自动窗帘模拟系统

    2019独角兽企业重金招聘Python工程师标准>>> 一.准备工作     üTurnipBit 开发板 一块     ü下载数据线 一条     ü微型步进电机(28BYJ-48 ...

  7. micropython控制板_MicroPython开发实例之TurniBit开发板DIY自动窗帘模拟系统

    一.准备工作 üTurnipBit 开发板 一块 ü下载数据线 一条 ü微型步进电机(28BYJ-48) 一个 ü步进电机驱动板(ULN2003APG) 一块 ü光敏传感器 一个 üTurnipBit ...

  8. c mysql web开发实例教程_Web开发(六)MySql

    数据库简介 数据库(DB) 数据库(database,DB)是指长期存储在计算机内的,有组织,可共享的数据的集合.数据库中的数据按一定的数学模型组织.描述和存储,具有较小的冗余,较高的数据独立性和易扩 ...

  9. java接口和实例_java – 接口和实例化

    第二个声明是错误的: Then it goes on and says a paragraph or so later that "You can declare a variable to ...

最新文章

  1. Deployment
  2. Docker----在Docker中部署Asp.net core2.1以及修改发布
  3. 【cocostudio】发布资源在Cocos2d-x中如何使用
  4. nmap常用参数详解
  5. 【Makefile由浅入深完全学习记录7】Makefile中变量的高级主题下
  6. include包含头文件的语句中,双引号和尖括号的区别
  7. linux系统批量装机,PXE+Kickstart实现无人值守批量安装Linux
  8. pythonselenium上传图片视频_如何用selenium、python上传文件(图片)
  9. Unity3D 渲染统计窗口
  10. 9_python基础—数据序列(公共方法)
  11. JAVA 常用开发快捷键大全
  12. vmware使用技巧
  13. Html5 学习系列(三)增强型表单标签
  14. 2020 比特大陆 面经
  15. 全新版大学英语综合教程第二册学习笔记(原文及全文翻译)——1 - Learning, Chinese-Style(中国式的学习风格)
  16. 交换机设备登录账号权限1_交换机怎么设置 交换机配置方法【详解】
  17. 2020云课堂智慧职教答案计算机,2020云课堂智慧职教答案英语,云智慧职教题库,智慧职教测试答案...
  18. 硬盘数据恢复——误删除卷数据恢复
  19. 记录解决英文和阿拉伯文混合的字符串,在阿拉伯环境下靠左显示,但需要从右开始显示
  20. iOS IPv6测试环境搭建及服务器ipv6测试

热门文章

  1. 《转》不要过打折的生活,当你发现这些你有了,说明你开始成熟了
  2. linux-ubuntu下调出中文输入法
  3. (转)Windows 批处理实现 定时打开IE 延时一段时间后 关闭IE
  4. 2021-07-27-jeesite学习笔记
  5. Leetcode--152. 乘积最大子序列
  6. 怎么改变表单option标签直接字体大小_不起眼却非常重要的表单交互
  7. linux终端密码星星,如何获得您的sudo密码在Ubuntu中显示为星号 | MOS86
  8. 3dmax体积雾渲染不出来_【扮家家云渲染效果图】3Dmax体积光制作丛林光束|干货教程...
  9. python求助神器_python三大神器
  10. QT中的QButtonGroup