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实现TCP服务器端与客户端的方法详解
Apr 30 Python
详解Python中的日志模块logging
Jun 19 Python
requests和lxml实现爬虫的方法
Jun 11 Python
Python实现的微信公众号群发图片与文本消息功能实例详解
Jun 30 Python
Python之列表实现栈的工作功能
Jan 28 Python
Python爬虫运用正则表达式的方法和优缺点
Aug 25 Python
Python彻底删除文件夹及其子文件方式
Dec 23 Python
pytorch 利用lstm做mnist手写数字识别分类的实例
Jan 10 Python
解决安装新版PyQt5、PyQT5-tool后打不开并Designer.exe提示no Qt platform plugin的问题
Apr 24 Python
Python远程linux执行命令实现
Nov 11 Python
python中pandas对多列进行分组统计的实现
Jun 18 Python
总结Python连接CS2000的详细步骤
Jun 23 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用ini_get获取php.ini里变量值的方法
2015/03/04 PHP
PHP数学运算函数大汇总(经典值得收藏)
2016/04/01 PHP
ThinkPHP3.2.3实现分页的方法详解
2016/06/03 PHP
解决Laravel5.x的php artisan migrate数据库迁移创建操作报错SQLSTATE[42000]
2020/04/06 PHP
一些常用的Javascript函数
2006/12/22 Javascript
Javascript 日期对象Date扩展方法
2009/05/30 Javascript
为radio类型的INPUT添加客户端脚本(附加实现JS来禁用onClick事件思路代码)
2010/11/11 Javascript
jquery ui bootstrap 实现自定义风格
2014/11/14 Javascript
JS动态改变表格边框宽度的方法
2015/03/31 Javascript
全面解析JavaScript里的循环方法之forEach,for-in,for-of
2020/04/20 Javascript
jquery删除数组中重复元素
2016/12/05 Javascript
使用bat打开多个cmd窗口执行gulp、node
2017/02/17 Javascript
浅谈vue.js中v-for循环渲染
2017/07/26 Javascript
基于require.js的使用(实例讲解)
2017/09/07 Javascript
js Date()日期函数浏览器兼容问题解决方法
2017/09/12 Javascript
JavaScript通过mouseover()实现图片变大效果的示例
2017/12/20 Javascript
js原生方法被覆盖,从新赋值原生的方法
2018/01/02 Javascript
Angular5.0 子组件通过service传递值给父组件的方法
2018/07/13 Javascript
vue devtools的安装与使用教程
2018/08/08 Javascript
javascript实现日历效果
2019/06/17 Javascript
layui table 表格模板按钮的实例代码
2019/09/21 Javascript
js实现开关灯效果
2020/03/30 Javascript
JS实现导航栏楼层特效
2020/01/01 Javascript
Vue中qs插件的使用详解
2020/02/07 Javascript
JavaScript实现省市区三级联动
2020/02/13 Javascript
Python 爬虫多线程详解及实例代码
2016/10/08 Python
Python读取txt文件数据的方法(用于接口自动化参数化数据)
2018/06/27 Python
Python实现Singleton模式的方式详解
2019/08/08 Python
django中使用事务及接入支付宝支付功能
2019/09/15 Python
python求一个字符串的所有排列的实现方法
2020/02/04 Python
canvas实现按住鼠标移动绘制出轨迹的示例代码
2018/02/05 HTML / CSS
基于Html5实现的语音搜索功能
2019/05/13 HTML / CSS
Wallis官网:英国女装零售商
2020/01/21 全球购物
行政总监岗位职责
2013/12/05 职场文书
客服专员岗位职责
2015/02/10 职场文书
2016年春季趣味运动会开幕词
2016/03/04 职场文书