• rspec+rest-client测试第三方web service


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

    1 source "https://rubygems.org"
    2 
    3 gem 'rest-client'
    4 gem 'rspec'
    5 gem 'json_expressions'

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

     1 rafs-computer:rafael$ bundle
     2 Using diff-lcs 1.2.5
     3 Using json_expressions 0.8.3
     4 Using mime-types 2.3
     5 Using netrc 0.7.7
     6 Using rest-client 1.7.2
     7 Using rspec-support 3.1.1
     8 Using rspec-core 3.1.4
     9 Using rspec-expectations 3.1.2
    10 Using rspec-mocks 3.1.2
    11 Using rspec 3.1.0
    12 Using bundler 1.7.3
    13 Your bundle is complete!

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

     1 require 'rspec'
     2 require 'rest_client'
     3 
     4 describe 'GitHub API' do
     5     
     6     it 'should return information about a user' do 
     7         result = RestClient.get 'https://api.github.com/users/rest-client',  :content_type => :json, :accept => :json
     8         expect(result.code).to eq(200)
     9     end
    10 
    11 end

    在命令行执行rspec -f doc filename

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

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

    首先准备一个users.json文件

     1 {
     2   "login": "rest-client",
     3   "id": 2386701,
     4   "avatar_url": "https://avatars.githubusercontent.com/u/2386701?v=3",
     5   "gravatar_id": "",
     6   "url": "https://api.github.com/users/rest-client",
     7   "html_url": "https://github.com/rest-client",
     8   "followers_url": "https://api.github.com/users/rest-client/followers",
     9   "following_url": "https://api.github.com/users/rest-client/following{/other_user}",
    10   "gists_url": "https://api.github.com/users/rest-client/gists{/gist_id}",
    11   "starred_url": "https://api.github.com/users/rest-client/starred{/owner}{/repo}",
    12   "subscriptions_url": "https://api.github.com/users/rest-client/subscriptions",
    13   "organizations_url": "https://api.github.com/users/rest-client/orgs",
    14   "repos_url": "https://api.github.com/users/rest-client/repos",
    15   "events_url": "https://api.github.com/users/rest-client/events{/privacy}",
    16   "received_events_url": "https://api.github.com/users/rest-client/received_events",
    17   "type": "Organization",
    18   "site_admin": false,
    19   "name": "REST-Client Team",
    20   "company": null,
    21   "blog": "",
    22   "location": null,
    23   "email": null,
    24   "hireable": false,
    25   "bio": null,
    26   "public_repos": 1,
    27   "public_gists": 0,
    28   "followers": 0,
    29   "following": 0,
    30   "created_at": "2012-09-20T15:01:43Z",
    31   "updated_at": "2015-03-11T19:08:01Z"
    32 }

    然后编写测试用例spec文件

     1 require 'rspec'
     2 require 'rest_client'
     3 require 'json_expressions/rspec'
     4 
     5 
     6 describe 'GitHub API' do
     7 
     8   it 'should return 200 when asking information about a user' do
     9     result = RestClient.get 'https://api.github.com/users/rest-client',  :content_type => :json, :accept => :json
    10     expect(result.code).to eq(200)
    11   end
    12 
    13   it 'should return proper data for a user' do
    14     expected_data = JSON.parse(IO.read('users.json'))
    15     result = RestClient.get 'https://api.github.com/users/rest-client',  :content_type => :json, :accept => :json
    16     expect(result).to match_json_expression(expected_data)  
    17   end
    18 
    19 end

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

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

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

  • 相关阅读:
    是河南大学的悲哀???
    装完manjaro先要卸载
    技术博客
    VIM从入门到中级教程
    HTTP中GET与POST的区别
    AngularJS 拦截器实现全局$http请求loading效果
    angular指令监听ng-repeat渲染完成后执行自定义事件方法
    icheck如何修改样式大小
    Sublime text3 代码格式化插件
    代理模式小试
  • 原文地址:https://www.cnblogs.com/timsheng/p/4333030.html
Copyright © 2020-2023  润新知