如果你手工测试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. Atitit.mvc的趋势与未来attilax总结

    Atitit.mvc的趋势与未来attilax总结 1. Mvc的分类 (服务端mvc  vs客户端mvc)1 2. Mvc的趋势,从服务端mvc正在转向客户端mvc1 2.1. 更加完善的分离..h ...

  2. atitit.常用编程语言的性能比较 c c++ java

    atitit.常用编程语言的性能比较 c c++ java 选择一个什么样的程序问题进行这样的测试呢?这是一个很关键的问题,也最容易影响测试的公平性.另外的,对于每种语言,各自的优势都是不同的 #-- ...

  3. Effective STL中文版 译序

    <Effective STL中文版>译序 就像本书的前两本姊妹作(Effective C++.More Effective C++)一样,本书的侧重点仍然在于提升读者的经验,只不过这次将焦 ...

  4. CSS3参考手册

    很好用的CSS3 API http://www.css88.com/book/css/

  5. js命名规范

  6. MySql 分页

    MySql 分页 由于最近项目需要,于是就简单写了个分页查询.总体而言MySql 分页机制较为简单.数据库方面只需要使用limit即可实现分页.前后台交互就直接用session传了值. 下面就写写具体 ...

  7. Enterprise Solution 2.2 开发帮助文档集合

    首先是一个PPT文档,从宏观层面展示Enterprise Soltion的几个功能特色. Enterprise Solution解决方案安装与配置 将源代码解决方案和演示程序在电脑中进行配置,作为了解 ...

  8. android: SQLite 数据库的最佳实践

    6.5.1    使用事务 前面我们已经知道,SQLite 数据库是支持事务的,事务的特性可以保证让某一系列的操 作要么全部完成,要么一个都不会完成.那么在什么情况下才需要使用事务呢?想象以下场 景, ...

  9. 每日英语:The Secret About Online Ad Traffic: One-Third Is Bogus

    Billions of dollars are flowing into online advertising. But marketers also are confronting an uncom ...

  10. FEC难:

     飞雨(314698641)  12:03:16 有人研究fec吗把信源编码好信道编码区别开来 ? 杭州桓泽(84894922)  12:52:54fec实际是一种概括性技术可以从信源的方面做fec就 ...