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 面向对象 成员的访问约束
Dec 23 Python
python二叉树遍历的实现方法
Nov 21 Python
使用Nginx+uWsgi实现Python的Django框架站点动静分离
Mar 21 Python
Python3.6 Schedule模块定时任务(实例讲解)
Nov 09 Python
python邮件发送smtplib使用详解
Jun 16 Python
Python实用技巧之利用元组代替字典并为元组元素命名
Jul 11 Python
解决python opencv无法显示图片的问题
Oct 28 Python
python利用thrift服务读取hbase数据的方法
Dec 27 Python
python opencv 读取本地视频文件 修改ffmpeg的方法
Jan 26 Python
Python如何筛选序列中的元素的方法实现
Jul 15 Python
Django ImageFiled上传照片并显示的方法
Jul 28 Python
使用Python Tkinter实现剪刀石头布小游戏功能
Oct 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中三个等号(===)和两个等号(==)的区别
2013/08/06 PHP
关于php程序报date()警告的处理(date_default_timezone_set)
2013/10/22 PHP
php页面函数设置超时限制的方法
2014/12/01 PHP
PHP识别二维码的方法(php-zbarcode安装与使用)
2016/07/07 PHP
laravel dingo API返回自定义错误信息的实例
2019/09/29 PHP
网站被黑的假象--ARP欺骗之页面中加入一段js
2007/05/16 Javascript
给artDialog 5.02 增加ajax get功能详细介绍
2012/11/13 Javascript
JavaScrip实现PHP print_r的数功能(三种方法)
2013/11/12 Javascript
jquery实现省市select下拉框的替换(示例代码)
2014/02/22 Javascript
node.js中的console.log方法使用说明
2014/12/09 Javascript
javascript实现单击和双击并存的方法
2014/12/13 Javascript
5个数组Array方法: indexOf、filter、forEach、map、reduce使用实例
2015/01/29 Javascript
js漂浮广告实现代码
2015/08/15 Javascript
基于nodejs+express(4.x+)实现文件上传功能
2015/11/23 NodeJs
nodejs redis 发布订阅机制封装实现方法及实例代码
2016/12/15 NodeJs
基于JavaScript实现窗口拖动效果
2017/01/18 Javascript
Vue中使用vux的配置详解
2017/05/05 Javascript
详解Node.js 命令行程序开发教程
2017/06/07 Javascript
JS按钮闪烁功能的实现代码
2017/07/21 Javascript
vue地址栏直接输入路由无效问题的解决
2018/11/15 Javascript
基于vue通用表单解决方案的思考与分析
2019/03/16 Javascript
js核心基础之闭包的应用实例分析
2019/05/11 Javascript
vue实现输入一位数字转汉字功能
2019/12/13 Javascript
js实现简单的秒表
2020/01/16 Javascript
Vue路由 重定向和别名的区别说明
2020/09/09 Javascript
从源码角度来回答keep-alive组件的缓存原理
2021/01/18 Javascript
原生JavaScript实现幻灯片效果
2021/02/19 Javascript
Python使用add_subplot与subplot画子图操作示例
2018/06/01 Python
OpenCV+Python识别车牌和字符分割的实现
2019/01/31 Python
Jupyter Notebook 实现正常显示中文和负号
2020/04/24 Python
浅谈Python 钉钉报警必备知识系统讲解
2020/08/17 Python
新大陆软件面试题
2016/11/24 面试题
2016年公司新年寄语
2015/08/17 职场文书
vue+element ui实现锚点定位
2021/06/29 Vue.js
利用 SQL Server 过滤索引提高查询语句的性能分析
2021/07/15 SQL Server
Redis之RedisTemplate配置方式(序列和反序列化)
2022/03/13 Redis