Test Driven Development mit php4, 5

joedelord

Aktives Mitglied
Thread Starter
Dabei seit
12.12.2002
Beiträge
492
Reaktionspunkte
0
Hallo liebe Macuser,

Auf grund meiner verwendeten Hardware bin ich im Moment noch(!) an 10.2 und damit auch php4 gebunden. Ein neuerliches Projekt steht ins Haus, und diesmal möchte ich es endlich einmal ordentlich angehen. Am liebsten würde ich PHPUnit verwenden wobei ich von Version 1 irgendwie nicht überzeugt bin und bei Version 2 steht mit php5 im Weg.


Wer hat allgemein Erfahrung und Tips mit TDD und Unit-Tests (zb. PHPUnit) in Verbindung mit php?

Welche Probleme treten auf, oder auf was sollte man achten wenn man nachträglich zum TDD migrieren will?

Kann ich die Tests in der finalen Version am Server irgendwie deaktivieren, oder laufen die immer mit?

Muss auf dem Server auch PHPUnit installiert sein?


tja, wie man sieht habe ich zur Zeit noch recht wenig Ahnung von der Sache, desshalb bitte ich recht sakrisch (österr. ugs.) um eure Hilfe und Unterstützung.

lg, joedelord
 
Warum genau bist Du auf PHP4 beschränkt? Du kannst doch auch PHP5 einsetzen. Das liegt doch normalerweise nicht an der Hardware, welche Version von PHP man einsetzen kann.
 
wahrscheinlich meinte er, dass es keine pakete mit php5 für 10.2 gibt...
und er wohl nicht selber kompilieren kann oder will...
 
gut erkannt. Als ich vor nun mehr als 3 Jahren mein geliebtes ibook gekauft habe, reichte mein Budget leider nur für das kleinste, und das hat NUR ein CD-Laufwerk und der Tiger wird nur auf DVD ausgeliefert.

Abgesehen davon; Hat schon mal jemand die Migration von klassischer Entwicklung vom TDD vollzogen? Müssen dann alle Tests nachträglich für den gesamten Code erstellt werden, oder nur für den neuen, und man arbeitet dann parallel?

recht herzlichen dank, lg,
joedelord
 
Hi,

ich arbeite gerade an einem kleinen Projekt, das ich testdriven in PHP5 mit Unterstützung von PHPUnit2 programmiere. Ich habe dabei allerdings keinen bestehenden Code mit Tests versehen, sondern wirklich konsequent den Zyklus 1. Test schreiben, 2. diesen mit Code möglichst einfach erfüllen, 3. Refactoring, durchgehalten. Dazu kann ich das Buch "Test Driven Development. By Example" von Kent Beck empfehlen.

Zu Arbeiten an ungetestetem Code: bevor du etwas änderst, schreibe Tests für die wichtigsten Funktionalitäten, die der Code haben soll. So kannst Du sicher sein, dass Du nichts wichtiges zerschießt.

Zum deaktivieren von Tests auf dem Server: Ich würde empfehlen, ein eigenes Verzeichnis für die UnitTests anzulegen und diese so vom eigentlichen Code zu trennen. Man kann zwar theoretisch seine Tests direkt zum zu testenden Code im gleichen File schreiben, man handelt sich damit aber die Abhängigkeit zum Testframework ein, d. h. PHPUnit muss dann auf dem Server vorhanden sein. Bei interpretierten Sprachen wie PHP kommt noch hinzu, dass der gesamte Testcode bei jedem Aufruf der Seite mitgeparst wird, was wieder etwas Performance kostet.

Marcel
 
Vielen Dank für die Infos. Das hilft mir um einiges weiter.

Wie hast du die Trennung von Code und Tests umgesetzt. Welche eleganten Lösungen gibt es dafür?

lg, joedelord
 
Ich habe alle Klassen in einem Verzeichnis "include" abgelegt, alle Test im Verzeichnis "tests". Tests zur Klasse include/Abc.inc.php befinden sich in tests/AbcTest.php, und alle Tests sind in tests/AllTests.php zu einer Testsuite zusammengefasst. In den einzelnen Testklassen binde ich die zu testende Klasse per "require_once" ein und jage meine Tests auf sie :)

Die Tests rufe ich über ein kleines Makefile auf. Mit "make AbcTest" wird nur der Test AbcTest aufgerufen, mit "make" die komplette Testsuite aus AllTests. "make report" erstellt eine Code-Coverage-Analyse.

Wenn Du willst kann ich das Makefile posten. Es benutzt allerdings das Shell-Tool von PHPUnit2 für PHP5. Das Verfahren sollte sich aber relativ leicht auf PHPUnit1 übertragen lassen.

Marcel
 
Vielen Dank Marzelpan, über das Makefile würde ich mich natürlich auch freuen.

lg, joedelord
 
Na denn viel Spaß damit:
Code:
PHPUNIT := phpunit
TESTSDIR := tests
REPORTDIR := report

INCLUDEDIR := include
INCLUDES = $(wildcard $(INCLUDEDIR)/*.inc.php)

nakedname = $(basename $(notdir $@))
testphpsource = $(TESTSDIR)/$@.php
testsources = $(wildcard $(TESTSDIR)/*Test.php)

tests = $(basename $(notdir $(testsources)))

test:
        -$(PHPUNIT) AllTests $(TESTSDIR)/AllTests.php

report:
        -$(PHPUNIT) --report $(REPORTDIR) AllTests $(TESTSDIR)/AllTests.php
        open -a Safari $(REPORTDIR)/index.htm

$(tests):
        -$(PHPUNIT) $(nakedname) $(testphpsource)

.PHONY: test $(tests) report
 
Zurück
Oben Unten