21. June 2011 17:58

PHP Unit Testing mit SimpleTest

SimpleTest in action

Seit letzter Woche habe ich SimpleTest im Einsatz und bin davon ziemlich begeistert. Das Framework bietet alles was man von einem konventionellen Unit-Testframework her kennt, wie diverse Assertion-Methoden oder Gruppierung von Testfällen zu Testsuiten. Daneben gibt es aber noch eine ganze Reihe von coolen Erweiterungen:

  • Es gibt einige vordefinierte Test-Reports, welche den Erfolg (oder Misserfolg) der Tests anzeigen. Wenn einem diese nicht genügend kann man diese (dank OO) ganz einfach erweitern. So habe ich meinen “persönlichen” Testreporter geschrieben, welcher mir neben den Details zu den Fehlern auch die Details zu den erfolgreichen Tests beschreibt (dazu muss man nur die Methode paintPass() überschreiben), das Resultat ist in obigem Bild ersichtlich.
  • Man kann auch sogenannte Web-Tests machen, d.h. man kann das Browserverhalten simulieren und so beispielweise automatisiert ein Formular ausfüllen und abschicken lassen, anschliessend dann das Ergebnis prüfen.
  • Das erzeugen von Mock-Objekten ist kinderleicht, das Framework bietet eine einfache Methode um eine “leere” Hülle eines Objekts zu generieren (z.B. einer Datenbankverbindung)

Das Tutorial führt einem durch die ersten Schritte, die API gibt den vollständigen Überblick. Durch die verschiedenen Reporter kann das gleiche Skript auch gebraucht werden um in einem automatisierten Build zu laufen, so wie man es z.B. von JUnit kennt.

Ich habe momentan alle meine Testfiles in einem Verzeichnis und habe mir deshalb ein simples Skript geschrieben, welche alle Tests ausführt:

[Pastie-Link]

Um jedes einzelne File jedoch immer noch separat ausführen zu können, include ich autorun.php nur genau dann, wenn ich das File direkt anspreche:

if (count(get_included_files()) == 1)
{
    require_once("includes/simpletest/autorun.php");
}

Ich kann das Framework also nur empfehlen!


Tags:  PHP  Unit Testing  Programming 
Comments
3. November 2010 07:43

Developers Shame Day: BB-Code selbstgemacht

Developers Shame Day

Via Twitter (weiss leider nicht mehr wer das geschrieben hat) bin ich auf einen Artikel vom php hacker gestossen, wo er dazu aufruft heute am “Developers Shame Day” mitzumachen und alte Codeschnippsel von sich zu posten: Beispiele von schlechtem Code für die man sich heute schämen sollte.

Einserseits um zu zeigen, dass jeder mal angefangen hat schlechten Code zu schreiben und allgemein sich einzugestehen, dass Fehler nun mal passieren und man selbst und vielleicht sogar andere davon profititieren können. Da mach ich gerne mit.

Das Stück Code das ich vorstellen möchte ist PHP-Code, welcher auf einer meiner alten Pages gelaufen ist. Jeder kennt ja die BB-Codes um Artikel oder Kommentare mit Formattierungsinformationen anzureichern. Ich habe meinen eigenen “Parser” dafür geschrieben, welcher die Codes in entsprechendes HTML umgewandelt hat.
Hier ein Auszug:
[Pastie-Link]

Die Idee dahinter war einfach, es gibt 2 Arten von Codes:

  • ohne Parameter wie z.B. Bold, also [b]fetter Text[/b]
  • mit Parametern wie z.B. URL, also [url=http://www.readmore.ch]Meine Webpage[/url]

Die parametrierbaren Codes erhielten im Anfangsarray den Text “!!REPLACER!!” welche dann anschliessend ersetzt wurde. Das mag ja alles noch gehen, wenn auch sich solche ein Parser mit Regular Expression um einiges schöner schreiben liess.

Wirklich stolz bin ich auf Zuweisungen à la “s” => “<s>”, “h1” => “<h1>”, wo sich mir heute die Nackenhaare aufstellen. Typisch war auch die schlechte Namensgebung der Variablen (anz oder sub/newsub) sowie die auskommentierten Stellen (“man weiss nie für was das mal noch gut sein kann”).


Comments
21. October 2009 16:27

ODBC Hell

It is so easy: I have a testing environement where an OCI8-Driver is installed. Therefore I can use the OCI-Function if PHP to Bind Variables, get return values and everything is just fine.

Then on the production I needed to switch to ODBC, and thought: Easy just write this stuff for ODBC and you’re done.

Unfortunately the driver does simply not support return values of functions. The problem is, that there are updates in my function, so I can’t solve the problem using:

select function_name(param1,param2,param3,...) from dual

After giving up my return value, I wanted to run the function like that (in TOAD this is no problem):

begin :retval := function_name(?,?,?,?); end;

Afterwards you are giving an array of parameter to the PHP function odbc_execute, and this should work alright.

I tried hundrets of possibilities to run my function. Finally I gave up, made a procdure (which has no return value and vor sure ODBC has no support for OUT or INOUT-Vars). I resigned to have a return value (which should only be the number of updated rows).

I tried: begin procedure_name(?,?,?,?); end;

There was no reaction. My last try:

call procedure_name(param1,param2,param3,..);

This woked! So I need to use “call” and not using the parameter-array of ODBC but giving it directly into the call. I’m happy to get it working, but this costs me one day.

Is there any really working ODBC-Driver for PHP?

I gave up.

PS: Yes I know, there is a solution for my return value. In my procedure I could write the value into a temporary table. But I rather want to use a good driver (like the OCI8) than using such a temporary solution. I’m open to new ways of doing this.


Tags:  Oracle  PHP  PL/SQL  SQL  Programming 
Comments