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 04 Python
python在线编译器的简单原理及简单实现代码
Feb 02 Python
Python 给某个文件名添加时间戳的方法
Oct 16 Python
解决安装python库时windows error5 报错的问题
Oct 21 Python
python实现桌面壁纸切换功能
Jan 21 Python
使用python 写一个静态服务(实战)
Jun 28 Python
学Python 3的理由和必要性
Nov 19 Python
Python之指数与E记法的区别详解
Nov 21 Python
keras实现基于孪生网络的图片相似度计算方式
Jun 11 Python
python3.7添加dlib模块的方法
Jul 01 Python
Python通过队列来实现进程间通信的示例
Oct 14 Python
Python实现制作销售数据可视化看板详解
Nov 27 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
虹吸式咖啡壶操作
2021/03/03 冲泡冲煮
特详细的PHPMYADMIN简明安装教程
2008/08/01 PHP
PHP管理依赖(dependency)关系工具 Composer 安装与使用
2014/08/18 PHP
PHP积分兑换接口实例
2015/02/09 PHP
PHP5.3新特性小结
2016/02/14 PHP
WordPress过滤垃圾评论的几种主要方法小结
2016/07/11 PHP
php获取目录中所有文件名及判断文件与目录的简单方法
2017/03/04 PHP
php实现产品加入购物车功能(1)
2020/07/23 PHP
js no-repeat写法 背景不重复
2009/03/18 Javascript
offsetParent 算法分析
2010/04/05 Javascript
基于jQuery实现点击同时更改两个iframe的网址
2010/07/01 Javascript
javascript下利用arguments实现string.format函数
2010/08/24 Javascript
js写一个字符串转成驼峰的实例
2013/06/21 Javascript
JS按字节截取字符长度实例
2013/11/20 Javascript
js取float型小数点后两位数的方法
2014/01/18 Javascript
讲解JavaScript中for...in语句的使用方法
2015/06/03 Javascript
Javascript实现Array和String互转换的方法
2015/12/21 Javascript
15个值得开发人员关注的jQuery开发技巧和心得总结【经典收藏】
2016/05/25 Javascript
JavaScript检查数据中是否存在相同的元素(两种方法)
2018/10/07 Javascript
jquery无缝图片轮播组件封装
2020/11/25 jQuery
[01:56]2014DOTA2西雅图邀请赛 MVP外卡赛老队长精辟点评
2014/07/09 DOTA
[01:15:29]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第三局
2016/03/04 DOTA
Python网页解析利器BeautifulSoup安装使用介绍
2015/03/17 Python
利用Python实现命令行版的火车票查看器
2016/08/05 Python
对pytorch网络层结构的数组化详解
2018/12/08 Python
详解mac python+selenium+Chrome 简单案例
2019/11/08 Python
python实现同一局域网下传输图片
2020/03/20 Python
基于canvas使用贝塞尔曲线平滑拟合折线段的方法
2018/01/10 HTML / CSS
西班牙在线药店:DosFarma
2020/03/28 全球购物
承办会议欢迎词
2014/01/17 职场文书
写自荐信三大法宝
2014/01/24 职场文书
《池塘边的叫声》教学反思
2014/04/12 职场文书
公务员考察材料范文
2014/12/23 职场文书
JavaScript实现简单拖拽效果
2021/09/15 Javascript
详细聊一聊mysql的树形结构存储以及查询
2022/04/05 MySQL
centos环境下nginx高可用集群的搭建指南
2022/07/23 Servers