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数据结构之翻转链表
Feb 25 Python
win10下Python3.6安装、配置以及pip安装包教程
Oct 01 Python
Python实现句子翻译功能
Nov 14 Python
influx+grafana自定义python采集数据和一些坑的总结
Sep 17 Python
python hook监听事件详解
Oct 25 Python
Python实现针对json中某个关键字段进行排序操作示例
Dec 25 Python
浅谈Python中的全局锁(GIL)问题
Jan 11 Python
Python提取频域特征知识点浅析
Mar 04 Python
Python画图高斯分布的示例
Jul 10 Python
Pycharm 2020最新永久激活码(附最新激活码和插件)
Sep 17 Python
使用python3 实现插入数据到mysql
Mar 02 Python
django正续或者倒序查库实例
May 19 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代码DOS造成用光网络带宽
2011/03/01 PHP
提高php运行速度的一些小技巧分享
2012/07/03 PHP
探讨:如何使用PHP实现计算两个日期间隔的年、月、周、日数
2013/06/13 PHP
php保存二进制原始数据为图片的程序代码
2014/10/14 PHP
PHP下的浮点运算不准的解决方法
2016/10/27 PHP
php 二维数组快速排序算法的实现代码
2017/10/17 PHP
基于jquery的跟随屏幕滚动代码
2012/07/24 Javascript
删除select中所有option选项jquery代码
2013/08/12 Javascript
js判断选择的时间是否大于今天的代码
2013/08/20 Javascript
js获取当前月的第一天和最后一天的小例子
2013/11/18 Javascript
Javascript学习笔记之 对象篇(三) : hasOwnProperty
2014/06/24 Javascript
NodeJS学习笔记之Connect中间件应用实例
2015/01/27 NodeJs
JS操作HTML自定义属性的方法
2015/02/10 Javascript
JavaScript实现上下浮动的窗口效果代码
2015/10/12 Javascript
Angularjs上传图片实例详解
2017/08/06 Javascript
详解关于vue-area-linkage走过的坑
2018/06/27 Javascript
Vue props用法详解(小结)
2018/07/03 Javascript
基于Vue 2.0 监听文本框内容变化及ref的使用说明介绍
2018/08/24 Javascript
微信小程序之数据绑定原理解析
2019/08/14 Javascript
深入理解javascript prototype的相关知识
2019/09/19 Javascript
教大家使用Python SqlAlchemy
2016/02/12 Python
详解Python中的__new__、__init__、__call__三个特殊方法
2016/06/02 Python
python3爬取数据至mysql的方法
2018/06/26 Python
python实现根据文件关键字进行切分为多个文件的示例
2018/12/10 Python
python爬取酷狗音乐排行榜
2019/02/20 Python
django框架面向对象ORM模型继承用法实例分析
2019/07/29 Python
Python 类的魔法属性用法实例分析
2019/11/21 Python
详解Python直接赋值,深拷贝和浅拷贝
2020/07/09 Python
可能这些是你想要的H5软键盘兼容方案(小结)
2019/04/23 HTML / CSS
Habitat家居英国官方网站:沙发、家具、照明、厨房和户外
2019/12/12 全球购物
高中学生干部学习的自我评价
2014/02/21 职场文书
写好自荐信需做到的5要点
2014/03/07 职场文书
美丽乡村建设实施方案
2014/03/23 职场文书
大学生就业策划书范文
2014/04/04 职场文书
2014年教师节国旗下讲话稿
2014/09/10 职场文书
业务员年终工作总结2015
2015/05/28 职场文书