Das Testen von Software begleitet mich von Projekt zu Projekt. Bei bisherigen Entwicklungen habe ich immer wieder auf RSpec zurück gegriffen, ein tool zum testen von Ruby Applikationen. Es zeichnet sich durch eine relativ einfache Handhabung aus und eine Ausdrucksweise die an die menschliche Sprache angelehnt ist. Auch wenn nicht jeder mögliche einzutretende Fall getestet werden kann, tests geben Entwicklern Sicherheit wenn Änderungen am Code vorgenommen werden.
WebMock
WebMock ist eine Library die es einem ermöglich HTTP requests auszudrücken und Erwartungen an diese zu setzen. In Verbindung mit RSpec lässt sich WebMock verwenden um eine Ruby Anwendung zu testen die HTTP Requests ausführt, beispielsweise an eine API. Oft sind diese Requests nicht starr sondern werden dynamisch anhand von Parametern zusammen gesetzt. WebMock/RSpec hilft dabei unterschiedliche Fälle zu simulieren, Erwartungen zu definieren und diese mit zu prüfen.
WebMock ist als Gem verfügbar, die Installation ist daher relativ einfach:
user@localhost ~ $ gem install webmock
Als Beispiel verwende ich eine sehr simple Ruby Klasse. Deren einzige Methode ‘request’ sendet einen GET request an die URL ‘https://wtfismyip.com’. Abhängig vom Parameter ‘option’ wird die IP entweder in Textform oder als JSON abgefragt:
require 'net/http' require 'uri' class ApiCaller def self.request(option) uri = URI.parse("https://wtfismyip.com/#{option}") http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = true request = Net::HTTP::Get.new(uri.request_uri) http.request(request) end end
Mein Test beinhaltet den Aufruf der ‘request’ Methode. Der HTTP request wird simuliert und die Erwartung das ein Request an eine bestimmte URL stattfinden soll wird auch definiert.
require 'api_caller' require 'webmock/rspec' describe ApiCaller do describe '.request' do context 'given json parameter' do it 'requests json url' do stub_request(:get, 'https://wtfismyip.com/json') expect(ApiCaller.request('json')). to have_requested(:get, 'https://wtfismyip.com/json').once end end context 'given text parameter' do it 'requests text url' do stub_request(:get, 'https://wtfismyip.com/text') expect(ApiCaller.request('text')). to have_requested(:get, 'https://wtfismyip.com/text').once end end end end
Beim testen sieht das nun folgendermaßen aus:
user@localhost ~ $ rspec --format documentation ApiCaller .request given json parameter requests json url given text parameter requests text url Finished in 0.00557 seconds (files took 0.37426 seconds to load) 2 examples, 0 failures
0 Comments