python+jinja2实现接口数据批量生成工具


Posted in Python onAugust 28, 2019

在做接口测试的时候,我们经常会遇到一种情况就是要对接口的参数进行各种可能的校验,手动修改很麻烦,尤其是那些接口参数有几十个甚至更多的,有没有一种方法可以批量的对指定参数做生成处理呢。

答案是肯定的!

python的jinja2模板库可以很好的满足我们的需求,通过维护一个原始数据模板,将我们想要动态生成的变量模板化,就可以实现需求。

现在我们有这样的一个请求数据

{
 "abc":"123",
 "p2p":"123",
 "smid":"20180807220733939b66d80092eea34ce9e77f30bedff12345b7d5a3faa11b",
 "test":{
  "test1":"1",
  "test2":"2"
 },
 "test3":"3"
}

如果想对其中的smid字段进行批量修改并生成新的请求数据就可以进行如下操作:

1、首先新建一个名为fp_template.txt的文本文件;

2、将上面的接口请求数据复制粘贴进这个txt文件中,我们以此作为“模板文件”;

3、新建一个predata文件夹用来存放生成后的数据文件;

4、对smid字段进行模板化(模板格式可以参考jinja2的语法,这里不做赘述),于是上面的请求参数就变成了下面这样:

{
 "abc":"123",
 "p2p":"123",
 "smid":"{{ smid }}",
 "test":{
  "test1":"1",
  "test2":"2"
 },
 "test3":"3"
}

实现代码代码如下:

# -*- coding: UTF-8 -*-
from jinja2 import Environment,FileSystemLoader
import os

class DataTemplateFaker:
 def __init__(self):
  self.aesPath = os.getcwd()#获取启动路径
  self.resultPath = self.aesPath + "/predata/"#指定用来保存生成数据的路径
  self.templateFile = "fp_template.txt"

 #修改我们要批量生成smid的格式
 def init_smid(self,start,end):
  smidArg = [x for x in range(start, end)]
  re = []
  for n in smidArg:
   re.append("20180807220733939b66d80092eea34ce9e77f30bedff" + str(n) + "b7d5a3faa11b")
  return re

 #操作模板文件
 def preContent(self,arg):
  env = Environment(loader=FileSystemLoader('./'))
  tpl = env.get_template(self.templateFile)
  renderContent = tpl.render(smid=arg)
  return renderContent

 #通过修改的smid列表批量替换模板文件并写入指定文件中
 def makeContent(self,preList):
  x = 0
  for i in preList:
   x = x + 1
   filename = str(self.resultPath) + 'data_' + str(x) + '.txt' #用以区分存放新生成的请求数据(也可以写到一个文件中)
   renderContent = self.preContent(i)
   with open(filename, 'w') as f:
    f.writelines(renderContent)
    f.close()

if __name__ == "__main__":
 AT = DataTemplateFaker()
 reList = AT.init_smid(1,10)#控制生成数据的范围
 AT.makeContent(reList)

运行程序,就能得到新生成的数据

python+jinja2实现接口数据批量生成工具

当然,我们也可以对其他的参数进行指定修改,如修改p2p,只需要修改模板文件:

{
 "abc":"123",
 "p2p":"{{ p2p }}",
 "smid":"20180807220733939b66d80092eea34ce9e77f30bedff12345b7d5a3faa11b",
 "test":{
  "test1":"1",
  "test2":"2"
 },
 "test3":"3"
}

然后在代码中加入一个方法init_p2p()

# -*- coding: UTF-8 -*-
from jinja2 import Environment,FileSystemLoader
import os

class DataTemplateFaker:
 def __init__(self):
  self.aesPath = os.getcwd()#获取启动路径
  self.resultPath = self.aesPath + "/predata/"#指定用来保存生成数据的路径
  self.templateFile = "fp_template.txt"

 #修改我们要批量生成smid的格式
 def init_smid(self,start,end):
  smidArg = [x for x in range(start, end)]
  re = []
  for n in smidArg:
   re.append("20180807220733939b66d80092eea34ce9e77f30bedff" + str(n) + "b7d5a3faa11b")
  return re
 #修改我们要批量生成p2p的格式 
 def init_p2p(self,start,end):
  p2pArg = [x for x in range(start, end)]
  return p2pArg

 #操作模板文件
 def preContent(self,arg):
  env = Environment(loader=FileSystemLoader('./'))
  tpl = env.get_template(self.templateFile)
  renderContent = tpl.render(smid=arg)
  return renderContent

 #通过修改的smid列表批量替换模板文件并写入指定文件中
 def makeContent(self,preList):
  x = 0
  for i in preList:
   x = x + 1
   filename = str(self.resultPath) + 'data_' + str(x) + '.txt' #用以区分存放新生成的请求数据(也可以写到一个文件中)
   renderContent = self.preContent(i)
   with open(filename, 'w') as f:
    f.writelines(renderContent)
    f.close()

