前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Pytest测试实战(九)

Pytest测试实战(九)

作者头像
无涯WuYa
发布2019-12-19 11:23:46
4860
发布2019-12-19 11:23:46
举报

在前面的关于Pytest的系列文章中系统的介绍了Pytest测试框架的知识体系,今天主要介绍Pytest测试框架在API自动化测试中的应用。本文章会把数据存储到yaml的文件中。在API的自动化测试中,我们需要思考的是把测试中的数据分离出去。本实例中测试的案例依然是书籍管理系统,它的具体源码为:

代码语言:javascript
复制
#!/usr/bin/python3
#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': '添加书籍成功','datas':book}, 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': '更新书的信息成功', 'datas': 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)

下来把测试过程中应用到的数据存储到yaml的文件中(yaml文件是一个可读性高,用来表达数据序列化的格式)。yaml文件的内容为:

代码语言:javascript
复制
---
#查看所有书籍信息
"url": "http://localhost:5000/v1/api/books"
"expect": '"name": "Python接口自动化测试实战"'
---
#查看id为1的书籍信息
"url": "http://localhost:5000/v1/api/book/1"
"expect": '"author": "wuya"'

这里主要已GET的请求为案例,下来读取yaml文件里面的内容,读取后转成list的数据类型,然后使用Pytest的参数化来实现这部分的案例实战,源码如下:

代码语言:javascript
复制
#!/usr/bin/python3
#coding:utf-8
import  yaml
import  pytest
import  requests
import  json

def readYaml():
   with open('config.yaml','r',encoding='utf-8') as f:
      return list(yaml.safe_load_all(f))


@pytest.mark.parametrize("datas",readYaml())
def test_books(datas):
   r=requests.get(url=datas['url'])
   assert  datas['expect'] in json.dumps(r.json(),ensure_ascii=False)

if __name__ == '__main__':
    pytest.main(["-s","yamlTest.py"])

执行如上的代码后,输出信息如下:

代码语言:javascript
复制
collected 2 items

yamlTest.py ..

============= 2 passed in 0.04s ==============

后续继续解决针对不同请求方法的处理和判断,以及动态参数的关联处理,感谢您的阅读和关注。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python自动化测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据保险箱
数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档