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 装饰器实现DRY(不重复代码)原则
Mar 05 Python
python 读取文件并替换字段的实例
Jul 12 Python
python开启debug模式的方法
Jun 27 Python
python和c语言的主要区别总结
Jul 07 Python
python 画出使用分类器得到的决策边界
Aug 21 Python
Python中list循环遍历删除数据的正确方法
Sep 02 Python
jupyter 导入csv文件方式
Apr 21 Python
通过代码实例了解Python异常本质
Sep 16 Python
python与idea的集成的实现
Nov 20 Python
pytorch中index_select()的用法详解
Jan 06 Python
python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解
Jan 26 Python
Python 统计序列中元素的出现频度
Apr 26 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类
2006/11/27 PHP
PHP中字符安全过滤函数使用小结
2015/02/25 PHP
PHP工厂模式的日常使用
2019/03/20 PHP
豆瓣网的jquery代码实例
2008/06/15 Javascript
jQuery each()小议
2010/03/18 Javascript
jQuery源码分析之jQuery中的循环技巧详解
2014/09/06 Javascript
浅谈JavaScript函数节流
2014/12/09 Javascript
js读取csv文件并使用json显示出来
2015/01/09 Javascript
JS延时提示框实现方法详解
2015/11/26 Javascript
Angular中$compile源码分析
2016/01/28 Javascript
浅谈jQuery 选择器和dom操作
2016/06/07 Javascript
JavaScript寄生组合式继承实例详解
2018/01/06 Javascript
layer更改皮肤的实现方法
2019/09/11 Javascript
在SSM框架下用laypage和ajax实现分页和数据交互的方法
2019/09/27 Javascript
基于vue实现图片验证码倒计时60s功能
2019/12/10 Javascript
JavaScript原生数组函数实例汇总
2020/10/14 Javascript
Vue页面渲染中key的应用实例教程
2021/01/12 Vue.js
python实现给字典添加条目的方法
2014/09/25 Python
Python标准库之Sys模块使用详解
2015/05/23 Python
python套接字流重定向实例汇总
2016/03/03 Python
python 把数据 json格式输出的实例代码
2016/10/31 Python
django 外键model的互相读取方法
2018/12/15 Python
python实现文本进度条 程序进度条 加载进度条 单行刷新功能
2019/07/03 Python
python判断无向图环是否存在的示例
2019/11/22 Python
python打印文件的前几行或最后几行教程
2020/02/13 Python
Django设置Postgresql的操作
2020/05/14 Python
python利用线程实现多任务
2020/09/18 Python
css3 position fixed固定居中问题解决方案
2014/08/19 HTML / CSS
欧洲顶级体育电子商务网站:SportsShoes.com
2018/03/27 全球购物
大学生自我鉴定范文
2013/12/28 职场文书
教师岗位聘任书范文
2014/03/29 职场文书
2014年初一班主任工作总结
2014/11/08 职场文书
2015年大学元旦晚会活动策划书
2014/12/09 职场文书
2015年发展党员工作总结报告
2015/03/31 职场文书
毕业赠语大全
2015/06/23 职场文书
Python下opencv库的安装过程及问题汇总
2021/06/11 Python