如果你手工測試Restful 服務將會是一件非常單調乏味的事情。當然,目前有一些瀏覽器插件可以通過可視化的界面幫助你手工測試,例如postman、rest console,但是每次系統版本更新,你都需要去手動執行大量的測試,顯然這種方式不是非常實用。Ruby擁有許多出色的gem包,你可以使用它們完成這項枯燥的工作。其中RestClient是我比較喜歡的一個。結合ruby的rspec框架使用RestClient可以編寫非常強大的測試腳本。假如Github想讓你測試他們的Restful API。你可能想做的第一件事就是確保端點返回你預計的響應代碼。開始前,你需要確認你已經安裝了相應的gems。 最便利的方式是使用bundler安裝:
1
2
3
4
5
|
source "https://rubygems.org" gem 'rest-client' gem 'rspec' gem 'json_expressions' |
在cmd(windows,linux/mac環境請自行解決)進入你創建gemfile文件的同層目錄,運行 'bundle'
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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響應:
1
2
3
4
5
6
7
8
9
10
11
|
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
因此返回碼是對的,但是我們如何知道返回的json也是對的呢?
有幾種不同的方式去驗證。一種方法是解析body中的json(由key,value組成),然后針對你要檢查的每個key創建斷言。這種方式可以使用,但是它需要你寫多個斷言而且是比較難于維護的。另外一種方法是和一個已知有效的json格式的數據文件比較。你可以使用json_expressions gem包去做這個事情。下面的例子是相同的spec文件。新增一個testcase用來驗證json數據。
首先準備一個users.json文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
{ "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文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
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是否存在,而不關心它的值,你可以增加如下的代碼到你的測試用例中。
1
2
3
4
5
6
|
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 |