写在前面

本文我们一起来学习如何使用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数据进行了不能为空的断言

第八行:我们使用Collectionsdictionary should contain key关键字对返回数据headers中是否含有Host进行了断言

第九行:我们对返回数据的headersHost字段的值进行了断言

注: 在RF中,单条用例某个步骤执行失败,后续步骤在没有做特殊配置的情况下 都会略过不执行。

分层封装(数据驱动测试)

上面的示例中写了两个测试用例,除了因为要体现GETPOST外还有另外一个作用,那就是引出分层封装。细心的伙伴可能已经注意到了:我们两个用例有很多一样的操作

根据一个功能如果需要重复使用两次以上就应该抽象成一个独立的函数的原则,特别当我们有多个用例都是使用同样的操作,只是每次输入的参数不一样的时候,我们应该把公共操作独立出来。

这个封装的操作在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 进行接口测试的更多相关文章

  1. 【Robot Framework 项目实战 00】环境搭建

    前言 我们公司在推广RF这个框架做后端接口测试,力求让同事们能更快的完成服务端需求的自动化,作为主导者之一,决定分享一些经验,方便后来者. 我会从安装部署.Request.selenium.自定义框架 ...

  2. 【Robot Framework 项目实战 02】SeleniumLibrary Web UI 自动化

    前言 SeleniumLibrary 是针对 Robot Framework 开发的 Selenium 库.它也 Robot Framework 下面最流程的库之一.主要用于编写 Web UI 自动化 ...

  3. 【Robot Framework 项目实战 02】使用脚本生成统一格式的RF关键字

    背景 在微服务化的调用环境下,测试数据及接口依赖的维护是一个问题,因为依赖的接口和数据可能不在同一个服务下,而这相关的多个服务往往是不同人员来测试的. 因此为了节省沟通成本,避免关键字的重复冗余.所以 ...

  4. 【Robot Framework 项目实战 03】使用脚本自动生成统一格式的RF自动化用例

    背景 虽然大家都已经使用了统一的关键字,但是在检查了一些测试用例之后,还是发现因为大家对RF的熟悉程度不一导致的测试用例颗粒度差异很大的情况:而且在手动方式转化测试用例过程中,有不少工作是完全重复的且 ...

  5. 【Robot Framework 项目实战 04】基于录制,生成RF关键字及 自动化用例

    背景 因为服务的迁移,Jira版本的更新,很多接口文档的维护变少,导致想要编写部分服务的自动化测试变得尤为麻烦,很多服务,尤其是客户端接口需要通过抓包的方式查询参数来编写自动化用例,但是过程中手工重复 ...

  6. Robot Framework 项目搭建

    首先新建一个项目“RobotDemo".项目Type一般选择“Directory”形式. 项目第一层可以放3种文件:Test Suite.Directory 和 Resource File. ...

  7. 【SSH网上商城项目实战01】整合Struts2、Hibernate4.3和Spring4.2

    转自:https://blog.csdn.net/eson_15/article/details/51277324 今天开始做一个网上商城的项目,首先从搭建环境开始,一步步整合S2SH.这篇博文主要总 ...

  8. 自动化测试框架Cucumber和Robot Framework的实战对比

    自动化测试框架Cucumber和RobotFramework的实战对比 一.摘要 自动化测试可以快速自动完成大量测试用例,节约巨大的人工测试成本:同时它需要拥有专业开发技能的人才能完成开发,且需要大量 ...

  9. JAVAEE——SSH项目实战01:SVN介绍、安装和使用方法

    1 学习目标 1.掌握svn服务端.svn客户端.svn eclipse插件安装方法 2.掌握svn的基本使用方法 2 svn介绍 2.1 项目管理中的版本控制问题 通常软件开发由多人协作开发,如果对 ...

随机推荐

  1. Fuzzy and fun on Air Jordan 12 Doernbecher design

    Carissa Navarro keeps it warm, fuzzy and fun on her 2017 Air Jordan 12 Doernbecher design. Nike's 20 ...

  2. 【设置】Nginx配置文件具体配置解释

    #定义Nginx运行的用户和用户组 user www www; #nginx进程数,建议设置为等于CPU总核心数. worker_processes 8; #全局错误日志定义类型,[ debug | ...

  3. UVM中Callback机制

    Callback机制,其实是使用OOP来实现的一种程序开发者向程序使用者提供的模块内部的接口.可以在Test_case的高度改变其他component的一些行为. Systemverilog中已经提供 ...

  4. Java SE 基础知识(二)

    1. 类由两大部分构成:属性和方法.属性一般用名词来表示,方法一般用动词来表示. 2. 如果一个java源文件中定义了多个类,那么这些类中最多只能有一个类是public的,可以都不是public的. ...

  5. Linux基础命令---cal

    cal cal指令可以显示一个日历信息,如果没有指定选项和参数,那么就会显示当前的月份. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedora ...

  6. Linux基础命令---diff

    diff 逐行比较两个文本文件,把文件的差异显示到标准输出.如果要指定要比较目录,那么diff命令会比较目录中相同文件名的文件,不会比较子目录. 此命令的适用范围:RedHat.RHEL.Ubuntu ...

  7. live555 编译

    项目里面需要简单的rtsp服务器来实现视频预览等功能: rtsp本来不是太复杂的东西,github上有很多功能都比较完善的项目可以随便拿来用,但是测试过程中发现live555还是有性能上的一些差异: ...

  8. 负载均衡之-haproxy

    老规矩,先介绍?复制一段? 1)HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案. 2)HAProxy特别适用于那些负载特大的 ...

  9. Java并发之FairSync和NonfairSync

    Java并发中的fairSync和NonfairSync主要区别为: 如果当前线程不是锁的占有者,则NonfairSync并不判断是否有等待队列,直接使用compareAndSwap去进行锁的占用; ...

  10. 06: AJAX全套 & jsonp跨域AJAX

    目录: 1.1 AJAX介绍 1.2 jQuery AJAX(第一种) 1.3 原生ajax(第二种) 1.4 iframe“伪”AJAX(第三种) 1.5 jsonp跨域请求 1.6 在tornad ...