接口测试—-中篇,通过django实现一个非常简单的记事本接口

xiaoxiao2021-02-28  115

接口测试—-前言,接口是怎么来的 接口测试—-中篇,通过django实现一个记事本接口 接口测试—-下篇,开始接口测试 接口测试—-工具篇,实现接口自动化

django

django是啥,那么django其实就是一个web框架,在接口测试—-上篇的某位,我们知道了实现一个接口就是去处理WSGI的处理函数,但是问题来了,只用那个函数每次写一个接口都要处理大量的重复代码,于是web框架就应运而生了,没错,django就是web处理框架,你所需要的一切都封装好给你,类似的还有flask框架,我们今天就用django实现一个记事本的小接口。

django使用备忘

那么既然是比较完善的框架,那么我们直接拿来用就行了,这里列出来常规步骤,作为备忘:

环境: mysql最新版 python3 pychrame最新版 django框架库 pymysql库

使用:

django-admin startproject cnote创建一个项目cnotecd进cnote通过python manage.py startapp创建一个app打开settings.py,配置INSTALLED_APPS、DATABASES两个字段打开urls.py,配置用户访问目录的路由打开views.py,编写处理函数(可选)打开models.py,编写表结构

上面的models.py是可选的,因为这只是django提供给我们的数据库api, 我们完全可以自己用pymysql去掉用。models的好处是可以使用django自带的admin后台管理,比较方便,并且数据库操作的api还是很容易入手的。

服务端的架构

差不多最简单的就是这样了,我们要实现的就是这个阶段,要了解更多,可以跳到知乎看下,写得非常好 https://www.zhihu.com/question/20657269

另外MVC也需要了解下,毕竟WEB框架好像都是基于这种模式或者这种的衍生。

需求概述

我们要实现一个简易的记事本接口,主要支持4个功能: 1.注册,帐号密码手机号,帐号和手机号都是唯一的 2.登录,输入帐号密码登录,并返回一个随机的token 3.插入笔记,请求头带上token作为鉴权,然后插入笔记 4.查询笔记,带token,然后查询出笔记内容 5… … 需求比较简单,作为练手项目够用了

views.py源码实现

这里我们拿登录的接口来说明,毕竟思路都差不多更多源码可以参考: https://github.com/CloudHuan/CNote

def signin(request): method = request.method; name = request.POST.get('username', ''); pwd = request.POST.get('password', ''); if not name or not pwd: return C_Response(-107,'','account or password not be null'); infos = User.objects.filter(name=name); if not infos: return C_Response(-106,'','account not found'); infos = infos[0]; if not infos.pwd == pwd: return C_Response(-105,'','password wrong'); # 生成认证token token = randomTokens(); infos.token = token; infos.save(); return C_Response(0,{"name":infos.name,"phone":infos.phone,"uid":infos.uid,"token":token});

上面的代码非常简单:拿到request对象—从request解析出参数—参数的异常判断—查询sql并返回 那么我这里的登录定义了几个错误码,-105、-106、-107,一一对应的是各种异常的检查点。 最后执行查询操作,返回用户登录的数据给用户,C_Response对象是自己封装的返回json格式,这个定义可以在RespnseTools.py里面找到: { “code”:0, “data”:xxxxx, “errMsg”:”xxxx” } 嗯,返回的格式就是这样了,然后客户端拿到数据再去解析json吧。这里的实现难点其实就是对数据的查找操作了,用的是django自带的api去查询和写入,当然,我也封装了pymysql的调用语句,在MysqlTools.py里面可以找到,基本上就是用的原生sql语句查询,效果一样一样的。

models.py表结构的定义

我们需要两张表,一个是user(uid,name,pwd,phone,token)、note(uuid,content,cid,public) token是鉴权用的,在读写笔记的时候需要。public是一个公开的标志,这个逻辑目前还没实现,暂时无视。

代码如下:

class User(models.Model): uid = models.IntegerField(default=0); name = models.CharField(max_length=10,unique=True); pwd = models.CharField(max_length=200); phone = models.CharField(max_length=100,unique=True); token = models.CharField(max_length=100); class Note(models.Model): #uid = models.ForeignKey(User); uuid = models.IntegerField(default=0); content = models.TextField(); cid = models.IntegerField(default=0); public = models.BooleanField(default=False);

当然了,这种用的是django提供的api去建表的,笔者在尝试修改表结构的时候有时候会遇到一些未知错误,不过好在网上都有答案,表结构这东西,修改的风险有点大,搞不好数据还会丢失,所以说服务端开发真正的难点是表的设计啊。

接口文档

开发完接口,就需要更新接口文档,不然怎么给我们测试呢,上层开发也要调用的。 通用结构(json字段返回):

*****登录***** post:127.0.0.1:8000/account/signin body:username=xxx,password=xxx 响应 { "code":0, "data"{ "username":"cz", "phone":"13246634313", "uid":105 } } *****返回码***** 0 登录成功 -105 密码错误,password wrong -106 帐号不存在 ,account not found -107 帐号密码不能为空,account or password not be null ''' *****注册***** method:post请求 必要信息:name、phone(唯一)、pwd密码 POST 127.0.0.1:8000/account/signup body:username=cloudhuan,password=1,phone=10010 { "data": { "uid": 3, "name": "cloudhuan", "phone": "10010" }, "code": 0 } *****返回码定义***** 0 注册成功 -1 请求方式错误 -100 传入参数错误,传入name、phone为空 -101 传入密码pwd为空 -102 传入密码pwd没有32位 md5加密 -103 帐号已经被已经被注册phone唯一 *****写入笔记***** 调用方式 POST 示例: POST HTTP 127.0.0.1:8000/account/writenote header:TOKEN:XXX body:uid=1,content='我是文本哦' { "data": { "uid": 1, "content": "我是文本哦", "name": "cz", "cid": 15 }, "code": 0 } *****返回码***** 0 ok -108 uid or content is null -109 uid not found *****读取用户笔记***** 调用方式 get 示例: get:127.0.0.1:8000/account/readnote?uid=2 header:TOKEN:XXXXXX { "code": 0, "data": [ { "cid:": 1, "content": "aabbcc" }, { "cid:": 2, "content": "你们好" } ] } *****返回码***** 0 ok -200 please input user id 用户id不能为空 -201 uid not found 无此用户 -202 no permission 无权限访问该资源 -203 no content 无数据

总结

开发一个服务端接口,套路就是web框架+逻辑处理+数据调用(sql),我们接口测试测的是逻辑数据和数据调用这上面,具体怎么测的,测什么内容以及哪里容易出问题,我们在下一篇再具体讨论。 这个服务端的架构模型是最基本的架构模型,公司级的架构无非是在这基础上做一些分布式和集群,以及数据库缓存优化等等操作,而服务端测试无非就是和这些东西打交道,比如测试服务端性能,数据库调优等等,好了,这一篇就到这里了。

转载请注明原文地址: https://www.6miu.com/read-35163.html

最新回复(0)