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之大话题小函数(1)
Oct 10 Python
深入理解Python 代码优化详解
Oct 27 Python
Python读写unicode文件的方法
Jul 10 Python
Python线性回归实战分析
Feb 01 Python
python dataframe 输出结果整行显示的方法
Jun 14 Python
浅析python的优势和不足之处
Nov 20 Python
对Python3.x版本print函数左右对齐详解
Dec 22 Python
python写入文件自动换行问题的方法
Jul 05 Python
Python使用Turtle库绘制一棵西兰花
Nov 23 Python
python中count函数简单的实例讲解
Feb 06 Python
Python3+selenium实现cookie免密登录的示例代码
Mar 18 Python
pandas实现导出数据的四种方式
Dec 13 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/06/21 PHP
php自定义urlencode,urldecode函数实例
2015/03/24 PHP
PHP加密解密类实例分析
2015/04/20 PHP
PHP编写登录验证码功能 附调用方法
2016/05/19 PHP
php字符串的替换,分割和连接方法
2016/05/23 PHP
jquery中的$(document).ready()与window.onload的区别
2009/11/18 Javascript
jquery 实现密码框的显示与隐藏示例代码
2013/09/18 Javascript
jQuery中验证表单提交方式及序列化表单内容的实现
2014/01/06 Javascript
JS小游戏之极速快跑源码详解
2014/09/25 Javascript
浅谈javascript 函数属性和方法
2015/01/21 Javascript
jQuery easyui的validatebox校验规则扩展及easyui校验框validatebox用法
2016/01/18 Javascript
jQuery实现搜索页面关键字的功能
2017/02/16 Javascript
ES6学习之变量的两种命名方法示例
2017/07/18 Javascript
vue-router重定向不刷新问题的解决
2018/06/25 Javascript
基于Vue2实现简易的省市区县三级联动组件效果
2018/11/05 Javascript
详解VSCode配置启动Vue项目
2019/05/14 Javascript
[00:26]TI7不朽珍藏III——冥界亚龙不朽展示
2017/07/15 DOTA
Python中__name__的使用实例
2015/04/14 Python
python通过imaplib模块读取gmail里邮件的方法
2015/05/08 Python
解析Python中的__getitem__专有方法
2016/06/27 Python
Python批量提取PDF文件中文本的脚本
2018/03/14 Python
python实现微信自动回复功能
2018/04/11 Python
windows下python 3.6.4安装配置图文教程
2018/08/21 Python
使用python快速在局域网内搭建http传输文件服务的方法
2019/11/14 Python
python3 dict ndarray 存成json,并保留原数据精度的实例
2019/12/06 Python
python读取excel数据绘制简单曲线图的完整步骤记录
2020/10/30 Python
24个canvas基础知识小结
2014/12/17 HTML / CSS
公务员培训自我鉴定
2013/09/19 职场文书
实习自我鉴定模板
2013/09/28 职场文书
学院书画协会部门职责
2013/11/28 职场文书
如何撰写岗位职责
2014/02/01 职场文书
研究生毕业自我鉴定范文
2014/03/27 职场文书
学雷锋宣传标语
2014/06/25 职场文书
2019生态环境保护倡议书!
2019/07/03 职场文书
创业计划书之烤红薯
2019/09/26 职场文书
Go语言怎么使用变长参数函数
2022/07/15 Golang