2009-04-15 66 views
12

我想在我的Rails站點上測試REST api。使用rails測試框架做到這一點最簡單/最好的方法是什麼?我只是在做標準的資源豐富的東西,所以我特別想知道,因爲如果有任何自動手段來測試這些東西,那麼這就是標準。測試Rails REST XML API的最佳方式是什麼?

+1

你是說如何使用某種工具向URL發出測試請求?還是你說的是創建某種自動單元測試? – laz 2009-04-17 18:57:20

回答

2

我會推薦使用黃瓜。黃瓜模擬瀏覽器,你可以驗證它得到的結果。這適用於XML請求以及JSON和普通的舊HTML。

0

如果您正在測試手動創建的API,您可能需要試試這個!似乎運作良好!

REST Client - Simply Test REST APIs

你不能做這個的自動化測試,但!

+0

如果URI作爲API的一部分提供,那麼這並不是真正的REST。在RESTful API中只能有入口點URI。 – aehlke 2009-08-17 20:30:22

2

這不是自動化的,但它非常適合查看您的API在做什麼。

http://hurl.r09.railsrumble.com/

+1

我會告誡他們爲授權請求提供用戶名/密碼。我建議在這種情況下抓住代碼並安裝以供私人使用。 https://github.com/defunkt/hurl – 2011-01-26 04:07:36

1

我們使用RESTClient實現一個Firefox插件訪問和測試REST服務。

https://addons.mozilla.org/en-US/firefox/addon/9780

我們已經在我的團隊一直在使用這個一兩個月的,我不認爲我們可以做我們的工作離不開它。起牀和跑步非常容易,而且使用起來很方便。

如果你從Sourceforge獲得最新版本,甚至還有Oauth支持它,這是我在任何其他REST客戶端都找不到的。

的使用Firefox插件的很多優勢

http://sourceforge.net/projects/restclient/develop

一個,就是它的跨plattform。即使我們使用不同的操作系統(Mac,Linux,Windows),我們也會爲我們團隊的所有成員使用相同的工具(RESTclient)。

1

您可以嘗試curl

使用--form-string表單數據傳遞到服務器

(1)

curl --form-string "book_key=BOOK1234" --form-string "author=Gandhi" -X PUT 'http://localhost:3000/api/show_all_books_of_a_particular_author?params1=value1&param2=value2' 

在控制器中你會得到params['book_key']=BOOK1234params["author"]="Gandhi"

使用-F "[email protected];type=application/msword;"

(2)

curl -F "[email protected]_experiments_with_truth.pdf;type=application/pdf;" --form-string "author=Gandhi" --form-string "[email protected]" -X PUT 'http://localhost:3000/api/submit_a_pdf_book?params1=value1&param2=value2' 

在控制器中你會得到params['email]="[email protected]"params["author"]="Gandhi"params["document"] = "File(object)"。只有當test.doc在當前目錄中時,這才起作用。不要忘記通過mime-type作爲服務器可能會把它作爲"application octet-stream",並需要寫入代碼來處理這個分開。

5

我推出了自己的解決方案,並認爲這會有所幫助。我編寫了一個模塊,它使用json,curbaddressable寶石發送GET,PUT,POST和DELETE請求到localhost:3000。它可以請求XML(如要求的原始問題)或json。它將響應主體作爲散列返回。它大多是圍繞着遏制寶石的包裝,我認爲它具有可怕的語法。

請注意,我自動加載我的api_key。這可以通過傳遞:api_key => false或使用api_key => "wrong"來禁用。您可能希望保留或修改它以適應您的身份驗證方案。

這裏的模塊:

module ApiTesting 
    # requres the json, curb, and addressable gems 

    require "addressable/uri" 

    def api_call(path, verb, query_hash={}, options={}) 
    options.reverse_merge! :api_key => "abc1234", :format => "xml" 
    query_hash.reverse_merge!({:api_key => options["api_key"]}) if options[:api_key] 
    query = to_query_string(query_hash) 
    full_path = "http://localhost:3000/#{path}.#{options[:format]}?#{query}" 
    response = case verb 
     when :get 
     Curl::Easy.perform(full_path) 
     when :post 
     Curl::Easy.http_post("http://localhost:3000/#{path}.#{options[:format]}", query) 
     when :put 
     Curl::Easy.http_put(full_path, nil) 
     when :delete 
     Curl::Easy.http_delete(full_path) 
    end 
    case options[:format] 
     when "xml" 
     Hash.from_xml(response.body_str) 
     when "json" 
     JSON.parse(response.body_str) 
    end 
    end 

    private 

    def to_query_string(val) 
    uri = Addressable::URI.new 
    uri.query_values = val 
    uri.query 
    end 

end

這裏有一些簡單的例子:

api_call("calls/41", :get)

創建資源與POST:

api_call("people", :post, {:person => {:first => "Robert", :last => "Smith" } })

更新資源,GET 請求資源屬性PUT:

api_call("people/21", :put, {:person => { :first => "Bob" } })

刪除資源用DELETE:

api_call("calls/41", :delete)

關閉API_KEY自動插入:

api_call("calls/41", :get, {}, {:api_key => false})

使用了錯誤的API_KEY:

api_call("calls/41", :get, {}, {:api_key => "wrong"})

用作JSON(默認爲xml):

api_call("calls/41", :get, {}, {:format => "json"})
+1

爲什麼不把它放到一個可以在測試過程中使用的gem中? – masukomi 2011-05-20 17:51:42

相關問題