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画图学习入门教程
Jul 01 Python
基于Python函数的作用域规则和闭包(详解)
Nov 29 Python
python spyder中读取txt为图片的方法
Apr 27 Python
在IPython中执行Python程序文件的示例
Nov 01 Python
使用 Visual Studio Code(VSCode)搭建简单的Python+Django开发环境的方法步骤
Dec 17 Python
python 文本单词提取和词频统计的实例
Dec 22 Python
Python里字典的基本用法(包括嵌套字典)
Feb 27 Python
pandas读取CSV文件时查看修改各列的数据类型格式
Jul 07 Python
详解Python中的各种转义符\n\r\t
Jul 10 Python
python 基于opencv实现高斯平滑
Dec 18 Python
如何利用pygame实现打飞机小游戏
May 30 Python
Python机器学习之底层实现KNN
Jun 20 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
解决GD中文乱码问题
2007/02/14 PHP
基于php导出到Excel或CSV的详解(附utf8、gbk 编码转换)
2013/06/25 PHP
Jquery Ajax学习实例4 向WebService发出请求,返回实体对象的异步调用
2010/03/16 Javascript
Windows系统下Node.js的简单入门教程
2015/06/23 Javascript
js实现tab切换效果实例
2015/09/16 Javascript
Javascript验证方法大全
2015/09/21 Javascript
jquery实现删除一个元素后面的所有元素功能
2015/12/21 Javascript
jQuery实现div随意拖动的实例代码(通用代码)
2016/01/28 Javascript
JS实现的打字机效果完整实例
2016/06/20 Javascript
基于JS分页控件实现简单美观仿淘宝分页按钮效果
2016/11/07 Javascript
JS正则子匹配实例分析
2016/12/22 Javascript
javascript使用递归算法求两个数字组合功能示例
2017/01/03 Javascript
jQuery中table数据的值拷贝和拆分
2017/03/19 Javascript
vue使用axios实现文件上传进度的实时更新详解
2017/12/20 Javascript
echarts整合多个类似option的方法实例
2018/07/10 Javascript
JavaScript去掉数组重复项的方法分析【测试可用】
2018/07/19 Javascript
vuejs前后端数据交互之从后端请求数据的实例
2018/08/11 Javascript
浅谈高大上的微信小程序中渲染html内容—技术分享
2018/10/25 Javascript
详解从react转职到vue开发的项目准备
2019/01/14 Javascript
JS对日期操作封装代码实例
2019/11/08 Javascript
JavaScript装箱及拆箱boxing及unBoxing用法解析
2020/06/15 Javascript
python分析nignx访问日志脚本分享
2015/02/26 Python
小议Python中自定义函数的可变参数的使用及注意点
2016/06/21 Python
python去除字符串中的换行符
2017/10/11 Python
解决pycharm界面不能显示中文的问题
2018/05/23 Python
Python实现京东秒杀功能代码
2019/05/16 Python
python rsync服务器之间文件夹同步脚本
2019/08/29 Python
python实现飞机大战小游戏
2019/11/08 Python
Moss Bros官网:英国排名第一的西装店
2020/02/26 全球购物
如何编写优秀的食品项目创业计划书
2014/01/23 职场文书
陈欧的广告词
2014/03/18 职场文书
个人课题方案
2014/05/08 职场文书
销售员态度差检讨书
2014/10/26 职场文书
2014年合同管理工作总结
2014/12/02 职场文书
2016开学第一课心得体会
2016/01/23 职场文书
Nginx工作模式及代理配置的使用细节
2022/03/21 Servers