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的列表中利用remove()方法删除元素的教程
May 21 Python
浅谈Python 中整型对象的存储问题
May 16 Python
详解Python多线程
Nov 14 Python
Numpy数据类型转换astype,dtype的方法
Jun 09 Python
python消费kafka数据批量插入到es的方法
Dec 27 Python
Python多进程入门、分布式进程数据共享实例详解
Jun 03 Python
Python 3 使用Pillow生成漂亮的分形树图片
Dec 24 Python
Python 使用 environs 库定义环境变量的方法
Feb 25 Python
Python实现将元组中的元素作为参数传入函数的操作
Jun 05 Python
基于matplotlib中ion()和ioff()的使用详解
Jun 16 Python
python连接手机自动搜集蚂蚁森林能量的实现代码
Feb 24 Python
Python集合set()使用的方法详解
Mar 18 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
一个SQL管理员的web接口
2006/10/09 PHP
基于wordpress主题制作的具体实现步骤
2013/05/10 PHP
ThinkPHP之用户注册登录留言完整实例
2014/07/22 PHP
php简单实现批量上传图片的方法
2016/05/09 PHP
基于JQuery的多标签实现代码
2012/09/19 Javascript
如何用ajax来创建一个XMLHttpRequest对象
2012/12/10 Javascript
JS中setInterval、setTimeout不能传递带参数的函数的解决方案
2013/04/28 Javascript
JS中dom0级事件和dom2级事件的区别介绍
2016/05/05 Javascript
javascript对象的相关操作小结
2016/05/16 Javascript
Javascript点击其他任意地方隐藏关闭DIV实例
2016/06/21 Javascript
Ajax使用原生态JS验证用户名是否存在
2020/05/26 Javascript
一个简易的js图片轮播效果
2017/07/22 Javascript
JS实现DOM删除节点操作示例
2018/04/04 Javascript
关于vue组件事件属性穿透详解
2019/10/28 Javascript
Angular进行简单单元测试的实现方法实例
2020/08/16 Javascript
对于Python异常处理慎用“except:pass”建议
2015/04/02 Python
Python遍历目录中的所有文件的方法
2016/07/08 Python
Python最火、R极具潜力 2017机器学习调查报告
2017/12/11 Python
python生成ppt的方法
2018/06/07 Python
Numpy截取指定范围内的数据方法
2018/11/14 Python
Python3.4学习笔记之类型判断,异常处理,终止程序操作小结
2019/03/01 Python
Python3.5文件修改操作实例分析
2019/05/01 Python
在服务器上安装python3.8.2环境的教程详解
2020/04/26 Python
Python网络爬虫四大选择器用法原理总结
2020/06/01 Python
Django前后端分离csrf token获取方式
2020/12/25 Python
世界上最大的高分辨率在线图片库:Alamy
2018/07/07 全球购物
茶叶生产计划书
2014/01/10 职场文书
高一历史教学反思
2014/01/13 职场文书
求职信格式要求
2014/05/23 职场文书
开展党的群众路线教育实践活动情况汇报
2014/11/05 职场文书
搭讪开场白台词大全
2015/05/28 职场文书
新闻稿标题
2015/07/18 职场文书
让人感觉高大上的讲话稿怎么写?
2019/07/08 职场文书
导游词之香港-太平山顶
2019/10/18 职场文书
vue-element-admin项目导入和导出的实现
2021/05/21 Vue.js
python如何查找列表中元素的位置
2022/05/30 Python