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 随机数生成的代码的详细分析
May 15 Python
python轻松实现代码编码格式转换
Mar 26 Python
windows下添加Python环境变量的方法汇总
May 14 Python
python3中函数参数的四种简单用法
Jul 09 Python
Python3单行定义多个变量或赋值方法
Jul 12 Python
Django2.1.3 中间件使用详解
Nov 26 Python
解析Python的缩进规则的使用
Jan 16 Python
pytorch三层全连接层实现手写字母识别方式
Jan 14 Python
python json 递归打印所有json子节点信息的例子
Feb 27 Python
python实现斗地主分牌洗牌
Jun 22 Python
python中remove函数的踩坑记录
Jan 04 Python
python爬取某网站原图作为壁纸
Jun 02 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
关于BIG5-HKSCS的解决方法
2007/03/20 PHP
wordpress自定义url参数实现路由功能的代码示例
2013/11/28 PHP
利用浏览器的Javascript控制台调试PHP程序
2014/01/08 PHP
PHP利用header跳转失效的解决方法
2014/10/24 PHP
php使用ffmpeg向视频中添加文字字幕的实现方法
2016/05/23 PHP
js中匿名函数的N种写法
2010/09/08 Javascript
基于jquery的用鼠标画出可移动的div
2012/09/06 Javascript
基于jquery的has()方法以及与find()方法以及filter()方法的区别详解
2013/04/26 Javascript
jQuery插件的写法分享
2013/06/12 Javascript
JS 日期比较大小的简单实例
2014/01/13 Javascript
js/jquery获取文本框输入焦点的方法
2014/03/04 Javascript
jquery实现人性化的有选择性禁用鼠标右键
2014/06/30 Javascript
javascript创建动态表单的方法
2015/07/25 Javascript
js阻止浏览器默认行为触发的通用方法(推荐)
2016/05/15 Javascript
浅谈JavaScript函数的四种存在形态
2016/06/08 Javascript
Bootstrap笔记之缩略图、警告框实例详解
2017/03/09 Javascript
Vue.js实现实例搜索应用功能详细代码
2017/08/24 Javascript
JS实现左边列表移到到右边列表功能
2018/03/28 Javascript
Vue单页应用引用单独的样式文件的两种方式
2018/03/30 Javascript
react native基于FlatList下拉刷新上拉加载实现代码示例
2018/09/30 Javascript
Vue项目引进ElementUI组件的方法
2018/11/11 Javascript
JavaScript制作3D旋转相册
2020/08/02 Javascript
Vue中常用rules校验规则(实例代码)
2019/11/14 Javascript
vue 使用 vue-pdf 实现pdf在线预览的示例代码
2020/04/26 Javascript
[50:21]Liquid vs Winstrike 2018国际邀请赛小组赛BO2 第二场
2018/08/19 DOTA
Python登录注册验证功能实现
2018/06/18 Python
Python3简单爬虫抓取网页图片代码实例
2019/08/26 Python
python写文件时覆盖原来的实例方法
2020/07/22 Python
CSS3颜色值RGBA与渐变色使用介绍
2020/03/06 HTML / CSS
HTML5的postMessage的使用手册
2018/12/19 HTML / CSS
全球摩托车装备领导者:RevZilla
2017/09/04 全球购物
我的梦中国梦演讲稿
2014/04/23 职场文书
党的群众路线教育实践活动总结材料
2014/10/30 职场文书
离婚财产分割协议书
2015/08/11 职场文书
创业计划书之物流运送
2019/09/17 职场文书
Qt数据库应用之实现图片转pdf
2022/06/01 Java/Android