Websiteentwicklung: Ruby on Rails: Testen

Rails Guide 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 Bearbeiten

Im 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 Bearbeiten

Die 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 Bearbeiten

Diese 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 Bearbeiten

Alle 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 Bearbeiten

Mit 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:


 
Test läuft durch




Quellen

  1. Rails Guide Testing
  2. Hellesøy: Cucumber