python unittest实现api自动化测试


Posted in Python onApril 04, 2018

项目测试对于一个项目的重要性,大家应该都知道吧,写python的朋友,应该都写过自动化测试脚本。
最近正好负责公司项目中的api测试,下面写了一个简单的例子,对API 测试进行梳理。

首先,编写restful api接口文件 testpost.py,包含了get,post,put方法

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from flask import request
from flask_restful import Resource
from flask_restful import reqparse


test_praser = reqparse.RequestParser()
test_praser.add_argument('ddos')


class TestPost(Resource):
 def post(self, PostData):
 data = request.get_json()
 user = User('wangjing')
 if data['ddos']:
 return {'hello': 'uese', "PostData": PostData, 'ddos': 'data[\'ddos\']'}
 return {'hello': 'uese', "PostData": PostData}

 def get(self, PostData):
 data = request.args
 if data and data['ddos']:
 return "hello" + PostData + data['ddos'], 200
 return {'hello': 'uese', "PostData": PostData}

 def put(self, PostData):
 data = test_praser.parse_args()
 if data and data['ddos']:
 return "hello" + PostData + data['ddos'], 200
 return {'hello': 'uese', "PostData": PostData}

ps:对于request的取值,我这里定义了常用的三种方法:

post方法:request.get_json(),在调用API时,传值是json方式
get和put方法:request.args 或者reqparse.RequestParser(),调用API时,传的是字符串

其次,定义Blueprint(蓝图)文件 init.py

#!/usr/bin/env python
 # -*- coding: utf-8 -*-
 from flask import Blueprint
 from flask_restful import Api
 from testpost import TestPost

 testPostb = Blueprint('testPostb', __name__)
 api = Api(testPostb)
 api.add_resource(TestPost, '/<string:PostData>/postMeth')

然后,编写测试脚本testPostM.py

#!/usr/bin/env python
 # -*- coding: utf-8 -*-
 import unittest
 import json
 from secautoApp.api.testPostMeth import api
 from flask import url_for
 from run import app
 from secautoApp.api.testPostMeth import TestPost

 headers = {'Accept': 'application/json',
 'Content-Type': 'application/json'
 }

 class APITestCase(unittest.TestCase):
 def setUp(self):
 # self.app = create_app(os.getenv("SECAUTOCFG") or 'default')
 self.app = app
 # self.app_context = self.app.app_context()
 # self.app_context.push()
 self.client = self.app.test_client()

 #
 # def tearDown(self):
 # self.app_context.pop()

 def test_post(self):
 # with app.test_request_context():

 response = self.client.get(api.url_for(TestPost, PostData='adb', ddos='123'))
 self.assertTrue(response.status_code == 200)

 response = self.client.get(url_for('testPostb.testpost', PostData='adb', ddos='123'))
 self.assertTrue(response.status_code == 200) 
 self.assertTrue(json.loads(response.data)['PostData'] =='adb')

 response = self.client.post(url_for('testPostb.testpost', PostData='adb'), headers=headers,
   data=json.dumps({"ddos": '123'}))
 print json.loads(response.data)
 self.assertTrue(response.status_code == 200)

 response = self.client.put(url_for('testPostb.testpost', PostData='adb', ddos='123'))
 self.assertTrue(json.loads(response.data) == 'helloadb123')

 response = self.client.put(url_for('testPostb.testpost', PostData='adb'))
 print json.loads(response.data)['PostData']
 self.assertTrue(response.status_code == 200)

ps:调用的api url 主要用的是flask_restful 的api.url_for,或者是flask的url_for,下面我来说下这2种方法的具体使用

flask_restful 的api.url_for说明

