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

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

django

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

django使用备忘

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

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

使用:

  • django-admin startproject cnote创建一个项目cnote
  • cd进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),我们接口测试测的是逻辑数据和数据调用这上面,具体怎么测的,测什么内容以及哪里容易出问题,我们在下一篇再具体讨论。
这个服务端的架构模型是最基本的架构模型,公司级的架构无非是在这基础上做一些分布式和集群,以及数据库缓存优化等等操作,而服务端测试无非就是和这些东西打交道,比如测试服务端性能,数据库调优等等,好了,这一篇就到这里了。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值