2009-04-15 2 views
12

RailsのサイトでREST APIをテストしたいと思っています。レールテストフレームワークでこれを行う最も簡単で最善の方法は何ですか?私は標準的な知識豊富なものだけをやっているので、これをテストするための自動化された方法があれば、これは非常に標準的なので、特に私は疑問に思います。REST XML APIをテストする最良の方法は?

+1

何らかのツールを使用してURLにテストリクエストをどのように作成できますか?あるいは、何らかの自動化ユニットテストを作成することについて話していますか? – laz

答えて

2

私はCucumberの使用をお勧めします。キュウリはブラウザをエミュレートし、結果を確認することができます。これは、JSONと単純な古いHTMLだけでなく、XMLリクエストに対してもうまく機能します。

0

手動で作成したAPIをテストする場合は、これを試してみてください。うまくいくように見えます!

REST Client - Simply Test REST APIs

あなたはこのかかわらで自動化されたテストを行うことはできません!

+0

URIがAPIの一部として利用可能な場合、これは実際にはRESTではありません。 RESTfulなAPIにはエントリポイントURIしか存在できません。 – aehlke

2

これは自動化されていませんが、あなたのAPIが何をしているかを見るのには本当に素晴らしいです。

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

+1

私は、許可された要求に対してユーザー名/パスワードを与えることに注意します。私は、コードを取得し、その場合に私的使用のためにインストールすることをお勧めします。 https://github.com/defunkt/hurl –

1

私たちは、Firefoxが訪問するアドオンとテストRESTサービスRESTClientを使用します。

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

我々は数ヶ月のために私のチームでこれを使用していると私たちはそれなしで私たちの仕事をすることができるとは思いません。立ち上がり、走りやすく、使いやすいです。

最新のバージョンをSourceforgeから入手した場合は、他のRESTクライアントで見つけられなかったOauthサポートもあります。 Firefoxのアドオンを使用して、多くの、利点の

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

一つは、それがクロスplattformだということです。異なるOS(Mac、Linux、Windows)を使用していても、チームの全員に同じツール(RESTクライアント)を使用します。

1

あなたが取得するコントローラでは、サーバ

(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' 

にフォームデータを渡すためにcurl

使用--form-stringを試すことができますparams['book_key']=BOOK1234params["author"]="Gandhi"

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

01コントローラで

(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が現在のディレクトリにある場合にのみ機能します。サーバは"application octet-stream"と取るかもしれないので、mime-typeを渡すことを忘れて、これを別に処理するコードに書き込む必要があります。

5

これに私自身の解決策を巻き込んだので、参考になると思いました。私はjsoncurb、およびaddressable gem、PUT、POST、およびDELETE要求をlocalhost:3000に送信するモジュールを作成しました。それはXML(元々の質問として)またはjsonを要求することができます。レスポンスボディをハッシュとして返します。これは主に縁石宝石の周りのラッパーですが、私は恐ろしい構文を持っていると思います。

私は自動的にapi_keyを読み込んでいます。これは、を渡すか、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

そして、ここではいくつかの簡単な例は以下のとおりです。 リソース要求は、GETと属性:

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

更新リソース:

api_call("calls/41", :get)

がPOSTでリソースを作成しますPUT付き:

DELETEとリソースを削除
api_call("people/21", :put, {:person => { :first => "Bob" } })

api_call("calls/41", :delete)

をAPI_KEYの自動挿入をオフにする:

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

間違っAPI_KEY使用:JSONとして

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

使用(デフォルトはあるがxml):

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

テスト中にレールが活用できる宝石にこれをロールアップしてみませんか? – masukomi

+0

あなたは間違いなくそれを宝石にする必要があります。よくやった –

関連する問題