Skip to content

PHP-CodeSniffer in Netbeans integrieren

Hohe Code-Qualität ist nicht nur in großen Projekten wichtig, an denen mehrere Programmierer sitzen. Auch im Kleinen hilft die Einhaltung formaler Richtlinien (Coding Standards), Fehler zu vermeiden und den Quellcode wartbar zu halten. Mittlerweile existieren auch für PHP diverse Tools, die den Programmierer beim Coden unterstützen. Zwei davon, Code-Sniffer und Mess Detector, bemängeln automatisch anhand definierter Regeln auch kleine Unachtsamkeiten wie fehlende Kommentare, ungenutzte Variablen oder übermäßig komplizierten Code. Diese lassen sich recht einfach auch in IDEs wie Netbeans integrieren, wie ich im folgenden kurz zeige.

PEAR-Pakete downloaden

Voraussetzung sind die PEAR-Pakete PHP_CodeSniffer, das von Greg Sherwood betreut wird, und PHP_MD (PHP Mess Detector von Manuel Pichler). Die Links verweisen auf Installationsanleitungen. In der Regel lassen sich die Pakete mit PEAR-Bordmitteln installieren.

Unter Linux werden unter /usr/bin die beiden Batchfiles phpcs bzw. phpmd installiert, die zum Ausführen der Tools verwendet werden sollten, weil sie Prüfungen vornehmen und benötigte Klassen importieren.

Netbeans-Plugin installieren

Bei der Suche nach entsprechenden CodeSniffer-Plugins für Netbeans habe ich zwei Projekte gefunden. Das Plugin von Benjamin Eberlei wurde im April 2010 zum letzten Mal aktualisiert und hat bei mir nicht richtig funktioniert (YMMV). Das PHP CodeSniffer Netbeans Plugin (Download für Netbeans 6.9.1) lief auf Anhieb und hat auch die Unterstützung für PHP_MD bereits integriert. Zur Installation ladet ihr die *.nbm-Datei herunter und installiert das Plugin in Netbeans unter "Extras → Plugins → Heruntergeladen → Plugins hinzufügen …". Gegebenenfalls ist jetzt ein Neustart von Netbeans nötig.

Tools konfigurieren

Unter "Extras → Optionen → PHP → phpMD bzw. phpCodeSniffer" können nun globale Einstellungen vorgenommen werden. In der Regel müssen zunächst die jeweiligen Batch-Dateien (/usr/bin/phpmd und /usr/bin/phpcs) angegeben werden. Außerdem kann ein Coding-Standard, z.B. "Zend" eingetragen werden (mehr Infos dazu in der Dokumentation). Über die Schaltfläche "Test Settings" lässt sich überprüfen, dass die Batch-Dateien korrekt angegeben wurden.

Wird jetzt eine PHP-Datei im Netbeans-Editor geöffnet, parsen die Tools den Dateiinhalt und geben ihre Ergebnisse im "Aufgaben"-Fenster aus. Dort lassen sich die Resultate auch gruppieren und filtern. Diese variieren natürlich je nach Coding Standard und werden jeweils beim Speichern einer Datei neu ermittelt.

Projektspezifische Einstellungen

Wer möchte, kann sich auch eigene, so genannte "Sniffs" programmieren, also eigene Validierungsregeln aufstellen. Sollen diese allerdings nicht global für alle Projekte gelten, sondern nur für einzelne, ist etwas Handarbeit gefragt. Im Netbeans-Projektverzeichnis, also im Verzeichnis nbprojects, muss eine Datei codesniffer.properties angelegt werden, die projektspezifische Settings beinhaltet. Dort können verschiedene Optionen gesetzt werden, allerdings bin ich mir nicht sicher, ob alle möglichen Kommandozeilenargumente auch dort gesetzt werden können. Soll ein eigenes Ruleset definiert werden kann man darauf verweisen:

phpcs.standard=/pfad/zum/eigenen/ruleset.xml

Es sind im Endeffekt nur kleine Helferlein, aber sie erledigen nützliche Arbeit im Hintergrund. Und sie machen sich nach einer Weile fast selbst überflüssig, wenn man als Programmierer darauf achtet, nicht immer wieder die gleichen Fehler "vorgehalten" zu bekommen.

Selenium Tests mit NetBeans und PHP

