Archive for Juli, 2008

Autotest-Notification unter GNOME über libnotify

Samstag, Juli 26th, 2008

Ich benutze das Autotest-Script aus der ZenTest Testing-Suite für Rails.
Autotest ist dazu gedacht den Entwickler zum Einsatz von TDD (Test-Driven Development) zu motivieren. Bei TDD wird das gewünschte Programmverhalten (also das Ziel der Arbeit) zuerst in Form von Tests spezifiert. Anschließend wird so lange programmiert, bis alle Tests “bestanden” werden.

Test-Driven Development (TDD)

Dieses Vorgehen zwingt den Entwickler dazu, sich erst mal Gedanken darüber zu machen, was überhaupt erreicht werden soll- was wiederum zu saubererem Code führen soll.

Wie dem auch sei, Tests sind ungeheuer praktisch weil Sie bei größeren Projekten auch Sicherheit geben, dass eine kleine Änderung nicht “schreckliche” Auswirkungen an anderen Stellen hervorruft, die man zuerst gar nicht bemerkt.
Tests für bereits bestehenden Code zu schreiben ist langweilig, da man ja schon weiss, dass der Code funktioniert- deshalb kann ich jedem nur den Umgekehrt weg via TDD empfehlen.

Autotest

Rails macht das testen bereits sehr einfach, da für alle über script/generate erzeugten Dateien entsprechende Test-Gerüste erstellt werden. Dieses Tests können auch über rake test aufgerufen werden.

Die Idee hinter autotest ist, das manuelle ausführen von Tests zu sparen, und immer im Hintergrund zu testen so bald der Quellcode geändert wurde. Man öffnet autotest daher in einem Konsolenfenster, wo es in einer Endlosschleife läuft und alle Dateien im Rails-Verzeichnisbaum überwacht.

Werden diese Dateien verändert, führt autotest alle Tests aus, die von der Änderung betroffen sein könnten. Nun möchte man nicht ständig ein Auge auf das Konsolenfenster werfen um zu sehen, wieviele Tests erfolgreichen waren und wieviele nicht. Die Ausgabe auf der Konsole ist außerdem nicht einfach zu lesen und wirr formatiert.

Autotest ohne Desktop-Integration

Notifications auf dem Desktop

Hier setzt der Trick mit libnofity an. Autotest unterstützt Hooks, die je nach Resulat des Testlaufs ausgeführt werden, d.h. man kann ein Programm aufrufen, wenn alle Tests erfolgreich waren oder ähnliches. Zeigt dieses Programm eine “Sprechblase” auf dem Desktop an, bekommt man wärend des Programmierens ständig Rückmeldung darüber, wieviel noch zu tun ist, oder ob alle Tests bestanden wurden.

Davon hörte ich zuerst in einem Screencast, wo solche Notifications unter OS X ausgerufen wurden. Später stieß ich zufällig auf einen interessanten Blog-Beitrag, wie solche Meldungen unter KDE erzeugt werden können. Ich setze GNOME als Arbeitsumgebung ein und habe mir ein ähnliches Skript gebastelt. Unter GNOME kann man über den Befehl “notifiy-send” eine Sprechblase auf dem Desktop erscheinen lassen.

GNOME und libnotify

Zunächst muss natürlich das entsprechende Paket installiert werden (hier für Debian-basierte Distributionen):

apt-get install libnotify-bin

Den Erfolg kann man direkt überprüfen durch die Eingabe von  notify-send “hallo” oder ähnlichem auf der Konsole.

anschließend muss im Home-Verzeichnis des Benutzers eine Datei Namens .autotest mit folgendem Inhalt angelegt werden:

#!/usr/bin/ruby
module GNOMENotify
def self.gnotify(msg, icon=’information’)
system “notify-send –urgency low –expire-time=3000 –icon=dialog-#{icon} \”#{msg}\”"
end

Autotest.add_hook :red do |at|
gnotify “#{at.files_to_test.size} tests failed”, “warning”
end

Autotest.add_hook :all_good do |at|
gnotify “All specs passed.”
end

end

So, alles fertig! Jetzt kann es los gehen: Auf der Konsole muss im Verzeichnis des Rails-Projekts autotest (einfach autotest eingeben) ausgeführt werden, und schon werden erstmal alle Tests aufgerufen. Anschließend erhält man schon ein Feedback auf dem Desktop.

Hat man nach TDD-Manier schon ein paar Tests geschrieben, aber ist mit der Implementierungsarbeit noch nicht fertig, sieht es wahrscheinlich so aus:

Autotest mit Desktop-Integration 2

Am Ende eines produktiven Arbeitstages hoffentlich so:

Autotest mit Desktop-Integration 2

Lebenszeichen!

Samstag, Juli 5th, 2008

Wie schnell die Zeit vergeht! Anfänglich hatte ich vor, ungefähr jede Woche einen Beitrag auf diesem Blog zu veröffentlichen. In Wirklichkeit konnte ich ungefähr einen Zwei-Wochen-Rhythmus einhalten, womit ich ganz zufrieden war (schließlich hat dieser Blog einen engen Themenfokus).

So, nun hat sich aber längere Zeit nichts getan. Ich bin sehr beschäftigt mit dem Spekunauten-Projekt. Vorallem die Vorbereitung für Marketingmaßnahmen, aber auch die Implementierung weiterer Features kostet viel Zeit.

Leider musste ich dabei auch die Entwicklung meines geplanten Rails-Hosting Angebots vernachlässigen. Letzteres steht aber noch fest auf meiner To-Do-Liste und ich hoffe ich werde in Zukunft wieder etwas Zeit dafür finden.

Was das Bloggen betrifft- ich habe wieder ein paar Interessante Beiträge in der Pipeline, die ich demnächst veröffentlichen werde. So muss ich für einen anderen Auftrag zur Zeit etwas über den Tellerrand schauen und mich mit CakePHP beschäftigen. CakePHP ist ein MVC-Framework welches sich stark an Ruby on Rails anlehnt. Es gibt dort ein paar nette Ideen, aber durch die sprachlichen Unterschiede ist das entwickeln unter CakePHP natürlich nicht ganz so komfortabel wie unter Rails.

Also dann, schaut mal wieder vorbei.

P.S. Sehr gefreut habe ich mich über den ersten Kommentar, der nicht von einem Bekannten von mir (sondern von einem zufällig hier gelandeten Besucher) stammt.