如果你手工测试Restful 服务将会是一件非常单调乏味的事情。当然,目前有一些浏览器插件可以通过可视化的界面帮助你手工测试,例如postman、rest console,但是每次系统版本更新,你都需要去手动执行大量的测试,显然这种方式不是非常实用。Ruby拥有许多出色的gem包,你可以使用它们完成这项枯燥的工作。其中RestClient是我比较喜欢的一个。结合ruby的rspec框架使用RestClient可以编写非常强大的测试脚本。假如Github想让你测试他们的Restful API。你可能想做的第一件事就是确保端点返回你预计的响应代码。开始前,你需要确认你已经安装了相应的gems。 最便利的方式是使用bundler安装:

 source "https://rubygems.org"

 gem 'rest-client'
gem 'rspec'
gem 'json_expressions'

在cmd(windows,linux/mac环境请自行解决)进入你创建gemfile文件的同层目录,运行 'bundle'命令

 rafs-computer:rafael$ bundle
Using diff-lcs 1.2.5
Using json_expressions 0.8.3
Using mime-types 2.3
Using netrc 0.7.7
Using rest-client 1.7.2
Using rspec-support 3.1.1
Using rspec-core 3.1.4
Using rspec-expectations 3.1.2
Using rspec-mocks 3.1.2
Using rspec 3.1.0
Using bundler 1.7.3
Your bundle is complete!

现在让我们来验证我们从用户终端得到200响应:

 require 'rspec'
require 'rest_client' describe 'GitHub API' do it 'should return information about a user' do
result = RestClient.get 'https://api.github.com/users/rest-client', :content_type => :json, :accept => :json
expect(result.code).to eq(200)
end end

在命令行执行rspec -f doc filename

aaarticlea/png;base64,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" alt="" />

因此返回码是对的,但是我们如何知道返回的json也是对的呢?

有几种不同的方式去验证。一种方法是解析body中的json(由key,value组成),然后针对你要检查的每个key创建断言。这种方式可以使用,但是它需要你写多个断言而且是比较难于维护的。另外一种方法是和一个已知有效的json格式的数据文件比较。你可以使用json_expressions gem包去做这个事情。下面的例子是相同的spec文件。新增一个testcase用来验证json数据。

首先准备一个users.json文件

 {
"login": "rest-client",
"id": 2386701,
"avatar_url": "https://avatars.githubusercontent.com/u/2386701?v=3",
"gravatar_id": "",
"url": "https://api.github.com/users/rest-client",
"html_url": "https://github.com/rest-client",
"followers_url": "https://api.github.com/users/rest-client/followers",
"following_url": "https://api.github.com/users/rest-client/following{/other_user}",
"gists_url": "https://api.github.com/users/rest-client/gists{/gist_id}",
"starred_url": "https://api.github.com/users/rest-client/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/rest-client/subscriptions",
"organizations_url": "https://api.github.com/users/rest-client/orgs",
"repos_url": "https://api.github.com/users/rest-client/repos",
"events_url": "https://api.github.com/users/rest-client/events{/privacy}",
"received_events_url": "https://api.github.com/users/rest-client/received_events",
"type": "Organization",
"site_admin": false,
"name": "REST-Client Team",
"company": null,
"blog": "",
"location": null,
"email": null,
"hireable": false,
"bio": null,
"public_repos": 1,
"public_gists": 0,
"followers": 0,
"following": 0,
"created_at": "2012-09-20T15:01:43Z",
"updated_at": "2015-03-11T19:08:01Z"
}

然后编写测试用例spec文件

 require 'rspec'
require 'rest_client'
require 'json_expressions/rspec' describe 'GitHub API' do it 'should return 200 when asking information about a user' do
result = RestClient.get 'https://api.github.com/users/rest-client', :content_type => :json, :accept => :json
expect(result.code).to eq(200)
end it 'should return proper data for a user' do
expected_data = JSON.parse(IO.read('users.json'))
result = RestClient.get 'https://api.github.com/users/rest-client', :content_type => :json, :accept => :json
expect(result).to match_json_expression(expected_data)
end end

这个users.json文件包含了一个已知的响应。正如你可能猜到了,一些这样的服务返回值可以改变很快。例如,"updated_at"是返回值可能经常变化的key。假如你只是想要验证key是否存在,而不关心它的值,你可以增加如下的代码到你的测试用例中。

   it 'should return proper data for a user' do
expected_data = JSON.parse(IO.read('users.json')) #解析users.json文件中的数据作为预期值
result = RestClient.get 'https://api.github.com/users/rest-client', :content_type => :json, :accept => :json
# expect(result).to match_json_expression(expected_data)
expected_data['updated_at'] = wildcard_matcher
end

