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.
Voraussetzungen
- PhpStorm IDE
- Lokale PHP installation (am besten PHP 7)
Kata Projekt erstellen
- Erstelle ein neues Projekt vom Typ “PHP Empty Project”
- Ö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.
- 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"] } } }
- Öffne das Menü Tools > Composer > Add dependency…. Gib
phpunit/phpunit
ein und wähle die neueste non-dev Version:
- 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:
- 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!'); } }
- 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'”
- 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 expliziteinclude
Befehle oder einen eigenen Autoloader.
- Nun klicke “Run”. Du solltest folgendes sehen:
- 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:
- 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 dietestTest
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); } }
- Dieser Test gibt einen Fehler aus (klar, die Klasse
Game
existiert noch gar nicht):
- Erstelle die Datei
src/Bowling/Game.php
wie folgt:<?php namespace Katas\Bowling; class Game { }
- 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, mittelscomposer dump-autoload
auf der Kommandozeile:
Falls der Befehl “composer” nicht gefunden wird, gib stattdessen den vollen Pfad zucomposer.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.