Selenium-Tests können elegant direkt in NetBeans für PHP erstellt und aus NetBeans heraus ausgeführt werden. Leider funktioniert das unter bestimmten Umständen nicht out-of-the-box, sondern macht einige Kniffe notwendig.

NetBeans-Plugin installieren

Ich gehe davon aus, dass ihr alles notwendige für die PHP-Entwicklung installiert habt. Das schließt PHPUnit ein, auf das die Selenium-Tests zurückgreifen. Wie man Selenium in PHPUnit integriert, wird hier ausführlich beschrieben.

Auf meinem Ubuntu-Rechner mit NetBeans 6.9.1 und Firefox 3.6.12 lässt sich das Selenium Module for PHP aus dem NetBeans Beta-Repository einfach installieren: Unter "Extras > Plugins > Einstellungen" das Häkchen bei "NetBeans Beta" setzen, dann steht das Selenium-Modul zur Auswahl und kann installiert werden. Anschließend lässt sich nach Rechtsklick auf das Projekt im Projektmanager der Punkt "Run Selenium Tests" aus dem Kontextmenü auswählen. Zunächst muss ein Verzeichnis ausgewählt werden, in dem die Testdateien abgelegt werden. Ich habe den Ordner selenium direkt neben nbprojects in meinem Projektverzeichnis angelegt und als Testverzeichnis ausgewählt.

Da wir noch keine Testdateien erstellt haben, wird auch noch nichts ausgeführt, aber das Verzeichnis wird als Selenium Test Files aufgeführt. Wiederum über das "Kontextmenü > Neu" kann jetzt ein "Selenium Test Case for PHP" erstellt werden. Dabei legt NetBeans freundlicherweise schon das Code-Gerüst für den neuen Test-Case an. Natürlich kann, wer möchte, auch manuell Test-Cases im Test-Verzeichnis anlegen oder den PHP-Code aus der Selenium IDE (= Firefox-Extension) herausgenerieren lassen. Die NetBeans-Vorlage sieht etwa wie folgt aus.

require_once 'PHPUnit/Extensions/SeleniumTestCase.php';

class newSeleneseTest extends PHPUnit_Extensions_SeleniumTestCase
{
    protected function setUp()
    {
        $this->setBrowser("*chrome");
        $this->setBrowserUrl("http://change-this-to-the-site-you-are-testing/");
    }

    public function testMyTestCase()
    {
        
    }
}

Unabhängig davon, welchen Test man in testMyTestCase() implementieren möchte, gilt es jetzt noch einige Stolpersteine aus dem Weg zu räumen.

"Selenium Tests mit NetBeans und PHP" vollständig lesen

Twitter-Plugin lernt OAuth

OAuth LogoNachdem Ende August die "OAuthcalypse" eintrat und Twitter externe Anwendungen seitdem nur noch per OAuth authentifiziert, musste auch das entsprechende Plugin für Serendipity angepasst werden. Am vergangenen Wochenende hat Garvin Hicking diese Funktionalität mit Hilfe der Community umgesetzt. Ich freue mich, dass ich dabei behilflich sein konnte. Momentan ist eine Testversion des Plugins hier zum Download verfügbar. Sollten keine Fehler mehr auftreten, dürfte die neue Version bald auch über den Serendipity-eigenen Installer SPARTACUS augeliefert werden.

Zu OAuth hatte ich ja im Rahmen der PHP Usergroup Rheinhessen im März einen kurzen Vortrag gehalten. Aufgrund der Umstellung bei Twitter ist OAuth mittlerweile wohl im Mainstream angekommen. Finde ich gut. Jetzt wird bereits über OAuth 2.0 diskutiert.

Freier Routing-Dienst von MapQuest

Mapping ist ja einfach nur ein Hobby von mir. Seit ich vor einigen Jahren die Community-betriebene Openstreetmap entdeckt habe, faszinieren mich die unterschiedlichen Facetten dieses Themenkomplexes ungemein. Regelmäßig lese ich einige Mapping-Blogs, unter anderem OpenGeoData. Dort wurde gestern ein Hinweis auf ein neues, offenes Routing-API von MapQuest gepostet. Routing und Navigation waren bisher eigentlich immer so die Punkte, die ich als noch zu jung und experimentell und meist für den Praxiseinsatz unbrauchbar empfand. Das könnte sich nun ändern, denn der frei zugängliche Routingdienst von MapQuest setzt im Hintergrund auf Daten der Openstreetmap.

