如果你手工测试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. ServiceStack Web Service 创建与调用简单示列

    目录 ServiceStack 概念 ServiceStack Web Service 创建与调用简单示列 上篇文章介绍了ServiceStack是什么,本章进入主题,如何快速简单的搭建Service ...

  2. 更新日志 - fir.im 回归,上线 Android Studio 插件

    上周 fir.im 经历了一场前所未有的挑战,因为自查应用网站暂停,在事情发生4天内我们完成了自查,fir.im 正式回归.煎熬的 98 个小时,感谢开发者与用户对我们的信任和支持. 使用注意: 禁止 ...

  3. iOS开发之静态库(四)—— 静态框架framework制作

    前面介绍过,虽然苹果公司禁止在iOS开发中使用动态库,而且也从XCode中移除了创建静态框架的功能,但我们还是可以通过对XCode进行小小的改动来创建静态框架. 编译环境:Macbook Air + ...

  4. Liferay7 BPM门户开发之28: Portlet文件上传,及实体类同步更新上传

    抓住核心 . Liferay文件上传的核心就是使用UploadPortletRequest类 继承关系java.lang.Object extended byjavax.servlet.Servlet ...

  5. QueryTask查询结果最多500条的问题

    参考: http://dingtao-wgs.blog.163.com/blog/static/5026071420129813059865/ 上面文章中给出的解决方法:今天在做querytask的时 ...

  6. python多线程生成缩略图

    在img目录下7张图片 分别是 11.jpg 22.jpg 33.jpg 44.jpg 55.jpg 66.jpg 77.jpg #encoding=utf-8 import os import ti ...

  7. use IFS in bash

    function dfd() { #http://www.cnblogs.com/hunterfu/archive/2010/02/23/1672129.html IFS=$'\n' for i in ...

  8. 解决Visual Studio 2010/2012的RC4011 warnings

    如果在vc10/11工程的rc文件中有以下任意一行代码: #include <winuser.h> #include <richedit.h> 那么vc将会给出一对警告: C: ...

  9. C#控制其它程序

    [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]        ...

  10. SSH乱码解决

    解决方案: 使用linux,在用户根目录(/root)下有一个.bash_profile配置文件,该配置只对当前用户有效. 使用ls -a命令可以查看到该文件.使用vi编辑器打开该文件后,在其中加入 ...