In den letzten Wochen beschäftige ich mich vor allem mit Ruby und vielen verwandten Themen. Und wer sich mit Ruby (und Rails) beschäftigt, kommt um das Testen seines Codes nicht herum. Da ich seit Jahren ein großer Freund von Test Driven Development (TDD) bin, freue ich mich über die Gelegenheit, tiefer in das Thema einsteigen zu können. Eine Erweiterung zu TDD ist Behaviour Driven Development. Dabei wird nicht mehr länger die Funktionalität eines bestimmten Codeabschnitts getestet, sondern das Verhalten von Code unter bestimmten Bedingungen. Doch dazu später mehr. Heute geht es darum, eine automatisierte Testumgebung, inklusive Growl Notifications aufzusetzen.
Bemerkung: Ich selbst arbeite ausschließlich an Macs, dementsprechend beziehen sich auch alle meine Artikel auf die Arbeit mit OS X (aktuell: Lion), außer sie sind anderweitig gekennzeichnet.
Vorbereitung: Installation von RVM, Ruby und Rails
Ich empfehle sehr stark, zur Verwaltung von Ruby auf dem Mac den Ruby Version Manager (RVM) einzusetzen. Dazu einfach diesen Anweisungen folgen.
Ist RVM einmal installiert und Ruby auf einer aktuellen Version, kann Rails ganz einfach per
sudo gem install rails
installiert werden. Eventuell wird trotz erfolgreicher Installation verlangt, Rails zu installieren. Das passiert vor allem dann, wenn man eine andere Shell als die Bash verwendet (in meinem Fall zsh) und Ruby zwischendurch ein Update erfahren hat. In dem Fall sollte man seine PATH-Variable prüfen.
Schritt 1: rspec
Als Testwerkzeug verwende ich rspec, eine Sprache zum Beschreiben von Spezifikationen. Die Sprache selbst ist Ruby, auch wenn sie auf den ersten Blick anders aussieht. Sie macht sich die Eigenschaft Rubys zu Nutze, anwendungsspezifische Sprachen zu entwickeln (DSL – Domain Specific Language). Zur Anwendung von rspec komme ich in einem späteren Artikel. Hier geht es – wie schon geschrieben – nur um die Installation.
Die Installation von rspec ist denkbar einfach:
gem install rspec
Um rspec anstelle von Unit Testing in einem Rails Projekt unterzubringen, reichen folgende Schritte:
Sollte noch kein Rails Projekt bestehen, wäre jetzt der richtige Zeitpunkt, eines anzulegen.
$ rails new demo-project -T $ cd demo-project
Der Parameter -T dient dazu, keine Testumgebung zu generieren. Das wollen wir ja hier selbst machen.
Gemfile anpassen:
group :development do gem 'rspec-rails' end group :test do gem 'rspec' gem 'webrat' end
Anschließend das Bundle noch einmal laden:
bundle install
Und rspec für die Anwendung installieren:
rails generate rspec:install
Das Rails Projekt sollte jetzt einen Ordner spec haben, in welchem sich die Tests befinden.
Schritt 1.5: Testumgebung testen
Das folgende Beispiel ist schamlos aus dem Buch “Ruby on Rails Tutorial – Learn Rails by Example” von Michael Hartl geklaut.
Zum Testen der Umgebung, generieren wir einen Controller:
rails generate controller Pages home contact
Es werden nun ein Controller, verschiedene Views und einige Testdateien angelegt. Da wir aber nicht alle angelegten Tests brauchen, sondern uns in erster Linie der Controller interessiert (wir testen die Views und Heller durch den Controller), können wir den Ordner spec erst einmal aufräumen:
$ rm - r spec/views spec/helpers
Nun kann man seine Installation per
$ rpsec --color spec
testen.
Schritt 2: Tests automatisieren
BDD kann süchtig machen. Vor allem, wenn die Tests vollkommen automatisch im Hintergrund Abläufen und der Entwickler bei jeder Änderung am Code sofort ein Feedback bekommt, wie viele Tests noch fehl schlagen.
Dafür braucht es nur sehr wenige Erweiterungen.
Eine Handvoll Edelsteine …
$ sudo gem install autotest $ sudo gem install autotest-rails-pure $ sudo gem install autotest-fsevent $ sudo gem install autotest-growl
… sowie eine Konfigurationsdatei:
$ vim .autotest require 'autotest/growl' require 'autotest/fsevent'
Fertig.
Die Testumgebung kann jetzt über
$ autotest
gestartet werden.
________________________________________
Empfohlene Lektüre:XP Rules: Test First! (en)
Introducing BDD by Dan North (en)