凡是涉及一点点有接口关联的,都可能下一个接口需要上一个接口的某个返回值作为入参,最直接的例子,就是登录依赖。用接口做业务性的测试,也绝对离不开接口依赖的,业务都是一系列接口串联的结果,有时候一个接口操作的结果,也需另外的接口验证,举几个例子,以某个文章的评论用例为例,我们选取几个评论的冒烟用例来看看吧。

  1. 拉取评论列表(list接口)
  2. 增加一条评论(add接口)
  3. 将评论置顶及取消置顶(stick接口)
  4. 删除评论(delete接口)

用例1很简单,仅是个数据读接口没有做写操作,做一些基本的响应校验就OK了,这个接口不在我们的讨论范围。
再看用例2,增加评论是有个写操作的,对于这一操作,如果用手工测试,完整校验点应该是,1)增加评论成功  2)增加的这条评论在评论列表里(且在第一位,考虑到有置顶情况,那就在第2位),所以,这里的最基本的校验点涉及两个接口,第1个接口(add接口)依赖第2个接口(list接口)做校验。事实上,这个评论id还需给其他接口使用,以达到数据清理及重复利用的效果,这个也不在本文的讨论范围。

当然,这些接口,还有个更全局的依赖,用户登录。用户登录的依赖在之前的文章已经有提到过,放在suite setup里是不错的选择:接口登录保持
既然是需要一个用例里面有多个接口,我们希望代码越少越好,最好是一行解决一个接口。这是反向思维,正向的思维是:接口类型固定时,总是有规律可循的,所以当很多很多代码开始重复时,我们要抽取成一个比较通用的关键字,以达到精简用例的效果,用例清晰明了,写起来也简单,扩展容易,维护工作量异常小。这有点像代码重构的思想。

接口测试用一句话概括就是,用什么样的测试数据,测哪个接口,得到的怎样的响应。重点明确了,用例中,接口的基本要素只有1、待测接口  2、待测接口的入参  3、响应数据。一个关键字如果满足了这些要素,也就能达到我们想要的效果。
来看一例:

在此用例中,mobile_post关键字将一些接口调用的细节全都掩盖掉了,其中包括但不限于:

  • 请求的host及一些固定的参数
  • 接口入参反向update到入参模板里
  • 接口数字签名
  • 目标返回值的分拆及获取

该关键字的必需参数只有1、待测接口名 和 2、待测接口入参,其他一些只做为可选参数,有更多的输入自由,也使得关键字的可重用性更高。然后,一个接口就一行脚本,断言在关键字外做,也是为了提高写用例的灵活性。实践证明,使用这个关键字后,写用例速度明显提高了。该关键字中用到的更底层关键字,也尽量用rf的关键字在写,rf的日志打印比较好,遇到问题方便日志追踪。
 
 
这里重点讲一下接口的入参模板:
1、为什么要有入参模板
百度结果中有好多告诉你怎么用rf做接口测试的文章,如何创建session,如何用create dictionary关键字构建测试数据,如何传header,如何做一个post接口,如何做一个get接口。——那只是个demo
我们做自动化时是在做工程,不是在做demo,也就是那些解释性的脚本,底层一步一步怎么实现的(header怎么传,data怎么拼接,该用post还是get),已经不再是重点,我们更应该关注的,是用例本身,怎么写用例能更好的覆盖到验证点,怎么处理测试数据,怎么写好可维护性的用例,怎么去组织好用例结构,套件结构,工程结构,怎么让用例有更好的环境(测试,预发,生产)移植性。
扯远了,回到入参模板。实际中,单单一个接口的入参就多得不敢想象,十几个,或更多,某个用例中这十几个入参实际起作用的也许就3-4个。有些接口其实也不止一层json那么简单,也有某个字段有多层结构的。这个时候,最好是有个模板,模板大概长这样:
           接口A:{key1:value1, key2:value2}   #接口A及其入参
           接口B:{key3:value3, key4:value4, key5:value5, key6:value6}
           接口C:{key7:value7, key8:{Key81:value81}, key9:[value91, value92, value93]}
           ...
 2、入参模板rf中怎么实现