Interessehalber habe ich die Dokumentation mal überflogen und dieses Beispiel minimal abgewandelt, um den Dienst testen zu können. Funktionert 1A! So sieht das Ergebnis aus (bitte auf "Route berechnen" klicken)

Mobile Fahrrad-Navigation mit der OSM Radkarte

Mein auf den Lenker montiertes Garmin etrex Vista HCx

Fahrradfahrer finden im Netz zahlreiche Angebote, die ihnen Karten auf Basis von Openstreetmaps anbieten. Die Open Cycle Map ist in ihrer Kartendarstellung ganz auf Radler zuschnitten. Sie zeigt Radwege farblich hervorgehoben an. Mountainbiker (und auch Wanderer) finden spezielle Angebote unter Openmtbmap.org. Die Aufzählung könnte noch lange fortgesetzt werden.

Wer mit dem Fahrrad unterwegs ist, möchte aber das nötige Kartenmaterial gern dabei haben, da bringen noch so gute Online-Angebote wenig. Mit Smartphones ist zwar auch einiges möglich, aber nicht überall ist die Netzabdeckung gleich gut. Besitzer von GPS-Geräten können sich Openstreetmaps-Karten mit wenig Aufwand auf ihr Geräte laden. Ich habe das gerade auf meinem Garmin etrex Vista HCx ausprobiert.

Die Installation ist einfach

Als Ausgangsmaterial dienten Kartendaten des Projekts OSM Radkarte, die schon im richtigen Format für das Garmin vorliegen. Die Datei gmapsupp.img ist etwa 680 MB groß und kann hier heruntergeladen werden. Die Datei habe ich auf meine Datenkarte ins Verzeichnis /garmin kopiert, damit mein Gerät sie dort finden und einlesen kann. Das hat einige Minuten gedauert.

Schließlich konnte ich das Garmin aber mithilfe meines neuen Fahrradhalter an meinen Lenker montieren. Mit dem Joystick wählte ich auf der Kartenansicht einen Punkt am anderen Ende der Stadt aus. Wie empfohlen aktivierte ich die Option "Mautstrecken vermeiden" (bewirkt das Umfahren von Autobahnen und Bundesstraßen ohne Radweg) und schaltete die Option "Kehrtwenden vermeiden" aus. Und fuhr los.

Im praktischen Einsatz

Sofort wurde die Route berechnet und lotste mich durch die Straßen der Mainzer Neustadt. Sollte ich abbiegen, wurde ich von einem kurzen Piepston darauf aufmerksam gemacht, und die Karte zoomte in eine Detailansicht mit Abbiegepfeil. Die berechnete Route verlief vollständig über Radwege und Nebenstraßen und war auch ziemlich optimal berechnet. Ein-, zweimal wäre ich gefühlsmäßig anders abgebogen, was aber am Ende aufs Gleich hinausgelaufen wäre. Ich musste also keine Umwege fahren, und als ich einmal mutwillig falsch abbog, wurde schnell eine neue Route berechnet.

Einziges Problem: Wir haben in Mainz mittlerweile sehr viele Einbahnstraßen, die von Fahrrädern in beide Richtungen befahren werden dürfen. Dies wurde in der Routenplanung nicht berücksichtigt. Es sieht aber so aus, dass diese Eigenschaften (cycleway:opposite) in den OSM-Daten gar nicht vorhanden sind (da muss ich wohl mal losziehen und mappen!). Das ist also offenbar kein Problem der Software. Ansonsten klappte das Routing perfekt, und ich werde es demnächst mal bei einer größeren "Überlandfahrt" ausprobieren.

Abschließender Hinweis

Wie oben angesprochen, gibt es noch andere Karten zum Download, z.B. die von Openmtbmap.org. Im Endeffekt dürften sich diese Karten in Ansicht und Verwendung sehr ähneln. Das Schöne an diesen offenen Projekten ist ja gerade, dass man die Wahl hat. Mir fehlen allerdings sowohl Zeit als auch Lust, alle diese Optionen auszuprobieren. Ich freue mich aber über Erfahrungsberichte mit anderen Maps!