2009-04-15 20 views
12

Voglio testare l'api REST sul mio sito Rails. Qual è il modo più semplice/migliore per farlo con il framework di test delle rotaie? Sto solo facendo le cose di risorse standard, quindi mi chiedo in particolare, dal momento che questo è così standard di bog, se c'è un modo automatico per testare questa roba.Il modo migliore per testare le API REST XML?

+1

Vuoi dire come puoi fare richieste di test all'URL usando qualche tipo di strumento? O stai parlando di creare un test unitario automatico di qualche tipo? – laz

risposta

2

Consiglierei l'uso di Cetriolo. Cucumber emula un browser e puoi verificare i risultati ottenuti. Funziona bene per richieste XML, JSON e semplici HTML vecchi.

0

Se stai cercando di testare le API che hai creato manualmente, puoi provare questo! Sembra funzionare bene!

REST Client - Simply Test REST APIs

Non si può fare il test automatizzato con questo però!

+0

Questo non è realmente REST se gli URI sono disponibili come parte dell'API. Può esistere solo l'URI del punto di ingresso in un'API RESTful. – aehlke

2

Questo non è automatizzato ma è davvero ottimo per vedere cosa sta facendo la tua API.

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

+1

Mi piacerebbe dare loro il tuo nome utente/password per le richieste autorizzate. Suggerirei di prendere il codice e installarlo per uso privato in quel caso. https://github.com/defunkt/hurl –

1

Usiamo RESTClient un add-on Firefox per visitare e servizi di prova REST.

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

Abbiamo utilizzato questo nella mia squadra per un paio di mesi e non credo che siamo riusciti a fare il nostro lavoro senza di essa. È molto facile da installare e da usare e amichevole da usare.

Se si ottiene l'ultima versione da Sourceforge, è disponibile anche il supporto Oauth, che non ho trovato in nessun altro client REST.

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

Uno, di molti, vantaggi dell'utilizzo di un add-on Firefox è che è plattform croce. Utilizziamo lo stesso strumento (RESTclient) per tutti i membri del nostro team anche se utilizziamo sistemi operativi diversi (Mac, Linux, Windows).

1

Si può provare curl

uso --form-string per passare i dati del modulo al server di

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

Nel controllore si otterrà params['book_key']=BOOK1234 e params["author"]="Gandhi"

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

Nel controllore si otterrà params['email]="[email protected]" e params["author"]="Gandhi" e params["document"] = "File(object)". Funziona solo se test.doc si trova nella directory corrente. Non dimenticare di passare mime-type poiché il server potrebbe prenderlo come "application octet-stream" e devi scrivere sul codice per gestirlo separatamente.

5

Ho arrotolato la mia soluzione e ho pensato che sarebbe stato utile.Ho scritto un modulo che utilizza le gemme json, curb e addressable per inviare richieste GET, PUT, POST e DELETE a localhost: 3000. Può richiedere XML (come la domanda originale richiesta) o JSON. Restituisce il corpo della risposta come un hash. È principalmente un involucro attorno alla gemma del marciapiede, che credo abbia una sintassi orrenda.

Si noti che sto caricando automaticamente il mio api_key. Questo può essere disabilitato passando :api_key => false o rotto utilizzando api_key => "wrong". Potresti voler lasciarlo fuori o modificarlo per adattarlo al tuo schema di autenticazione.

Ecco il modulo:

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

e qui ci sono alcuni semplici esempi: attributi risorsa Richiesta con GET:

api_call("calls/41", :get)

Creazione di risorse con POST:

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

risorse Aggiornamento con PUT:

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

Eliminazione di risorse con DELETE:

api_call("calls/41", :delete)

Disattivazione inserimento automatico di api_key:

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

Utilizzare l'api_key sbagliato:

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

Usa come JSON (di default è xml):

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

perché non trasformarlo in un gioiello che i binari possono sfruttare durante i test? – masukomi

+0

Dovresti sicuramente renderlo un gioiello. Buon lavoro –

Problemi correlati