【Robot Framework 项目实战 01】使用 RequestsLibrary 进行接口测试
写在前面
本文我们一起来学习如何使用Robot Framework 的RequestsLibrary库,涉及POST、GET接口测试,RF用例分层封装设计等内容。
接口
接口测试是我们最常见的测试类型之一,主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。--摘自百度百科
RequestsLibrary
RequestsLibrary是基于reuqests库定义的一个Robot Framework 库。requests就不用介绍了吧,GitHub上面超过36k star的超级Python项目。
安装
pip install requests
pip install robotframework-requests
简单使用
*** Settings ***
Documentation http请求Demo
Library Collections
Library RequestsLibrary
*** Variables ***
${host} http://httpbin.org
*** Test Cases ***
Post 请求Demo
[Tags] Post main
${data} Create Dictionary name=Detector age=18
create session httpbin ${host}
${response} post request httpbin /post params=${data}
should be equal as integers ${response.status_code} 200
${resp} to json ${response.content}
should not be empty ${resp["args"]}
dictionary should contain key ${resp["headers"]} Host
dictionary should contain value ${resp["headers"]} httpbin.org
Get 请求Demo
[Tags] Get
${data} Create Dictionary name=Detector age=18
create session httpbin ${host}
${response} get request httpbin /get params=${data}
should be equal as integers ${response.status_code} 200
${resp} to json ${response.content}
should not be empty ${resp["args"]}
dictionary should contain key ${resp["headers"]} Host
dictionary should contain value ${resp["headers"]} httpbin.org
上面这是一个简单的Demo,我们在*** Settings ***中引入了标准库Collections和刚安装的RequestsLibrary,在*** Variables ***中定义了全局变量${host}。
然后开始写测试用例了,以Post 请求Demo为例,我们一起来看看用例里面包含了些什么:
第一行:我们给当前用例指定了Tag,一个用例是可以指定多个Tag的,非常灵活,用法我们在前一篇中有介绍
第二行:我们创建了一个一个字典并赋值给了变量${data},作为后续的数据传入
第三行:我们创建了一个HTTP会话,并给它取了一个别名httpbin
第四行:我们根据根据前一行创建的会话别名查找会话,并在会话中发送POST请求
第五行:我们对接口的接口的结果码进行了断言,因为RF所有的数据都是以字符串方式存储的,所以使用将should be equal as integers把他们作为int进行比较
第六行:我们将接口响应的内容使用RequestsLibrary库的关键字to json转化为了JSON
第七行:我们对转化后的JSON的的args数据进行了不能为空的断言
第八行:我们使用Collections的dictionary should contain key关键字对返回数据headers中是否含有Host进行了断言
第九行:我们对返回数据的headers中Host字段的值进行了断言
注: 在RF中,单条用例某个步骤执行失败,后续步骤在没有做特殊配置的情况下 都会略过不执行。
分层封装(数据驱动测试)
上面的示例中写了两个测试用例,除了因为要体现GET、POST外还有另外一个作用,那就是引出分层封装。细心的伙伴可能已经注意到了:我们两个用例有很多一样的操作。
根据一个功能如果需要重复使用两次以上就应该抽象成一个独立的函数的原则,特别当我们有多个用例都是使用同样的操作,只是每次输入的参数不一样的时候,我们应该把公共操作独立出来。
这个封装的操作在RF中有两种实现方式:
- 在Robot用例文件中直接封装
- 自定义函数,实现相关功能的关键字进行调用
我们今天介绍第一种,第二种方式我们会在介绍如何自定义关键字的时候介绍。
简单封装
我们先来看看简单的封装的例子,仅对请求的和数据转化的细节进行封装,这种方式在扩展的时候非常灵活:
*** Test Cases ***
Package Post
[Tags] packaged req
${data} Create Dictionary name=Detector age=18
${resp} POST Req ${data}
should not be empty ${resp["args"]}
dictionary should contain key ${resp["headers"]} Host
dictionary should contain value ${resp["headers"]} httpbin.org
*** Keywords ***
POST Req
[Arguments] ${data}
Create Session api ${host}
${response} Post Request api /post params=${data}
should be equal as integers ${response.status_code} 200
${resp} to json ${response.content}
[Return] ${resp}
可以看到,我们通过*** Keywords ***定义了关键字POST Req,定义过程中分别使用[Arguments]、[Return]来接收和返回的数据。
POST Req中整合了创建HTTP会话,转化接口返回结果等步骤,,调用和其他的RF库自带关键字没有什么区别。
高度封装
我们再来看看高度封装,这种方式会将所有的细节全部封装,优点是用例简洁,只保留传入参数和预期结果,缺点是灵活性低,不易扩展:
*** Test Cases ***
packaged test
[Template] Packaged POST Req
name host Content-Length=0
name host name Content-Length=0
*** Keywords ***
Packaged POST Req
[Arguments] ${data} ${Hosts} @{args} &{HostValue}
Create Session api ${host}
${response} Post Request api /post params=${data}
should be equal as integers ${response.status_code} 200
${resp} to json ${response.content}
# log ${resp}
dictionary_should_contain_sub_dictionary ${resp["headers"]} ${HostValue}
run keyword if ${args} log ${args}
... ELSE should not be empty ${resp["args"]}
*** Keywords ***解析:
第一行: 我们定义了Packaged POST Req能接受的参数,可选参数:@{args}、&{HostValue}与Python中*args、**args对应;
第六行: 我们使用了新的关键字dictionary_should_contain_sub_dictionary来断言字典包含场景;
第七行: 我们使用了新的关键字run keyword if来判断${args}是否为空,然后根据这个条件作出不同的操作。
运行上面的用例查看测试报告,可以看到packaged test这一个用例其实在内部运行了两次。分别覆盖了@{args} 是否为空的情况。