参考了一些其他做接口测试的同仁,有用数据库实现的,也有用初始化配置文件的。rf在这方面考虑还是蛮齐全,我用的是py变量文件vars.py,当配置文件用,另外可能还需要有一个辅助的py关键字文件common.py。

1)大致长这样的vars.py

MOBILE_DEFAULT_VALUE={
#comment
"comment.add":{"v":"1.0","data":{"articleid":"1","content":u"大盘啥时候能好起来我就给好评","targetid":"","commentid":"",,"uid":"1"}}, #增加文章评论接口
"comment.list":{"v":"2.0","data":{"articleid":"","cursor":"-1","count":"20"}}, #获取文章评论列表
"comment.delete":{"v":"1.0","data":{"commentid":"","uid":""}}#删除评论
}

2)大致长这样的common.py

# -*- coding:utf-8 -*-
import vars

def mobile_paras(apiName,dataStr='{}'):
'''
参数:待测接口名apiName 待测接口入参 dataStr
示例: ${return} | mobile_paras | user/sms | {"phone":"66666666"}
返回:接口版本号 及最终入参
'''
try:
datadict = vars.MOBILE_DEFAULT_VALUE[apiName]['data']
apiVersion = vars.MOBILE_DEFAULT_VALUE[apiName]['v']
except KeyError:
print u"不存在的api名,请重新输入" if dataStr == '':
dataStr = '{}' dataNew = eval(dataStr)
datadictCopy = datadict.copy()
datadictCopy.update(dataNew)#这句是关键,把数据update到模板取到的data中去 return [apiVersion,datadictCopy]

分离变量文件和关键字文件是rf的规定,也是个好的编码习惯,以后vars.py中还要扩展其他更多更多的变量,当然common.py中也不可避免增加一些rf不擅长但python擅长处理的关键字。

3)大致长这样的mobile_post关键字:
最后,用一个rf的关键字,把一些关键数据组一组,该签名的签名,该登录的登录,该返回的返回:

再回到第1张图,待测接口comment.add,目标待传参数in_data为{"articleid":"3215","content":"大盘啥时候能好起来我就给好评","targetid":"","commentid":"","uid":"101123"},用例传参{"articleid":"3215","uid":"101123"},其他参数在模板中已默认,实际传参如目标待传。
 
4)结构:
 vars.py及common.py放同一级目录,以如下方式导入含有mobile_post的resource文件中

以上,仅提供思路。有些同学的接口入参及调用都很简单,3行内可以搞定一个接口,也可不必做得这么麻烦。在工程化的道路上,只有实践出来的路才是最好的路。

