写在前面

本文我们一起来学习如何使用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. django的分页器

    Django中分页器的使用 django分页器模块 #分页器 from django.core.paginator import Paginator,EmptyPage,PageNotAnIntege ...

  2. location对象查询字符串参数

    虽然location.search可以返回从问号到URL末尾的所有内容,但却没有办法逐个访问其中的每个查询字符串参数.为此,可以创建下面这样一个函数,用以解析查询字符串,然后返回包含所有参数的一个对象 ...

  3. 全局修改composer源地址

    查看 composer 主目录:通过 composer config -l -g 命令可以列出 composer 的全局配置信息,在这些信息中查找 [home] 配置项就是 composer 的主目录 ...

  4. swoole udp

    server.php <?php $server = new swoole_server('127.0.0.1', 9502, SWOOLE_PROCESS, SWOOLE_SOCK_UDP); ...

  5. Codeforces Round #440 (Div. 2, based on Technocup 2018 Elimination Round 2) C. Maximum splitting

    地址: 题目: C. Maximum splitting time limit per test 2 seconds memory limit per test 256 megabytes input ...

  6. Object-C-NSArray

    NSArray *fruitArray=[[NSArray alloc] initWithObjects:@"apple",@"banana",@"p ...

  7. swift 错误集锦

    1.注册 NIB 出现错误 // error:'registerNib(_:forCellReuseIdentifier:)' has been renamed to 'register' (_:fo ...

  8. Solr安装中文分词器IK

    安装环境 jdk1.7 solr-4.10.3.tgz KAnalyzer2012FF_u1.jar tomcat7 VM虚拟机redhat6.5-x64:192.168.1.201 Xshell4 ...

  9. Linux基础命令---gunzip

    gunzip 解压缩被gzip压缩过的文件.此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedora. 1.语法      gunzip [-ac ...

  10. json-lib-2.4-jdk15.jar所需全部JAR包.rar java jsoup解析开彩网api接口json数据实例

    json-lib-2.4-jdk15.jar所需全部JAR包.rar  java jsoup解析开彩网api接口json数据实例 json-lib-2.4-jdk15.jar所需全部JAR包.rar  ...