if __name__ == "__main__":
 AT = DataTemplateFaker()
 reList = AT.init_p2p(1,10)#控制生成数据的范围
 AT.makeContent(reList)

这只是一个很简单的demo,当然还有很多可优化的地方,比如多字段同时修改、引入faker库进行关联生成伪造数据等,越是复杂且参数繁多的接口越适用,其他的方法就可以天马行空,任君发挥了。

总结

以上所述是小编给大家介绍的python+jinja2实现接口数据批量生成工具,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
Python中处理unchecked未捕获异常实例
Jan 17 Python
给Python入门者的一些编程建议
Jun 15 Python
python绘制铅球的运行轨迹代码分享
Nov 14 Python
Python中反射和描述器总结
Sep 23 Python
python实现简单flappy bird
Dec 24 Python
python模块之subprocess模块级方法的使用
Mar 26 Python
解决python文件双击运行秒退的问题
Jun 24 Python
什么是python的列表推导式
May 26 Python
Python文件夹批处理操作代码实例
Jul 21 Python
Python学习工具jupyter notebook安装及用法解析
Oct 23 Python
Python的信号库Blinker用法详解
Dec 31 Python
Python爬虫之用Xpath获取关键标签实现自动评论盖楼抽奖(二)
Jun 07 Python
解决Atom安装Hydrogen无法运行python3的问题
Aug 28 #Python
opencv实现简单人脸识别
Feb 19 #Python
Atom Python 配置Python3 解释器的方法
Aug 28 #Python
python聚类算法解决方案(rest接口/mpp数据库/json数据/下载图片及数据)
Aug 28 #Python
Numpy的简单用法小结
Aug 28 #Python
Python 通过截图匹配原图中的位置(opencv)实例
Aug 27 #Python
Python 转换文本编码实现解析
Aug 27 #Python
You might like
PHP乱码问题,UTF-8乱码常见问题小结
2012/04/09 PHP
探讨:如何使用PHP实现计算两个日期间隔的年、月、周、日数
2013/06/13 PHP
PHP错误提示的关闭方法详解
2013/06/23 PHP
zf框架的registry(注册表)使用示例
2014/03/13 PHP
PHP时间类完整实例(非常实用)
2015/12/25 PHP
laravel 模型查询按照whereIn排序的示例
2019/10/16 PHP
PHP架构及原理知识点详解
2019/12/22 PHP
基于jquery的大众点评,分类导航实现代码
2011/08/23 Javascript
jquery实现多条件筛选特效代码分享
2015/08/28 Javascript
JS实现Fisheye效果动感放大菜单代码
2015/10/21 Javascript
js实现搜索框关键字智能匹配代码
2020/03/26 Javascript
简单谈谈javascript中this的隐式绑定
2016/02/22 Javascript
jQuery实现联动下拉列表查询框
2017/01/04 Javascript
jquery 手势密码插件
2017/03/17 Javascript
JS去掉字符串前后空格或去掉所有空格的用法
2017/03/25 Javascript
详解vue表单验证组件 v-verify-plugin
2017/04/19 Javascript
Node.js 异步异常的处理与domain模块解析
2017/05/10 Javascript
Vue实现百度下拉提示搜索功能
2017/06/21 Javascript
完美解决axios跨域请求出错的问题
2018/02/05 Javascript
微信小程序实现动态获取元素宽高的方法分析
2018/12/10 Javascript
vue基础之使用get、post、jsonp实现交互功能示例
2019/03/12 Javascript
es6 symbol的实现方法示例
2019/04/02 Javascript
VUE的history模式下除了index外其他路由404报错解决办法
2019/08/21 Javascript
js实现页面导航层级指示效果
2020/08/25 Javascript
解决出现Incorrect integer value: '' for column 'id' at row 1的问题
2017/10/29 Python
python中的闭包函数
2018/02/09 Python
python如何将多个PDF进行合并
2019/08/13 Python
Python的缺点和劣势分析
2019/11/19 Python
python raise的基本使用
2020/09/10 Python
python3 kubernetes api的使用示例
2021/01/12 Python
英国花园家具中心:Garden Furniture Centre
2017/08/24 全球购物
评析教师个人的自我评价
2014/02/19 职场文书
2015年店长个人工作总结
2015/10/23 职场文书
2016婚礼主持词开场白
2015/11/24 职场文书
Django利用AJAX技术实现博文实时搜索
2021/05/06 Python
《勇者辞职不干了》上卷BD发售宣传CM公开
2022/04/08 日漫