Ruby配置rspec和RestClient来检测服务器

所属分类: 脚本专栏 / ruby专题 阅读数: 2098
收藏 0 赞 0 分享

如果你手工测试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

2015713114043998.png (543×129)

因此返回码是对的,但是我们如何知道返回的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

更多精彩内容其他人还在看

Ruby中用线程实现经典的生产者消费者问题代码实例

这篇文章主要介绍了Ruby中用线程实现经典的生产者消费者问题代码实例,本文直接给出实现代码和运行效果,需要的朋友可以参考下
收藏 0 赞 0 分享

Ruby中常用的字符串处理函数使用实例

这篇文章主要介绍了Ruby中常用的字符串处理函数使用实例,本文总结了Ruby中最常用的字符串处理函数,如返回字符串的长度、判断字符串中是否包含另一个串、字符串插入、字符串分隔、默认分隔符为空格等内容,需要的朋友可以参考下
收藏 0 赞 0 分享

Windows下ruby语言安装教程

这篇文章主要介绍了Windows下ruby语言安装教程,本文使用rubyinstaller提供的安装包安装,并给出图文说明,非常简单,需要的朋友可以参考下
收藏 0 赞 0 分享

ruby环境中自动编译sass教程

这篇文章主要介绍了ruby环境中自动编译sass教程,本文讲解了ruby环境的安装、sass环境的安装以及sass的常用编译命令使用示例,需要的朋友可以参考下
收藏 0 赞 0 分享

Ruby中相等性判断的4种方法

这篇文章主要介绍了Ruby中相等性判断的4种方法,本文讲解了“==” 最常见的相等性判断、“===” 用于 case 语句的相容判断、“equal?” 相同对象判断、“eql?” 对象 hash 值判断等内容,需要的朋友可以参考下
收藏 0 赞 0 分享

Rails中使用MySQL分区表一个提升性能的方法

这篇文章主要介绍了Rails中使用MySQL分区表一个提升性能的方法,本文总结出了一个简单的方法实现避免扫描全部的分区表,从而提升性能,需要的朋友可以参考下
收藏 0 赞 0 分享

Rails应用程序中同时修改操作冲突问题的解决方案

这篇文章主要介绍了Rails应用程序中同时修改操作冲突问题的解决方案,本文讲解使用Rails 的 乐观锁解决这个问题并给出了代码救命,需要的朋友可以参考下
收藏 0 赞 0 分享

Ruby中的p和puts的使用区别浅析

这篇文章主要介绍了Ruby中的p和puts的使用区别浅析,本文用一个实例讲解了它们之间的区别,并总结出结论,需要的朋友可以参考下
收藏 0 赞 0 分享

Ruby中的block、proc、lambda区别总结

这篇文章主要介绍了Ruby中的block、proc、lambda区别总结,本文讲解了yield 和 block call 的区别、block 和 proc、lambda 的区别、proc 和 lambda 的区别,需要的朋友可以参考下
收藏 0 赞 0 分享

Ruby的运算符和语句优先级介绍

这篇文章主要介绍了Ruby的运算符和语句优先级介绍,本文先是给出了一些小例子来验证运算符和语句优先级,然后总结出一个优先级表,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多