接口测试之RESTful案例应用

接口测试之RESTful中对RESTful做了详细的介绍,在前面的基础上继续完善案例的应用。在接口测试中,当客户端请求服务端,服务端响应返回给客户端,返回的这些这些信息除了响应头,还有就是业务状态码,msg以及数据,比如登录一个系统成功后,它返回的内容可能是:{"status":0,"msg":"ok","datas":{"userid":1001,"name":"wuya"}},这里还是看一个案例的应用,比如登录抽屉网失败,看服务端返回给客户端的信息,如下图所示:

如上信息是登录的时候账户密码错误,服务端返回的错误信息,它的code是400,在不同情况下,它会依据业务的不同返回不同的业务状态码。就像之前编写的案例代码,如果当查询书籍不存在的时候,它的返回信息是什么,修改书的时候,必须传的请求参数并没有传进去,它的错误信息又是什么,不同的场景,如果使用同一种错误信息来表示,会影响最终的体验。比如参数author为空,我们更加希望得到的是author请求参数不能为空的错误信息,如果是name为空,希望得到的是name请求参数不能为空的错误信息。基于这样的思考,对之前的代码做了修改,修改后的代码为:

#!/usr/bin/env python
# -*-coding:utf-8 -*-
from flask import  Flask,make_response,jsonify,abort,request
from flask_restful import  Api,Resource
from flask_httpauth import  HTTPBasicAuth

app=Flask(__name__)
api=Api(app=app)
auth=HTTPBasicAuth()


@auth.get_password
def get_password(name):
   if name=='admin':
      return 'admin'
@auth.error_handler
def authoorized():
   return make_response(jsonify({'msg':"请认证"}),401)

books=[
   {'id':1,'author':'wuya','name':'Python接口自动化测试实战','done':True},
   {'id':2,'author':'无涯','name':'Selenium3自动化测试实战','done':False}
]

class Books(Resource):
   decorators = [auth.login_required]

   def get(self):
      return jsonify({'status':0,'msg':'ok','datas':books})

   def post(self):
      if not request.json:
         return jsonify({'status':1001,'msg':'请求参数不是JSON的数据,请检查,谢谢!'})
      else:
         book = {
            'id': books[-1]['id'] + 1,
            'author': request.json.get('author'),
            'name': request.json.get('name'),
            'done': True
         }
         books.append(book)
         return jsonify({'status':1002,'msg': '添加书籍成功 '}, 201)


class Book(Resource):
   decorators = [auth.login_required]

   def get(self,book_id):
      book = list(filter(lambda t: t['id'] == book_id, books))
      if len(book) == 0:
         return jsonify({'status': 1003, 'msg': '很抱歉,您查询的书的信息不存在'})
      else:
         return jsonify({'status': 0, 'msg': 'ok', 'datas': book})

   def put(self,book_id):
      book = list(filter(lambda t: t['id'] == book_id, books))
      if len(book) == 0:
         return jsonify({'status': 1003, 'msg': '很抱歉,您查询的书的信息不存在'})
      elif not request.json:
         return jsonify({'status': 1001, 'msg': '请求参数不是JSON的数据,请检查,谢谢!'})
      elif 'author' not in request.json:
         return jsonify({'status': 1004, 'msg': '请求参数author不能为空'})
      elif 'name' not in request.json:
         return jsonify({'status': 1005, 'msg': '请求参数name不能为空'})
      elif 'done' not in request.json:
         return jsonify({'status': 1006, 'msg': '请求参数done不能为空'})
      elif type(request.json['done'])!=bool:
         return jsonify({'status': 1007, 'msg': '请求参数done为bool类型'})
      else:
         book[0]['author'] = request.json.get('author', book[0]['author'])
         book[0]['name'] = request.json.get('name', book[0]['name'])
         book[0]['done'] = request.json.get('done', book[0]['done'])
         return jsonify({'status': 1008, 'msg': '更新书的信息成功', 'dats': book})

   def delete(self,book_id):
      book = list(filter(lambda t: t['id'] == book_id, books))
      if len(book) == 0:
         return jsonify({'status': 1003, 'msg': '很抱歉,您查询的书的信息不存在'})
      else:
         books.remove(book[0])
         return jsonify({'status': 1009, 'msg': '删除书籍成功'})

api.add_resource(Books,'/v1/api/books')
api.add_resource(Book,'/v1/api/book/<int:book_id>')

if __name__ == '__main__':
    app.run(debug=True)

依据如上的代码可以看到,针对不同的都做了处理。在接口的测试实战中,一个接口测试用例的断言,需要验证的点分别是业务状态码,依据结合具体的业务来验证响应数据,比如登录成功后,可以验证userid,name的信息,至于其他的字段信息可以验证,也可以不验证,并不是说接口返回的所有的响应数据都需要做断言的处理。

谢谢您的关注!购买课程赠送《Python自动化测试实战》书籍啦!测试进阶必备技能!系统教学+实战分析,轻松掌握接口自动化测试!本套课程的目标是从零基础开始,系统的讲解使用主流的开发语言Python在接口自动化测试方面的案例应用和实战。

原文发布于微信公众号 - Python自动化测试(wuya-python)

原文发表时间:2019-08-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券