Websiteentwicklung: Ruby on Rails: Testen
Dazu gibt es einen Rails Guide [1] Testing |
Bei Web-Applikationen, die nicht nur einmal veröffentlicht, sondern auch dauernd weiter entwickelt werden, ist es besonders wichtig automatische Tests zu haben: Wenn ich ein neues Feature einbaue kann ich anschließend die Tests laufen lassen, und somit sicher sein, dass die Applikation noch funktioniert.
Die Test-Umgebung
BearbeitenIm Ordner test findet man den Code den man für Tests schreibt. Ein weiterer Teil der Test-Umgebung ist die Datenbank, die in config/database.yml definiert wurde.
Bevor man Tests startet muss man die Test-Datenbank auf den neuesten Stand bringen:
rake db:migrate rake db:test:load
Unit Tests
BearbeitenDie Unit-Tests testen die einzelnen Klassen des Models. In unserem sehr einfachen Beispiel-Programm gibt es noch nicht viel zu testen:
In der Datei \test\unit\hallo_test.rb:
def test_hallo_ohne_farbe_kann_man_nicht_speichern h = Hallo.new assert !h.save end def test_hallo_mit_farbe_kann_man_speichern h = Hallo.new h.farbe = '#ff0000' assert h.save end
Um diesen Test durchzuführen muss man auf der Kommandozeile in den ordner test wechseln:
cd test ruby unit\hallo_test.rb
Functional Tests
BearbeitenDiese Tests prüfen die Funktion der Controller. Durch das scaffolding wurde schon für jede Action ein Test erstellt. Den Test kann man wieder direkt starten:
ruby functional\hallos_controller_test.rb
In dieser Datei ist die Schreibweise etwas anders: jeder Test beginnt mit dem Wort 'test' und einem Namen als String.
test "should show hallo" do get :show, :id => hallos(:one).to_param assert_response :success end
hallos(:one) ist ein verweis auf eine "Fixture". Das sind Test-Daten, die vor dem Testlauf aus einer Datei in die Datenbank geladen werden.
So könnte die Datei \test\fixtures\hallo.yml aussehen:
one: von: Brigitte meldung: Hallo Welt farbe: "#ff0000"
Achtung: dies ist wieder eine Datei im yaml-Format (so wie database.yml), die sehr empfindlich auf einrückungen reagiert!
Damit wird ein Datensatz definiert, der von den Test-Dateien aus als hallos(:one) erreichbar ist.
Integration Tests
BearbeitenAlle bisherigen Tests betrachten Details: nur ein Modell, oder nur einen Schritt beim Aufruf über das Web. Für das "große Ganze" gibt es noch Integration Tests. Diese verwendet man zum Beispiel, um zu testen ob das Login funktioniert, und ein User nach dem Login bestimmte Recht hat - also Szenarien mit mehreren Schritten.
Integration Tests werden nicht automatisch erzeugt.
Ausblick: Cucumber
BearbeitenMit Cucumber[2] kann man die intendierte Funktion der Webseite auf "Pseudo-englisch" oder "Pseudo-Deutsch" beschreiben. Damit eignet es sich gut um mit Nicht-Programmierern gemeinsam die Tests zu schreiben.
Wenn alle Tests erfolgreich durchlaufen wird Cucumber grün - deswegen ist es nach der Gurke benannt: