• 0
  • 0
分享

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

答案是肯定的!

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,FileSystemLoaderimport osclass 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)

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

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

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

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

# -*- coding: UTF-8 -*-from jinja2 import Environment,FileSystemLoaderimport osclass 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库进行关联生成伪造数据等,越是复杂且参数繁多的接口越适用,其他的方法就可以天马行空,任君发挥了。


本文为51Testing经授权转载,转载文章所包含的文字来源于作者:复现。如因内容或版权等问题,请联系51Testing进行删除。原文链接:https://www.jianshu.com/p/2321f4942b10。

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 在 Postman 中还有两个很重要的概念是环境Environment 和变量Variable。在讲解变量之前,需要先讲解一下环境,因为很多变量都和环境有关系。什么是环境 Environment?环境是由一组键值对形式的环境变量构成的变量组合。它有什么用?在做接口测试的时候,通常需要在本地调试,或者需要在开发环境、测试环境及开发环境运行,不同的环境的域名(host)、数据库配置等设置不同。通过配置不同的环境变量值,再在请求中使用不同的值,那么可以通过切换环境来切换不同的值,以达到不用修改任何请求就能在任意环境运行。在团队使用 Postman 的过程中,无需每个人都去配置这些环境,环境可以导出为...
            0 1 1235
            分享
          • 入门自动化测试必读自动化测试概念自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。通常,在设计了测试用例并通过评审之后,由测试人员根据测试用例中描述的规程一步步执行测试,得到实际结果与期望结果的比较。在此过程中,为了节省人力、时间或硬件资源,提高测试效率,便引入了自动化测试的概念。好处自动化测试可以替代大量的手工机械重复性操作,测试工程师可以把更多的时间花在更全面的用例设计和新功能的测试上;自动化测试可以大幅提升回归测试的效率;自动化测试适合在非工作时间执行测试,工作时间分析失败用例;自动化测试可以高效地实现某些手工测试无法完成或者代价巨大的测试类型,比如关键业务 7×24...
            0 0 925
            分享
          •   问题情景  服务器重新部署应用后,运行一段时间后,某一微服务开始出现错误提示:连接超时:服务忙,导致相关功能无法正常使用。  问题排查  日志查看  首先下载对应服务的日志查看报错内容,日志中出现了很多org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool 的异常信息。可以看出日志中的错误定位在HttpClient连接池,连接超时可能是连接池连接耗尽,没有可用连接导致无法正常获取连接提供服务。  初步猜想  HttpClient连接池中为了防止连接被长期占用会...
            13 13 1776
            分享
          • Web 应用程序的动态、快速变化和关键业务的重要性不断挑战传统自动化测试和测试框架的极限。 本文讨论了最常遇到的关键挑战,以及如何帮助简单地或自动地应对这些挑战。测试覆盖率测试覆盖率是通过测试验证的重要指标之一。当人们表示他们在构建测试覆盖率方面遇到挑战时,通常意味着他们没有足够的资源来足够快地编写测试以跟上测试需求的增长。解决挑战的尝试通常涉及招更多人活着将上线时间推迟,通常来说几乎不可能有立竿见影的解决方案。低代码工具可以通过最小化复杂性和消除特定技能的门槛来帮助加速测试。与记录和回放的早期工具功能相比,现代主流的工具框架捕获测试用例更容易访问、更准确、更稳定。AI 驱动的工具有助于对被测...
            0 0 813
            分享
          • Fintech概念正受到不少互联网金融公司的热捧,主要是指代那些可用于撕裂传统金融服务方式的高新技术。越来越多的企业开辟了新的部门去研究各种各样能让自己产品增值的科技类产品。尤其是在很多互联网金融公司,业务分析师BA(Business Analyst),又称产品经理受到大家的追捧,虽然身处西二旗等ITer聚集地,但是他们做的工作与金融街上的白领们并无不同,他们是无所不懂的金融达人,顶着各个海外名校金融数学系的Master光环,手持CFA,CPA,FRM,AFP/CFP,CIIA,ACCA等等。既然是在IT公司做需求分析的工作,除了需要出具需求说明书,然后将需求翻译成程序员能够理解的说明文档,不...
            0 1 2158
            分享
      • 51testing软件测试圈微信