使用robotframework做接口测试5——一个用例中调多个接口的更多相关文章

  1. 使用robotframework做接口测试之一——准备工作

    最近发现做接口测试的朋友越来越多了,打算写一个系列的rf+requests做接口测试(主要是Http接口)的文档,可以帮助新入门的同学对接口测试有个大概的了解,同时也是敦促自己做总结的一种手段.希望经 ...

  2. 使用robotframework做接口测试4——搞定接口签名及密码加密

    接口签名是我做接口测试撞到的第一块石头,刚到新公司,本来想默默憋出来一个大招,然后碰到了签名接口,直接给跪了.于是只好找开发哥哥帮忙,把签名算法的java文件拿到,一行行对着用python实现了一遍. ...

  3. 使用robotframework做接口测试二——处理响应数据

    初使用RequestsLibrary做接口测试时,你会不会感到困惑,为什么会有${resp.content}, ${resp.status_code}这样的写法,这个status_code什么鬼,f5 ...

  4. 使用robotframework做接口测试三——保持登录状态

    调用登录接口登录了,其他的接口怎么保持登录状态呢?  首先来看一看,web端或者说客户端是怎么样用cookie/token等保持登录状态的.一般来说,cookie都会在登录接口由服务端返回,而且会是在 ...

  5. postman+jenkins+newman做接口测试的持续集成

    为何要做接口自动化测试的持续集成? 1. 接口相对稳定,改动少,比起GUI自动化测试来说性价比更加高些,不容易出现GUI自动化那种掉到维护脚本的坑里. 2. 接口测试比较简单,一个规范的接口,测试只需 ...

  6. 使用EOLINKER做接口测试最佳路径(上)

    本文内容: 测试脚本管理:讲述如何在 EOLINKER 上设计测试项目目录结构. 编写测试脚本:讲述如何在 EOLINKER 上编写接口测试脚本. 测试脚本执行及报告:讲述如何在 EOLINKER 上 ...

  7. RobotFrameWork编写接口测试及如何断言

    1. 前言 本篇是第一系列(Http接口自动化)的第五课程,如果对系列课程大纲不清楚的,可以查看<RobotFramework系列免费课程-开课了~>. 前面我们介绍了,在真正实施前,需先 ...

  8. 使用Robot Framework做接口测试

    http://chuansong.me/n/1858477 1.RF框架 1.1 RF框架介绍Robot Framework 框架是一个通用的测试框架,一直是由诺西网络(Nokia Siemens N ...

  9. 用postman做接口测试实例

    使用postman做接口测试,可以选择请求方式,可以直接输入参数和header,可以编写测试结果的代码,判断是否通过测试 下图为填写接口测试地址.填写接口的参数,点击send发送请求 其中,Param ...

随机推荐

  1. indexedDB 前端数据库(使用的简单案例)

    前端存储 之 indexDB 1.indexedDB是什么? indexedDB是一个非关系型数据库 它不需要我们去写一些特定的SQL语句来对数据库进行操作 它是NoSQL的,数据形式使用的json ...

  2. python中的pyc和pyo文件和__pyc__文件夹

    一.命令生成 pyc 文件 *.py:源码文件,由 Python 程序解释. *.pyc:源码经编译后生成的二进制字节码(Bytecode)文件. *.pyo:优化编译后的程序,也是二进制字节码文件. ...

  3. windows 切换git远程仓库地址后 git push 提示Authentication failed

    git切换远程分支: 方法一: git remote set-url origin 你新的远程仓库地址 方法二: git remote rm origin git remote add origin ...

  4. 使用PHP读取PHP文件并输出到屏幕上

    看完这篇文章,你一定忘不掉htmlentities的用法 背景 今天有个需求,就是一个PHP开发的网址中,有一个页面可以提供给用户修改已经存在的PHP文件中的代码,并POST到服务器上保存. 每次将读 ...

  5. 【SaltStack官方版】—— returners——返回器

    ETURNERS 返回器 By default the return values of the commands sent to the Salt minions are returned to t ...

  6. (五)CWnd 所有窗口类的父类,CFrameWnd,Afx_xxx 全局函数,命名规范

    CWnd::MessageBox: 只有CWnd的派生类才可以使用MessageBox 所以应用程序类中使用:AfxMessageBox // 初始化 OLE 库 if (!AfxOleInit()) ...

  7. 第72节:Java中的数组

    https://www.jianshu.com/p/9ad176caa5bc

  8. HA 模式 Hadoop+ZooKeeper+Hbase启动顺序

    一. 背景(原http://blog.csdn.net/u011414200/article/details/50437356 ,对其进行了一定更改) 1.1 网络上的大部分教程 都是机器间含有SSH ...

  9. KDC添加加密

    零售KDC管理的域为TESTA.COM 华为集群管理的域为hadoop.com (目前测试了hdfs cli,下午在UAT集群测试下distcp) 一.            零售KDC升级支持AES ...

  10. Docker+Rancher构建部署流水线

    工作多年,在项目部署方面, 1:以前用ftp或者rz上传更新的,每次更新算上打包.目录切换.更新遗漏.备份.出错还原.启动等工作都得搞上一来小时甚至更长,要是多两台服务器那心都凉了: 2:后来有用sv ...