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

顾翔老师开发的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

本文分享自微信公众号 - 软件测试培训(iTestTrain)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏以Java架构赢天下

天猫Java研发三面:讲讲Redis实现购物车的设计思路!

购物车是任何一个电商项目都会用到的功能,面试的时候也经常问到,今天我们就来谈谈Redis下购物车的实现。

9860
来自专栏AiSmart4J

如何保证消息不被重复消费?或者说,如何保证消息消费的幂等性?

首先,比如 RabbitMQ、RocketMQ、Kafka,都有可能会出现消息重复消费的问题,正常。因为这问题通常不是 MQ 自己保证的,是由我们开发来保证的。...

10120
来自专栏AiSmart4J

如何保证消息的顺序性?

我举个例子,我们以前做过一个 mysql binlog 同步的系统,压力还是非常大的,日同步数据要达到上亿,就是说数据从一个 mysql 库原封不动地同步到另一...

9030
来自专栏AiSmart4J

项目中缓存是如何使用的?为什么要用缓存?

假设这么个场景,你有个操作,一个请求过来,吭哧吭哧你各种乱七八糟操作 mysql,半天查出来一个结果,耗时 600ms。但是这个结果可能接下来几个小时都不会变了...

11240
来自专栏AiSmart4J

为什么使用消息队列?

其实就是问问你消息队列都有哪些使用场景,然后你项目里具体是什么场景,说说你在这个场景里用消息队列是什么?

8620
来自专栏AiSmart4J

如何设计可以动态扩容缩容的分库分表方案?

这个方案就跟停机迁移一样,步骤几乎一致,唯一的一点就是那个导数的工具,是把现有库表的数据抽出来慢慢倒入到新的库和表里去。但是最好别这么玩儿,有点不太靠谱,因为既...

9620
来自专栏大数据文摘

收集了740万生物特征信息,五角大楼正在打造一张全球生物识别监控网

在过去的15年里,美军一直在壮大自己的力量,其中有一种特殊的武器被部署到世界各地,你几乎意识不到它的存在,但是它却十分厉害。

9250
来自专栏腾讯安全

腾讯安全:弱口令密码再遭爆破 新型木马瞄准企业SQL数据库下手

部分网友在设置密码时会有这样的习惯,在多个平台使用同样的密码,或仅使用数字字母单一字符,用个人姓名生日进行组合等。尽管这样的弱口令密码设置方式便于联想记忆,但也...

9710
来自专栏AiSmart4J

分布式事务了解吗?你们是如何解决分布式事务问题的?

所谓的 XA 方案,即:两阶段提交,有一个事务管理器的概念,负责协调多个数据库(资源管理器)的事务,事务管理器先问问各个数据库你准备好了吗?如果每个数据库都回复...

7320
来自专栏AiSmart4J

分库分表之后,id 主键如何处理?

这个就是说你的系统里每次得到一个 id,都是往一个库的一个表里插入一条没什么业务含义的数据,然后获取一个数据库自增的一个 id。拿到这个 id 之后再往对应的分...

7230

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励