在实际编写用例的过程中,建议两种方式组合使用,响应参数简单的使用第二种方式,响应参数复杂度较高的使用第一种,方便灵活扩展。
总结
- RequestsLibrary 库的安装使用
- 数据驱动测试(分层用例封装)
【Robot Framework 项目实战 01】使用 RequestsLibrary 进行接口测试的更多相关文章
- 【Robot Framework 项目实战 00】环境搭建
前言 我们公司在推广RF这个框架做后端接口测试,力求让同事们能更快的完成服务端需求的自动化,作为主导者之一,决定分享一些经验,方便后来者. 我会从安装部署.Request.selenium.自定义框架 ...
- 【Robot Framework 项目实战 02】SeleniumLibrary Web UI 自动化
前言 SeleniumLibrary 是针对 Robot Framework 开发的 Selenium 库.它也 Robot Framework 下面最流程的库之一.主要用于编写 Web UI 自动化 ...
- 【Robot Framework 项目实战 02】使用脚本生成统一格式的RF关键字
背景 在微服务化的调用环境下,测试数据及接口依赖的维护是一个问题,因为依赖的接口和数据可能不在同一个服务下,而这相关的多个服务往往是不同人员来测试的. 因此为了节省沟通成本,避免关键字的重复冗余.所以 ...
- 【Robot Framework 项目实战 03】使用脚本自动生成统一格式的RF自动化用例
背景 虽然大家都已经使用了统一的关键字,但是在检查了一些测试用例之后,还是发现因为大家对RF的熟悉程度不一导致的测试用例颗粒度差异很大的情况:而且在手动方式转化测试用例过程中,有不少工作是完全重复的且 ...
- 【Robot Framework 项目实战 04】基于录制,生成RF关键字及 自动化用例
背景 因为服务的迁移,Jira版本的更新,很多接口文档的维护变少,导致想要编写部分服务的自动化测试变得尤为麻烦,很多服务,尤其是客户端接口需要通过抓包的方式查询参数来编写自动化用例,但是过程中手工重复 ...
- Robot Framework 项目搭建
首先新建一个项目“RobotDemo".项目Type一般选择“Directory”形式. 项目第一层可以放3种文件:Test Suite.Directory 和 Resource File. ...
- 【SSH网上商城项目实战01】整合Struts2、Hibernate4.3和Spring4.2
转自:https://blog.csdn.net/eson_15/article/details/51277324 今天开始做一个网上商城的项目,首先从搭建环境开始,一步步整合S2SH.这篇博文主要总 ...
- 自动化测试框架Cucumber和Robot Framework的实战对比
自动化测试框架Cucumber和RobotFramework的实战对比 一.摘要 自动化测试可以快速自动完成大量测试用例,节约巨大的人工测试成本:同时它需要拥有专业开发技能的人才能完成开发,且需要大量 ...
- JAVAEE——SSH项目实战01:SVN介绍、安装和使用方法
1 学习目标 1.掌握svn服务端.svn客户端.svn eclipse插件安装方法 2.掌握svn的基本使用方法 2 svn介绍 2.1 项目管理中的版本控制问题 通常软件开发由多人协作开发,如果对 ...
随机推荐
- Javascript-蔬菜运算价格
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- csv到mysql数据库如何分割
这两天修改一个取XML文件存入到CSV,然后再存入到mysql的bug,bug是XML文件里面有个name字段,存入CSV文件里面的时候我们用“|”,来分割字段.但是name里面有时候也有 ...
- php CI 实战教程第一季百度经验杂志
phpCI实战教程第一季_百度经验杂志_百度经验http://jingyan.baidu.com/magazine/16428 杂志为本人php CI实战教程系列经验 从实际项目使用中写系列实战经验, ...
- java多线程----ReentrantReadWriteLock
package com.test; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks ...
- 容器技术与DevOps
容器技术的使用支撑了目前 DevOps 三大主要实践:工作流.及时反馈.持续学习. 有人说容器技术与 DevOps 二者在发展的过程中是互相促进的关系.得益于 DevOps 设计理念的流行,容器生态系 ...
- bzoj1704 / P2882 [USACO07MAR]面对正确的方式Face The Right Way
P2882 [USACO07MAR]面对正确的方式Face The Right Way $n<=5000$?枚举翻转长度,顺序模拟就ok了 对于每次翻转,我们可以利用差分的思想,再搞搞前缀和. ...
- 20145301 赵嘉鑫 《网络对抗》Exp5 MSF基础应用
20145301 赵嘉鑫 <网络对抗>Exp5 MSF基础应用 一 实验链接 渗透实验一:MS08_067渗透实验 渗透实验二:MS14_064渗透实验 (首用) 渗透实验三:Adobe ...
- 微信小程序——1、文件的认识
主体文件的构成 微信小程序的主体由三个部分组成,需放在主目录中,名称也是固定的 app.js:微信小程序的主逻辑文件,主要用来注册小程序 app.json:微信小程序的主配置文件,对微信小程序进行全局 ...
- C++ shared_ptr的用法
一. http://www.cnblogs.com/welkinwalker/archive/2011/10/20/2218804.html 二.http://www.cnblogs.com/Tian ...
- Python3基础 函数 有参数有返回值 对传入的参数加1
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...