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第八周:详解网络编程基础(socket)
Dec 14 Python
python实现的二叉树定义与遍历算法实例
Jun 30 Python
Python实现基于二叉树存储结构的堆排序算法示例
Dec 08 Python
利用pandas进行大文件计数处理的方法
Jul 25 Python
使用python实现简单五子棋游戏
Jun 18 Python
Python Numpy 实现交换两行和两列的方法
Jun 26 Python
Python使用lambda表达式对字典排序操作示例
Jul 25 Python
Python爬虫学习之翻译小程序
Jul 30 Python
Python GUI库PyQt5图形和特效样式QSS介绍
Feb 25 Python
浅谈Python中的模块
Jun 10 Python
解决Keras的自定义lambda层去reshape张量时model保存出错问题
Jul 01 Python
Python如何获取文件路径/目录
Sep 22 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 和 MYSQL
2006/10/09 PHP
用 PHP5 轻松解析 XML
2006/12/04 PHP
PHP 命令行工具 shell_exec, exec, passthru, system详细使用介绍
2011/09/11 PHP
深入理解php的MySQL连接类
2013/06/07 PHP
解析file_get_contents模仿浏览器头(user_agent)获取数据
2013/06/27 PHP
Codeigniter通过SimpleXML将xml转换成对象的方法
2015/03/19 PHP
Yii中CGridView实现批量删除的方法
2015/12/28 PHP
PHP的自定义模板引擎
2017/03/24 PHP
PHP进阶学习之垃圾回收机制详解
2019/06/18 PHP
jquery让返回的内容显示在特定div里(代码少而精悍)
2014/06/23 Javascript
用模版生成HTML的的框架jquery.tmpl使用详解
2015/01/07 Javascript
jquery实现向下滑出的二级导航下滑菜单效果
2015/08/25 Javascript
AngularJS中$watch和$timeout的使用示例
2016/09/20 Javascript
JS实现数组去重,显示重复元素及个数的方法示例
2019/01/21 Javascript
python批量同步web服务器代码核心程序
2014/09/01 Python
Python IDLE 错误:IDLE''s subprocess didn''t make connection 的解决方案
2017/02/13 Python
ubuntu中配置pyqt4环境教程
2017/12/27 Python
PyQt5 对图片进行缩放的实例
2019/06/18 Python
python opencv实现证件照换底功能
2019/08/19 Python
解决Keyerror ''acc'' KeyError: ''val_acc''问题
2020/06/18 Python
css3实现二维码扫描特效的示例
2020/10/29 HTML / CSS
网易微博Web App用HTML5开发的过程介绍
2012/06/13 HTML / CSS
JD Sports比利时官网:英国领先的运动鞋和运动服饰零售商
2018/10/10 全球购物
英国天然宝石首饰购买网站:Gemondo Jewellery
2018/10/23 全球购物
腾讯技术类校园招聘笔试试题
2014/05/06 面试题
大学生求职中的自我评价
2013/10/01 职场文书
工厂保洁员岗位职责
2013/12/04 职场文书
2014学年自我鉴定
2014/02/23 职场文书
亮化工程实施方案
2014/03/17 职场文书
保险公司早会主持词
2014/03/22 职场文书
经销商订货会主持词
2014/03/27 职场文书
机关党员进社区活动总结
2014/07/05 职场文书
投资意向书
2014/07/30 职场文书
办理信用卡工作证明
2014/09/30 职场文书
导游词之云南省玉龙雪山
2019/12/19 职场文书
《宝可梦》动画制作25周年到来 官方发布特别纪念视频
2022/04/01 日漫