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实例分享:快速查找出被挂马的文件
Jun 08 Python
python正则表达式re模块详解
Jun 25 Python
在Django的视图(View)外使用Session的方法
Jul 23 Python
Python按行读取文件的简单实现方法
Jun 22 Python
python+pandas生成指定日期和重采样的方法
Apr 11 Python
django_orm查询性能优化方法
Aug 20 Python
python之Flask实现简单登录功能的示例代码
Dec 24 Python
Python语言进阶知识点总结
May 28 Python
django echarts饼图数据动态加载的实例
Aug 12 Python
python中if及if-else如何使用
Jun 02 Python
python logging 重复写日志问题解决办法详解
Aug 04 Python
10个示例带你掌握python中的元组
Nov 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中目录,文件操作详谈
2007/03/19 PHP
php实现mysql连接池效果实现代码
2018/01/25 PHP
Laravel框架实现的批量删除功能示例
2019/01/16 PHP
PHP中命名空间的使用例子
2019/03/22 PHP
PHP+iframe模拟Ajax上传文件功能示例
2019/07/02 PHP
JavaScript使用prototype定义对象类型
2007/02/07 Javascript
出现“不能执行已释放的Script代码”错误的原因及解决办法
2007/08/29 Javascript
javascript string字符串优化问题
2011/07/31 Javascript
图片放大镜jquery.jqzoom.js使用实例附放大镜图标
2014/06/19 Javascript
使用变量动态设置js的属性名
2014/10/19 Javascript
设计模式中的组合模式在JavaScript程序构建中的使用
2016/05/18 Javascript
如何解决hover在ie6中的兼容性问题
2016/12/15 Javascript
jQuery Mobile漏洞会有跨站脚本攻击风险
2017/02/12 Javascript
bootstrap paginator分页插件的两种使用方式实例详解
2017/11/14 Javascript
微信小程序tabBar模板用法实例分析【附demo源码下载】
2017/11/28 Javascript
jquery实现侧边栏左右伸缩效果的示例
2017/12/19 jQuery
vue的一个分页组件的示例代码
2017/12/25 Javascript
微信小程序自定义toast弹窗效果的实现代码
2018/11/15 Javascript
vue实现跨域的方法分析
2019/05/21 Javascript
pandas使用get_dummies进行one-hot编码的方法
2018/07/10 Python
计算Python Numpy向量之间的欧氏距离实例
2020/05/22 Python
解决Keyerror ''acc'' KeyError: ''val_acc''问题
2020/06/18 Python
Python 通过爬虫实现GitHub网页的模拟登录的示例代码
2020/08/17 Python
如何查看python关键字
2021/01/17 Python
html5教程实现Photoshop渐变色效果
2013/12/04 HTML / CSS
HTML5 FileReader对象的具体使用方法
2020/05/22 HTML / CSS
美国购买新书和二手书网站:Better World Books
2018/10/31 全球购物
办公室主任职责范文
2013/11/08 职场文书
机关干部三严三实心得体会
2014/10/13 职场文书
酒店辞职书怎么写
2015/02/26 职场文书
学校党员干部承诺书
2015/05/04 职场文书
SpringBoot生成License的实现示例
2021/06/16 Java/Android
解析高可用Redis服务架构分析与搭建方案
2021/06/20 Redis
Feign调用传输文件异常的解决
2021/06/24 Java/Android
Java Dubbo框架知识点梳理
2021/06/26 Java/Android
MyBatis-Plus 批量插入数据的操作方法
2021/09/25 Java/Android