Mach dich bereit für TDD Katas mit PHPUnit + PhpStorm

Bist du ein PHP Entwickler der gerne mit Unit Testing anfangen würde? Willst du meinen wöchtentlichen TDD Kata Posts folgen, weißt aber nicht, wie du anfangen sollst? Hier ist eine Schritt für Schritt Anleitung, bis zum ersten Test.

Lies den ersten Kata Beitrag um herauszufinden, worum es hier geht.

Voraussetzungen

  • PhpStorm IDE
  • Lokale PHP installation (am besten PHP 7)

Kata Projekt erstellen

  1. Erstelle ein neues Projekt vom Typ “PHP Empty Project”

  2. Öffne das Menü Tools > Composer > Init Composer… und gib dem Pfad zu PHP und Composer ein. Wenn du Composer noch nicht installiert hast, kann PhpStorm es für dich direkt hier herunterladen.

  3. Eine neue Datei composer.json öffnet sich. Ändere die Projekt-Details wenn du möchtest, und füge eine “autoload” Sektion hinzu:
    {
      "name": "my/katas",
      "description": "My TDD Katas",
      "minimum-stability": "stable",
      "license": "proprietary",
      "authors": [
        {
          "name": "me",
          "email": "me@example.com"
        }
      ],
      "autoload": {
        "psr-4": {
          "Katas\\": ["src", "tests"]
        }
      }
    }
    
  4. Öffne das Menü Tools > Composer > Add dependency…. Gib phpunit/phpunit ein und wähle die neueste non-dev Version:

  5. Klicke “Install”, Composer wird nun PHPUnit installieren. Das kann ein paar Minuten dauern. Wenn die Installation abgeschlossen ist, klicke “Close”

Dein erster Test

Wir fangen mit der Bowling Game Kata an:

  1. Erstelle eine Datei tests/Bowling/GameTest.php wie folgt:
    <?php
    namespace Katas\Bowling;
    class GameTest extends \PHPUnit_Framework_TestCase
    {
        public function testTest()
        {
            $this->fail('Hello!');
        }
    }
  2. Der erste Test, den ich in einem neuen Projekt erstelle ist immer einer, der testet, ob das Test Framework selbst richtig läuft. Versuchen wir, diesen Test auszuführen, so dass wir die “Hello!” Fehlermeldung sehen. Rechtsklick auf dem Test in der Projektansicht und wähle “Run ‘GameTest'”

  3. Es ist das erste Mal, dass wir einen PHPUnit Test in diesem Projekt ausführen, daher müssen wir die Umgebung noch etwas konfigurieren. Klicke “Fix” und wähle dass PHPUnit vom Composer autoloader geladen werden soll (vendor/autoload.php im Projekt). Das ermöglicht uns auch, unseren eigenen Source Code zu nutzen ohne explizite include Befehle oder einen eigenen Autoloader.

  4. Nun klicke “Run”. Du solltest folgendes sehen:

  5. Lassen wir den Test passieren:
    <?php
    namespace Katas\Bowling;
    class GameTest extends \PHPUnit_Framework_TestCase
    {
        public function testTest()
        {
            $this->assertTrue(true);
        }
    }

    Jetzt wo wir bereits konfiguriert haben, wie er auszuführen ist, gibt es oben rechts einen “Run” Button. Klicke darauf:

    Dies ist das Ergebnis:

  6. OK, wir haben einen fehlgeschlagenen und einen erfolgreichen Test gesehen, haben aber noch nichts wirklich getestet. Das nächste was wir testen, ist ob wir unsere Game Klasse instantiieren können (wir brauchen die testTest Methode nicht mehr, lösche sie).
    <?php
    namespace Katas\Bowling;
    class GameTest extends \PHPUnit_Framework_TestCase
    {
        public function testGameCanBeInstantiated()
        {
            $game = new Game();
            $this->assertInstanceOf(Game::class, $game);
        }
    }
  7. Dieser Test gibt einen Fehler aus (klar, die Klasse Game existiert noch gar nicht):

  8. Erstelle die Datei src/Bowling/Game.php wie folgt:
    <?php
    namespace Katas\Bowling;
    class Game
    {
    }
    
  9. Führe den Test erneut aus, er sollte erfolgreich durchlaufen. Wenn nicht, prüfe die autoload Einstellungen in composer.json. Nach Änderungen daran muss der Composer Autoloader aktualisiert werden, mittels composer dump-autoload auf der Kommandozeile:

    Falls der Befehl “composer” nicht gefunden wird, gib stattdessen den vollen Pfad zu composer.phar ein.

Gratuliere, du bist nun bereit, deinen ersten echten Test zu schreiben!

<?php
namespace Katas\Bowling;
class GameTest extends \PHPUnit_Framework_TestCase
{
    public function testGutterGame()
    {
        $game = new Game();
        for ($i = 0;  $i < 20; ++$i) {
            $game->roll(0);
        }
        $this->assertEquals(0, $game->score());
    }
}

Von hier an sollte es möglich sein, den Schritten im Bowling Game PowerPoint zu folgen. Der Java Code darin kann sehr ähnlich auch in PHP geschrieben werden.