前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >接口测试数据引发的接口测试代码改进(之一)

接口测试数据引发的接口测试代码改进(之一)

作者头像
顾翔
发布2019-12-12 12:10:38
5440
发布2019-12-12 12:10:38
举报
文章被收录于专栏:啄木鸟软件测试

顾翔老师开发的bugreport2script开源了,希望大家多提建议。文件在https://github.com/xianggu625/bug2testscript,

主文件是:zentao.py 。bugreport是禅道,script是python3+selenium 3,按照规则在禅道上书写的bugreport可由zentao.py程序生成py测试脚本。

第一阶段:原始阶段

接口测试在DevOps推广之中的地位得到了显著的提高,对于接口测试相对于GUI自动化测试、基于单元测试的自动化测试脱颖而出,以前测试金字塔模型(图一)逐渐被纺锤模型所取代。

图一 金字塔模型

图二 纺锤模型

当然JMeter、Postman也可以进行接口测试,但是它由于代码不可复用,越来越被类似于基于requests类Python代码取代了。基于requests类Python代码使接口测试变得非常的简单,我们只要组合get或者post参数,通过requests类的post或者get方法调用返回数据就可以实现,下面的代码展示了一个网站的登录功能的最原始接口测试代码。

在这里分别验证了错误用户名,正确密码、正确用户名,错误密码、错误用户名,错误密码、正确用户名,正确密码四种情况。

第二阶段:CSRF Token防护阶段

为了防止CSRF的攻击,现在几乎所有的网站在POST请求的时候都加上了csrftoken,系统通过post参数中的一个hidden元素获取一个随机的由100个字符组成的串,在发送的时候与某个cookie值进行比较,如果二者相同,则进入下面的操作,否则这给出403异常页面。为了对这类产品进行接口测试,可以阅读源代码获得hidden元素名,通过抓包获得cookie名,然后通过post的cookie选项将hidden元素名对应的值和cookie名对应的值保持一致,即可实现。

在这里,仅展示输入正确的用户名和正确的密码用例。通过语句payload={"username":self.correctusername,"password":self.correctpassword,"csrfmiddlewaretoken":self.token}设置hidden参数的值为self.token,通过data = requests.post(self.url,data=payload,cookies=self.cookie)(其中self.cookie在setUp中设置为self.cookie = {"csrftoken":self.token})也设置为self.token值。

第三阶段:利用Excel封装数据,基于数据驱动的自动化测试。

数据驱动是自动化测试的主流,在刚才的代码中测试数据是与测试代码在一起的,在这里我们通过excel表来维护数据,从而得到测试数据与测试代码的分离。建立一个excel表,内容如图三所示。

图三 用Excel管理的数据

在这里cindy/123456是数据库中存在的,而jerry/654321是数据库中不存在的。建立Util.py文件把对Excel表的操作封装在里面。代码如下。

测试代码变为。

调用get_user_data()方法以此得到测试数据,下面的测试实现同第二阶段。

第四阶段:通过测试数据优化测试代码。

(这部分是本文的关键),先来看一下图四。

图四 关于登录操作测试脚本的测试数据问题

  • 这里讲的是接口测试,其实在GUI测试下同样适用。来看一下用户登录操作测试脚本失败,可能由两个以下原因:
  • 产品代码有问题:直接报bug;

测试数据的问题:比如测试错误用户名,错误密码的时候,比如做ET的时候通过手工的方式已经有了这个用户名和错误密码的用户,再比如正确错误用户名,正确密码的时候,比如做ET的时候通过手工的方式已经将这条记录删除。

我们现在考虑测试数据的问题,首先会考虑是否可以讲注册与登录一起测试,即先测试注册接口,然后用注册的信息进行登录,注册完毕直接删除数据库。这又产生两个问题:

  • 测试脚本是否有权限操作数据库?(在目前企业在测试环境下是允许的。)
  • 在微服务情况下,注册与登录分别作为单独一个services下如何实现。

然后还可以考虑一种方法,在登录的时候进行检查,测试一个正常测试登录的测试数据,在登录之前先到数据库中检查,如果这个用户数据不存在,通过测试脚本把这条数据写入数据库中(写入之后给出日志信息,便于后续数据维护),然后在进行测试验证;测试一个异常登录的测试数据,在登录之前也先到数据库中检查,如果这个用户数据存在,则将数据库中数据删除(同样删除之后也要给出日志信息)(后续介绍的方法就是这种方法的实现)。也有一些大型企业通过数据管理服务来实现,如果获取的数据不符合测试业务,认为这是一条脏数据,从测试数据文件中删除然后取下一条。当然这种情况不会用Excel,XML文件来维护数据,而是通过测试数据数据库来为维护。另外会启动一个Jenkins Job。定时从测试数据库中获取数据个数,当数量小于某个阈值的时候自动生成批量的测试数据。现在来看下如何实现前一种方法。

在Util类中建立check_user_existence(self,username,password,tag)方法,用来检查当前产品数据库中是否存在这个用户,然后通过tag(tag=0表示测试一个异常登录,tag=1表示测试一个正常测试登录)做相应的措施。

为了便于后续的维护,封装了数据库操作和md5加密。

测试代码最后为。

星云测试

http://www.teststars.cc

奇林软件

http://www.kylinpet.com

联合通测

http://www.quicktesting.net

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档