【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 项目管理中的版本控制问题 通常软件开发由多人协作开发,如果对 ...
随机推荐
- node初识——node中的require方法与require.js的区别
出处:http://blog.csdn.net/u013613428/article/details/51966500 作为一个前端的新手,总是诧异于js的模块载入方式,看到了通过requireJs提 ...
- GridView 点滴
绑定数据时.在后台给GridView添加事件 protected void grd_RowDataBound(object sender, GridViewRowEventArgs e) { //当前 ...
- html04
web的三要素:HTML:搭建页面的基本结构css: 对页面进行修饰-让页面更美观JavaScript:让页面可以有交互行为(用户和界面)1.js是什么:JavaScript :页面的脚本语言,运行在 ...
- 微信小程序- wx.request请求不到数据
小程序官方文档手册 https://mp.weixin.qq.com/debug/wxadoc/dev/ 小程序开发问答社区 http://www.henkuai.com/forum.php wx.r ...
- OO第四次阶段性总结
测试与正确性论证的效果差异及优缺点 测试实际上就是对程序进行的一种黑箱测试,利用各种各样的测试样例去检验程序是否能够给出正确的结果.其中的单元测试则是将整体的测试拆分成单元来进行,但其仍然躲不开黑箱测 ...
- 019-centos的yum用法
1.检测系统是否已经安装过mysql或其依赖:# yum list installed | grep mysql(当然也可以用 rpm -qa | grep mysql) 2.卸载已经存在的mysql ...
- POJ 1182 并查集
Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到 ...
- Nuget的学习总结
Nuget的学习总结 今天研究了一下nuget,发现nuget实在是太有用了,便写下了这篇博客,希望记录一下自己的学习历程,也希望技术圈的朋友看到之后,如果里面哪里写的不够好,可以给我些宝贵的意见,以 ...
- Python 基本数据类型(2)
知识内容: 1.python对象模型 2.数字与bool 3.字符串 4.列表与元组 5.字典与集合 一.python对象模型 1.python对象模型 对象是python语言中最基本的概念,在pyt ...
- C++设计模式 之 “对象性能” 模式:Singleton、Flyweight
“对象性能”模式 面向对象很好地解决了“抽象”的问题,但是必不可免地要付出一定的代价.对于通常情况来讲,面向对象的成本大都可以忽略不计.但是某些情况,面向对象所带来的成本必须谨慎处理. 典型模式 # ...