api.url_for(TestPost,PostData='adb'),这里的TestPost指的是restful api接口文件中定义的class,因为我们在api蓝图中,已经通过api.add_resource(TestPost, ‘//postMeth')添加类的方式定义过

flask的url_for的使用说明

url_for(‘testPostb.testpost', PostData='adb', ddos='123'),'testPostb.testpost'这个字符串中
testPostb指的是蓝图的名称,也就是testPostb = Blueprint(‘testPostb', name)中Blueprint(‘testPostb',name)中的testPostb。
testpost指的是蓝图下endpoit的端点名称,flask_restful中,指的是api.add_resource(TestPost, ‘//postMeth')中 类名TestPost的小写

启动测试脚本:

C:\secauto3>python run.py test
test_post (testPostM.APITestCase) ... ok

----------------------------------------------------------------------
Ran 1 test in 0.056s

OK

小总结:url_for的传值和request中的取值是有对应关系的,最后就是flask_restful中端点的方式,一定要是api.add_resource中类名的小写。

领取干货:零基础入门学习python视频教程

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现计算最小编辑距离
Mar 17 Python
Python简单实现Base64编码和解码的方法
Apr 29 Python
一份python入门应该看的学习资料
Apr 11 Python
使用Scrapy爬取动态数据
Oct 21 Python
python: 自动安装缺失库文件的方法
Oct 22 Python
详解Python3网络爬虫(二):利用urllib.urlopen向有道翻译发送数据获得翻译结果
May 07 Python
使用Python实现画一个中国地图
Nov 23 Python
如何在windows下安装配置python工具Ulipad
Oct 27 Python
Django自定义YamlField实现过程解析
Nov 11 Python
用Python实现定时备份Mongodb数据并上传到FTP服务器
Jan 27 Python
Python爬取某拍短视频
Jun 11 Python
Django实现drf搜索过滤和排序过滤
Jun 21 Python
Python Unittest自动化单元测试框架详解
Apr 04 #Python
python如何使用unittest测试接口
Apr 04 #Python
Python统计单词出现的次数
Apr 04 #Python
高效使用Python字典的清单
Apr 04 #Python
Python的numpy库中将矩阵转换为列表等函数的方法
Apr 04 #Python
python 列表,数组,矩阵两两转换tolist()的实例
Apr 04 #Python
使用Python设计一个代码统计工具
Apr 04 #Python
You might like
PHP n个不重复的随机数生成代码
2009/06/23 PHP
PHP正确解析UTF-8字符串技巧应用
2012/11/07 PHP
PHP结合JQueryJcrop实现图片裁切实例详解
2014/07/24 PHP
php导出中文内容excel文件类实例
2015/07/06 PHP
深入理解PHP变量的值类型和引用类型
2015/10/21 PHP
简单的自定义php模板引擎
2016/08/26 PHP
PHP中in_array函数使用的问题与解决办法
2016/09/11 PHP
JavaScript实现多个重叠层点击切换效果的方法
2015/04/24 Javascript
jquery实现用户打分评分特效
2015/05/28 Javascript
使用Raygun对Node.js应用进行错误处理的方法
2015/06/23 Javascript
Jquery获取当前城市的天气信息
2016/08/05 Javascript
JS实现禁止鼠标右键的功能
2016/10/15 Javascript
Bootstrap3下拉菜单的实现
2017/02/22 Javascript
JavaScript之DOM插入更新删除_动力节点Java学院整理
2017/07/03 Javascript
js 中rewrap-ajax.js插件实例代码
2017/10/20 Javascript
layui table 表格模板按钮的实例代码
2019/09/21 Javascript
vue基本使用--refs获取组件或元素的实例
2019/11/07 Javascript
如何优雅地在Node应用中进行错误异常处理
2019/11/25 Javascript
JS实现基本的网页计算器功能示例
2020/01/16 Javascript
使用Python判断质数(素数)的简单方法讲解
2016/05/05 Python
解决pyinstaller打包pyqt5的问题
2019/01/08 Python
python获取交互式ssh shell的方法
2019/02/14 Python
django 通过url实现简单的权限控制的例子
2019/08/16 Python
opencv转换颜色空间更改图片背景
2019/08/20 Python
python实现实时视频流播放代码实例
2020/01/11 Python
django 解决扩展自带User表遇到的问题
2020/05/14 Python
python基于pygame实现飞机大作战小游戏
2020/11/19 Python
前端面试必备之html5的新特性
2017/09/05 HTML / CSS
个性化皮包、小袋、生活配件:Mon Purse
2019/03/26 全球购物
积极分子思想汇报
2014/01/04 职场文书
简历中的自我评价怎么写
2014/01/29 职场文书
工作业绩不及格检讨书
2014/10/28 职场文书
标枪加油稿
2015/07/22 职场文书
大队委员竞选演讲稿
2015/11/20 职场文书
Java Socket实现Redis客户端的详细说明
2021/05/26 Redis
js判断两个数组相等的5种方法
2022/05/06 Javascript