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 client使用http post 到server端的代码
Feb 10 Python
Python线程的两种编程方式
Apr 14 Python
老生常谈python之鸭子类和多态
Jun 13 Python
微信跳一跳小游戏python脚本
Jan 05 Python
python中使用xlrd读excel使用xlwt写excel的实例代码
Jan 31 Python
利用python将json数据转换为csv格式的方法
Mar 22 Python
django启动uwsgi报错的解决方法
Apr 08 Python
Python中的Socket 与 ScoketServer 通信及遇到问题解决方法
Apr 01 Python
python爬虫实现中英翻译词典
Jun 25 Python
python re.sub()替换正则的匹配内容方法
Jul 22 Python
keras 解决加载lstm+crf模型出错的问题
Jun 10 Python
Python使用Kubernetes API访问集群
May 30 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 array_key_exists() 与 isset() 的区别
2016/10/24 PHP
php和vue配合使用技巧和方法
2019/05/09 PHP
php给数组赋值的实例方法
2019/09/26 PHP
JavaScript 学习笔记(十四) 正则表达式
2010/01/22 Javascript
基于JavaScript 声明全局变量的三种方式详解
2013/05/07 Javascript
js arguments,jcallee caller用法总结
2013/11/30 Javascript
JS delegate与live浅析
2013/12/21 Javascript
举例讲解AngularJS中的模块
2015/06/17 Javascript
浅析node连接数据库(express+mysql)
2015/11/30 Javascript
Angularjs实现多个页面共享数据的方式
2016/03/29 Javascript
vue 的点击事件获取当前点击的元素方法
2018/09/15 Javascript
写gulp遇到的ES6问题详解
2018/12/03 Javascript
总结4个方面优化Vue项目
2019/02/11 Javascript
vue实现搜索功能
2019/05/28 Javascript
前端vue-cli项目中使用img图片和background背景图的几种方法
2019/11/13 Javascript
JS数组方法concat()用法实例分析
2020/01/18 Javascript
Javascript查看大图功能代码实现
2020/05/07 Javascript
python实现对excel进行数据剔除操作实例
2017/12/07 Python
快速查询Python文档方法分享
2017/12/27 Python
解决新版Pycharm中Matplotlib图像不在弹出独立的显示窗口问题
2019/01/15 Python
python线程定时器Timer实现原理解析
2019/11/30 Python
Python 装饰器原理、定义与用法详解
2019/12/07 Python
基于Python3.6中的OpenCV实现图片色彩空间的转换
2020/02/03 Python
Python基础教程(一)——Windows搭建开发Python开发环境
2020/07/20 Python
python 基于selenium实现鼠标拖拽功能
2020/12/24 Python
前端制作动画的几种方式(css3,js)
2016/12/12 HTML / CSS
使用PDF.JS插件在HTML中预览PDF文件的方法
2018/08/29 HTML / CSS
DOUGLAS荷兰:购买香水和化妆品
2020/10/24 全球购物
linux面试题参考答案(9)
2015/01/07 面试题
收银员的岗位职责范本
2014/02/04 职场文书
党的群众路线教育实践活动学习笔记
2014/11/05 职场文书
风雨哈佛路观后感
2015/06/03 职场文书
行为规范主题班会
2015/08/13 职场文书
2015年度工程师评职称工作总结
2015/10/14 职场文书
Python中使用Lambda函数的5种用法
2021/04/01 Python
GoFrame基于性能测试得知grpool使用场景
2022/06/21 Golang