PHPUnit mit Netbeans unter Cygwin

Eine kleine Anleitung und ein paar Scripts um die in Netbeans integrierte PHPUnit-GUI unter Cygwin zum Laufen zu bekommen.

Software:

  • Windows 7
  • Cygwin
  • NetBeans 7.3.1
  • PHP 5.4.11
  • PHPUnit 3.7.21

Ich gehe davon aus, dass Windows, Cygwin (c:\cygwin) und NetBeans bereits installiert sind.

PHP ist momentan nicht im Haupt-Repository von Cygwin enthalten. Es lässt sich aber leicht über apt-cyg installieren.
Wurde apt-cyg installiert (siehe Projekt-Seite für eine Anleitung), kann es verwendet werden um über Cygwinports PHP zu installieren.

apt-cyg -m ftp://ftp.cygwinports.org/pub/cygwinports/ install php

Cygwinports bietet auch eine Reihe von PHP-Erweiterungen an. Hier gibt es eine Liste aller verfügbaren Pakete.

Jetzt sollte der Befehl php auf der Shell verfügbar sein.

Kleine Anmerkung zwischendurch: Ich verwende PHP unter Cygwin übrigens auch im Apache, der auch über Cygwin installiert wurde, und setze nicht mehr auf Distributionen wie XAMPP und co.

Als nächstes installieren wir PHPUnit als PHAR-Datei:

mkdir /usr/share/phpunit
cd /usr/share/phpunit
wget http://pear.phpunit.de/get/phpunit.phar
chmod +x phpunit.phar

# Optional, aber praktisch
ln -s /usr/share/phpunit/phpunit.phar /usr/bin/phpunit

Wurde der letzte optionale Befehl ausgeführt, könnte man seine PHPUnit-Testcases schon jetzt auf der Shell mit dem Befehl phpunit ausführen.

Da wir aber die GUI von NetBeans verwenden wollen, müssen ein paar Dinge beachtet und ein Problem umgangen werden.

Zunächst müssen wir für NetBeans, das ja unter Windows läuft, eine bat-Datei unter /usr/share/phpunit/phpunit.bat anlegen:

@echo off
c:\cygwin\bin\php.exe /usr/share/phpunit/phpunit_cygwin %*

Nicht vergessen, die Datei als ausführbar zu setzen:

chmod +x /usr/share/phpunit/phpunit.bat

Wie zu sehen ist rufen wir über PHP eine Script-Datei phpunit_cygwin auf. Diese Datei ist entscheidend. Sie dient als Wrapper um die Pfadangaben zwischen Windows (NetBeans) und Linux (Cygwin) zu konvertieren.

Die Datei /usr/share/phpunit/phpunit_cygwin enthält folgenden Inhalt:

#!/usr/bin/php
<?php

array_shift($argv);

array_walk($argv, function(&$a){

    if(!preg_match('/(.*)([a-z]:\\\\.+)/i', $a, $matches)){
        return;
    }

    $a = $matches[1].'"'.exec('/usr/bin/cygpath -a "'.$matches[2].'"').'"';

});

$args = implode(' ', $argv);

system('/usr/bin/php /usr/share/phpunit/phpunit.phar '.$args);

Es bietet sich an auch diese Datei ausführbar zu setzen:

chmod +x /usr/share/phpunit/phpunit_cygwin

Was passiert hier? NetBeans arbeitet und kennt unter Windows nur das DOS-/Windows-Pfadformat. Da PHP und damit auch PHPUnit unter Cygwin (Linux) ausgeführt werden, müssen die Pfade in ihr entsprechendes Cygwin-Gegenstück konvertiert werden.

Hierzu liefert Cygwin bereits ein Tool namens cygpath mit.
Mein PHP-Script kümmert sich darum, dass jeder übergebene Parameter in das UNIX-Pfadformat konvertiert wird, falls der Parameter auch wirklich einen Windows-Pfad enthält.

Danach wird PHPUnit mit den korrigierten Parametern aufgerufen.

Abschließend müssen wir noch NetBeans einrichten:

PHPUnit-Konfiguration unter NetBeans

Das Ergebnis zeigen folgende Screenshots:

Test-Ergebnis

Ausgabe von PHPUnit

Code completion für jQuery in NetBeans 7.1

Tach,

NetBeans rühmt sich ja schon lange damit, dass sie code completion für JavaScript Dateien und Libraries haben. Unter anderem auch für jQuery. In der Doku findet man dazu sogar einen recht ausführlichen Artikel.

Leider hat das bei mir nie funktioniert und ich konnte auch nach ausführlichem googlen nichts finden, was mir half.

Heute bin ich aber endlich auf die Lösung gestoßen:

Man darf die Datei nicht umbenennen!

Ich hatte meine Datei immer in jquery.js umbenannt. Damit klappts aber nicht.
Die Datei muss, z.B. für die aktuellste Version 1.7.1, jquery-1.7.1.js heißen!

Im Moment bin ich mir noch nicht sicher, warum das so ist und ob das Absicht ist oder ob es sich um einen Bug handelt. Allerdings könnte ich mir vorstellen, dass es mit der Doku zusammenhängt, die neben der code completion angezeigt wird. Diese Doku muss aus dem Netz gezogen werden, da sie nicht in der JavaScript Datei enthalten ist.

Klappt übrigens auch perfekt mit der komprimierten Version jquery-1.7.1.min.js.

Begeistert bin ich davon allerdings nicht. Ich würde meine Dateien eigentlich gerne so benennen, wie ich es will.