想要了解更多关于json_expression gem的技巧,猛击github wiki page。

rspec+rest-client测试第三方web service的更多相关文章

  1. 网络上可供测试的Web Service

    网络上可供测试的Web Service 腾讯QQ在线状态 WEB 服务Endpoint: http://www.webxml.com.cn/webservices/qqOnlineWebService ...

  2. IGS_学习笔记07_IREP通过页面测试客户化Web Service调用(案例)

    20150819 Created By BaoXinjian

  3. (转)接口自动化测试 – Java+TestNG 测试 Restful Web Service

    本文主要介绍如何用Java针对Restful web service 做接口自动化测试(数据驱动),相比UI自动化,接口自动化稳定性可靠性高,实施难易程度低,做自动化性价比高.所用到的工具或类库有 T ...

  4. IGS_学习笔记08_IREP通过soapUI测试客户化Web Service调用(案例)

    20150819 Created By BaoXinjian

  5. Apache CXF实现Web Service(5)—— GZIP使用

    Apache CXF实现Web Service(5)-- GZIP使用 参考来源: CXF WebService整合Spring Apache CXF实现Web Service(1)--不借助重量级W ...

  6. 就是这么简单!使用Rest-assured 测试Restful Web Services

    使用 Rest-assured 测试 Restful Web Services 转载注明出处: http://www.cnblogs.com/wade-xu/p/4298819.html 这里向大家介 ...

  7. [转]Web Service Authentication

    本文转自:http://www.codeproject.com/Articles/9348/Web-Service-Authentication Download source files - 45. ...

  8. 使用Eclipse自带Web Service插件(Axis1.4)生成Web Service服务端/客户端

    创建一个名字为math的Java web工程,并将WSDL文件拷入该工程中 将Axis所需的jar包拷贝至WebRoot\WEB-INF\lib目录下,这些jar包会自动导入math工程中 一,生成W ...

  9. Web Service性能测试方案

    目录: 1.web Service简介 2.SoapUI介绍 3.使用SoapUI进行web service性能测试 4.使用LR进行web service性能测试 5.使用JMeter进行web s ...

随机推荐

  1. SHINY-SERVER R(sparkR)语言web解决方案 架设shiny服务器

    1. shiny server简介 shiny-server是一种可用把R 语言以web形式展示的服务,其实RStudio公司自己构建了R Shiny Application运行的平台(http:// ...

  2. Android Studio 生成Release版,报Warning的解决办法

    转载请注明出处:http://www.cnblogs.com/cnwutianhao/p/6242227.html 请尊重知识产权!!! 同步更新到CSDN:http://blog.csdn.net/ ...

  3. 安装Ubuntu14.04版本的操作系统

    1:安装好虚拟机之后便是安装操作系统,操作系统分为好多种,在这里笔者使用的是Ubuntu14.04版本的操作系统,除此之后还可以使用fedora或者小红帽等等操作系统 软件包http://pan.ba ...

  4. 深入学习系列--Data Structure--02字符串

    字符串可以说是我们实际工作中使用最多的数据类型了,常见的字符串操作包括链接.取子串.格式化等.这部分内容总体来说比较容易理解,最难的部分要数字符串的模式匹配方法了,尤其是KMP算法,需要通过实践加以记 ...

  5. SQL Server 内存中OLTP内部机制概述(四)

    ----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory ...

  6. React Native入门遇到的一些问题

    本文示例参考自<React Native第一课> React Native官方文档中文版(含最新Android内容) 这里只大概记录下我的操作步骤和遇到的问题,一定要牢记下面这条: 如果你 ...

  7. Android中的内部类引起的内存泄露

    引子 什么是内部类?什么是内存泄露?为什么Android的内部类容易引起内存泄露?如何解决? 什么是内部类? 什么是内部类?什么又是外部类.匿名类.局部类.顶层类.嵌套类?大家可以参考我这篇文章 ,再 ...

  8. Windows Server 2008 R2 备份和恢复 (转)

    Windows Server Backup : 1.安装Windows Server Backup的方法: 通过"服务器管理器"中的"添加功能"向导进行安装. ...

  9. c# 字体安装

    [DllImport("kernel32.dll", SetLastError = true)] static extern int WriteProfileString(stri ...

  10. RPC和NFS

    参考:http://eduunix.ccut.edu.cn/index2/html/linux/OReilly.SUSE.Linux.Jul.2006/059610183X/suselinux-CHP ...