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