<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>
<channel>
	<title>Kommentare zu: PHPUnit - Wo soll man anfangen</title>
	<atom:link href="http://www.phpblogger.net/2008/12/05/phpunit-wo-soll-man-anfangen/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.phpblogger.net/2008/12/05/phpunit-wo-soll-man-anfangen/</link>
	<description>Ein PHP Blog mit aktuellen PHP Informationen und Tricks für Entwickler.</description>
	<pubDate>Thu, 09 Feb 2012 11:41:30 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.5</generator>
		<item>
		<title>Von: Motoröl</title>
		<link>http://www.phpblogger.net/2008/12/05/phpunit-wo-soll-man-anfangen/#comment-1485</link>
		<dc:creator>Motoröl</dc:creator>
		<pubDate>Tue, 23 Dec 2008 22:18:25 +0000</pubDate>
		<guid isPermaLink="false">http://www.phpblogger.net/?p=461#comment-1485</guid>
		<description>Super Beitrag zum Jahresende! Frohe Weihnachten und nen guten Rutsch in 2009</description>
		<content:encoded><![CDATA[<p>Super Beitrag zum Jahresende! Frohe Weihnachten und nen guten Rutsch in 2009</p>
]]></content:encoded>
	</item>
	<item>
		<title>Von: Lars Schultz</title>
		<link>http://www.phpblogger.net/2008/12/05/phpunit-wo-soll-man-anfangen/#comment-1450</link>
		<dc:creator>Lars Schultz</dc:creator>
		<pubDate>Fri, 12 Dec 2008 08:03:51 +0000</pubDate>
		<guid isPermaLink="false">http://www.phpblogger.net/?p=461#comment-1450</guid>
		<description>Hallo Phil,

@off topic
deine _logCall Funktion hat mich an meine debugCall() Funktion erinnert, die &#228;hnliches Bewirkt wie deine, aber etwas komfortabler zu nutzen ist;)

[Code]
function debugCall($msg){
	$trace = debug_backtrace();
	array_pop($trace); //skip debugCall() call
	$call = array_pop($trace); //this is the context where debugCall() was called
 
	echo ''. $call['class'] .'::'.$call['function'] .'('.$call['line'].'): '. $msg;
}
 
debugCall('lars war hier');
[/Code]

Nat&#252;rlich hab ich mir dazu nicht nur diese Funktion geschrieben, sondern gleich ein ganzes Set von Debugging-Funktionen gemacht...unter anderem stacktrace()...welches einen HTML-Freundlichen, gehighlighteten Output liefert, oder writeDebugCall() welches einen Aufruf in ein Logfile schreibt. Falls du Interesse hast, kann ich irgendwo ein Link auf meine Debug-Source ver&#246;ffentlichen:)

@TDD
Du hast 50 Klassen ohne Tests?;) Ich hab 600! Versuch das Mal hinterher zu &#228;ndern. Das Problem mit der DB kenn ich und ist f&#252;r mich auch eher schwierig zu umgehen, da meine Daten sehr komplex aufgebaut sind. Mein Ansatz dazu war: ich schreibe Tests f&#252;r die Dinge (zur Zeit noch ohne PHPUnit oder einem sonstigen Framework, die mag ich nich so...;) ), die sich als Bug-Anf&#228;llig erweisen, um dann nach &#196;nderungen, deren Funktionalit&#228;t bzw. ge&#228;nderte Funktionalit&#228;t nachvollziehen zu k&#246;nnen.

Was ich mir f&#252;r die Zukunft &#252;berlegt habe ist eine Art Test, der die Daten Schritt f&#252;r Schritt aufbaut, und jeweils die Daten &#252;berpr&#252;ft. Dazu k&#246;nnten nach jedem als Erfolgreich erachteten Schritt snapshots einer DB gemacht werden, um diese Dann zu vergleichen. SEHR AUFW&#196;NDIG!;) Mal sehen...vielleicht kann ich mich doch noch mit PHPUnit oder sowas anfreunden.

Sonst hat mir das Konzept "http://en.wikipedia.org/wiki/Separation_of_concerns" am meisten gebracht was die Test und Debugf&#228;higkeit meines Codes anbelangt.</description>
		<content:encoded><![CDATA[<p>Hallo Phil,</p>
<p>@off topic<br />
deine _logCall Funktion hat mich an meine debugCall() Funktion erinnert, die &#228;hnliches Bewirkt wie deine, aber etwas komfortabler zu nutzen ist;)</p>
<p>[Code]<br />
function debugCall($msg){<br />
	$trace = debug_backtrace();<br />
	array_pop($trace); //skip debugCall() call<br />
	$call = array_pop($trace); //this is the context where debugCall() was called</p>
<p>	echo &#8221;. $call['class'] .&#8217;::&#8217;.$call['function'] .&#8217;(&#8217;.$call['line'].&#8217;): &#8216;. $msg;<br />
}</p>
<p>debugCall(&#8217;lars war hier&#8217;);<br />
[/Code]</p>
<p>Nat&#252;rlich hab ich mir dazu nicht nur diese Funktion geschrieben, sondern gleich ein ganzes Set von Debugging-Funktionen gemacht&#8230;unter anderem stacktrace()&#8230;welches einen HTML-Freundlichen, gehighlighteten Output liefert, oder writeDebugCall() welches einen Aufruf in ein Logfile schreibt. Falls du Interesse hast, kann ich irgendwo ein Link auf meine Debug-Source ver&#246;ffentlichen:)</p>
<p>@TDD<br />
Du hast 50 Klassen ohne Tests?;) Ich hab 600! Versuch das Mal hinterher zu &#228;ndern. Das Problem mit der DB kenn ich und ist f&#252;r mich auch eher schwierig zu umgehen, da meine Daten sehr komplex aufgebaut sind. Mein Ansatz dazu war: ich schreibe Tests f&#252;r die Dinge (zur Zeit noch ohne PHPUnit oder einem sonstigen Framework, die mag ich nich so&#8230;;) ), die sich als Bug-Anf&#228;llig erweisen, um dann nach &#196;nderungen, deren Funktionalit&#228;t bzw. ge&#228;nderte Funktionalit&#228;t nachvollziehen zu k&#246;nnen.</p>
<p>Was ich mir f&#252;r die Zukunft &#252;berlegt habe ist eine Art Test, der die Daten Schritt f&#252;r Schritt aufbaut, und jeweils die Daten &#252;berpr&#252;ft. Dazu k&#246;nnten nach jedem als Erfolgreich erachteten Schritt snapshots einer DB gemacht werden, um diese Dann zu vergleichen. SEHR AUFW&#196;NDIG!;) Mal sehen&#8230;vielleicht kann ich mich doch noch mit PHPUnit oder sowas anfreunden.</p>
<p>Sonst hat mir das Konzept &#8220;http://en.wikipedia.org/wiki/Separation_of_concerns&#8221; am meisten gebracht was die Test und Debugf&#228;higkeit meines Codes anbelangt.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Von: phil</title>
		<link>http://www.phpblogger.net/2008/12/05/phpunit-wo-soll-man-anfangen/#comment-1445</link>
		<dc:creator>phil</dc:creator>
		<pubDate>Tue, 09 Dec 2008 16:53:30 +0000</pubDate>
		<guid isPermaLink="false">http://www.phpblogger.net/?p=461#comment-1445</guid>
		<description>@Dirk:
Da komme ich urspr&#252;nglich aus der N&#228;he her, bin aber im Augenblick eher 8000km davon entfernt :)

Bei mir sind die Methoden protected, das hat nichts mit ableiten zu tun, sondern mit Interface-Design. Ich m&#246;chte nicht, dass bestimmte Funktionen von anderen Objekten aufgerufen werden k&#246;nnen. Vielleicht sind das auch im weitesten Sinne Helfer-Klassen, aber dann ist das Testen schon wieder &#252;ber die von Wolfgang ebenfalls festgestellten Abh&#228;ngigkeiten verteilt.

Bsp: Meine Datenbankabstraktion. Ich habe ein Singletonobjekt, welches die DB Connection herstellt und entprechend die Queries ausf&#252;hrt. Diese hat (ungef&#228;hr) folgende public functions: 
- runSelect
- runInsert
- runUpdate
- ...

Da ich aber gerne eine Abstraktion einf&#252;hren wollte und nicht direkt das SQL in meine Logik schreiben wollte (vielleicht m&#252;sste man f&#252;r eine andere DB ja etwas ein bisschen anders machen, z.b. hei&#223;t LIMIT nicht mehr LIMIT sondern RANGE)
wird eine query in der Form
array('type' =&gt; 'SELECT', 'table' =&gt; 'myTable', 'cols' =&gt; array('a','b')); 
&#252;bergeben. Daraus baut dann meine Datenbankklasse 
SELECT `a`, `b` FROM `myTable`
soweit so gut. Aber am liebsten w&#252;rde ich ja die Funktion 'buildCols' direkt testen, weil die ist die, welche einen Input und einen Returnwert bekommt. Nur ich m&#246;chte eben nicht, dass irgendwer diese Funktion aufruft -&gt; protected definiert... Damit kann aber auch der Unittest die Funktion  nicht mehr aufrufen. Daher m&#252;sste ich die 'runSelect' Methode testen und dann kommen wieder die dicken Abh&#228;ngkeiten mit DB Abfrage wird ausgef&#252;hrt etc. zustande...

@Wolfgang
Genau das ist mein Problem mit dem ich mich gerade auseinandersetze. Es ist also nicht nur bei dir so. Die Ansicht der Tester zu dem Thema ist, dass dein Applikationsdesign deshalb nicht gut ist. Stattdessen w&#252;rde man erwarten, dass man jede Menge Funktionen hat, die eben nur was zur&#252;ckgeben und nicht den Zustand eines Objektes &#228;ndern...

Oder anderes Beispiel:
Ich habe eine Methode:
	public function setIniVal($p_name, $p_value) {
		
		if(!is_string($p_name) or empty($p_name)) return false;
		
		if (strstr($p_name, '[]')) {
			$p_name = str_replace('[]', '', $p_name);
			$this-&gt;ini[$p_name][] = $p_value;
		}
		else {
			$this-&gt;ini[$p_name] = $p_value;
		}		
		
		return true;
		
	}

Mit der ich auf zwei Art und Weisen einen Wert setzen kann, der von verschiedenen Klassen abgefragt wird und den Grundzustand meiner Applikation festlegt (Bsp. welches ist die gerade aufgerufene Seite, was ich nicht jedes Mal neu 'berechnen' lassen m&#246;chte, sondern einmal festlege und dann nur die Value abfrage. Der Parameter 'ini' ist ebenfalls als protected definiert. Nur f&#252;r sich gesehen kann ich an der Methode nur testen, ob ich "true" oder "false" als R&#252;ckgabewert bekomme. Und selbst wenn ich die "getIniVal" Methode nehme, um zu testen, ob der richtige Wert gesetzt wurde, kann ich nicht, wie in dem tollen Array Bsp. auf der phpunit-Seite testen, ob ich wirklich nur einen einzelnen Wert gesetzt habe. Muss ich das dann nicht testen, weil meine Anforderung an die Methode einfach nur ist: Setze einen Wert auf eine bestimmte Art und Weise und die Anforderung an die get Methode ist: Liefere mir einen Wert zu einem Schl&#252;ssel? Sind das dann die einzigen Testf&#228;lle, die ihr dazu bauen w&#252;rdet?!</description>
		<content:encoded><![CDATA[<p>@Dirk:<br />
Da komme ich urspr&#252;nglich aus der N&#228;he her, bin aber im Augenblick eher 8000km davon entfernt :)</p>
<p>Bei mir sind die Methoden protected, das hat nichts mit ableiten zu tun, sondern mit Interface-Design. Ich m&#246;chte nicht, dass bestimmte Funktionen von anderen Objekten aufgerufen werden k&#246;nnen. Vielleicht sind das auch im weitesten Sinne Helfer-Klassen, aber dann ist das Testen schon wieder &#252;ber die von Wolfgang ebenfalls festgestellten Abh&#228;ngigkeiten verteilt.</p>
<p>Bsp: Meine Datenbankabstraktion. Ich habe ein Singletonobjekt, welches die DB Connection herstellt und entprechend die Queries ausf&#252;hrt. Diese hat (ungef&#228;hr) folgende public functions:<br />
- runSelect<br />
- runInsert<br />
- runUpdate<br />
- &#8230;</p>
<p>Da ich aber gerne eine Abstraktion einf&#252;hren wollte und nicht direkt das SQL in meine Logik schreiben wollte (vielleicht m&#252;sste man f&#252;r eine andere DB ja etwas ein bisschen anders machen, z.b. hei&#223;t LIMIT nicht mehr LIMIT sondern RANGE)<br />
wird eine query in der Form<br />
array(&#8217;type&#8217; => &#8216;SELECT&#8217;, &#8216;table&#8217; => &#8216;myTable&#8217;, &#8216;cols&#8217; => array(&#8217;a',&#8217;b'));<br />
&#252;bergeben. Daraus baut dann meine Datenbankklasse<br />
SELECT `a`, `b` FROM `myTable`<br />
soweit so gut. Aber am liebsten w&#252;rde ich ja die Funktion &#8216;buildCols&#8217; direkt testen, weil die ist die, welche einen Input und einen Returnwert bekommt. Nur ich m&#246;chte eben nicht, dass irgendwer diese Funktion aufruft -> protected definiert&#8230; Damit kann aber auch der Unittest die Funktion  nicht mehr aufrufen. Daher m&#252;sste ich die &#8216;runSelect&#8217; Methode testen und dann kommen wieder die dicken Abh&#228;ngkeiten mit DB Abfrage wird ausgef&#252;hrt etc. zustande&#8230;</p>
<p>@Wolfgang<br />
Genau das ist mein Problem mit dem ich mich gerade auseinandersetze. Es ist also nicht nur bei dir so. Die Ansicht der Tester zu dem Thema ist, dass dein Applikationsdesign deshalb nicht gut ist. Stattdessen w&#252;rde man erwarten, dass man jede Menge Funktionen hat, die eben nur was zur&#252;ckgeben und nicht den Zustand eines Objektes &#228;ndern&#8230;</p>
<p>Oder anderes Beispiel:<br />
Ich habe eine Methode:<br />
	public function setIniVal($p_name, $p_value) {</p>
<p>		if(!is_string($p_name) or empty($p_name)) return false;</p>
<p>		if (strstr($p_name, &#8216;[]&#8216;)) {<br />
			$p_name = str_replace(&#8217;[]&#8216;, &#8221;, $p_name);<br />
			$this->ini[$p_name][] = $p_value;<br />
		}<br />
		else {<br />
			$this->ini[$p_name] = $p_value;<br />
		}		</p>
<p>		return true;</p>
<p>	}</p>
<p>Mit der ich auf zwei Art und Weisen einen Wert setzen kann, der von verschiedenen Klassen abgefragt wird und den Grundzustand meiner Applikation festlegt (Bsp. welches ist die gerade aufgerufene Seite, was ich nicht jedes Mal neu &#8216;berechnen&#8217; lassen m&#246;chte, sondern einmal festlege und dann nur die Value abfrage. Der Parameter &#8216;ini&#8217; ist ebenfalls als protected definiert. Nur f&#252;r sich gesehen kann ich an der Methode nur testen, ob ich &#8220;true&#8221; oder &#8220;false&#8221; als R&#252;ckgabewert bekomme. Und selbst wenn ich die &#8220;getIniVal&#8221; Methode nehme, um zu testen, ob der richtige Wert gesetzt wurde, kann ich nicht, wie in dem tollen Array Bsp. auf der phpunit-Seite testen, ob ich wirklich nur einen einzelnen Wert gesetzt habe. Muss ich das dann nicht testen, weil meine Anforderung an die Methode einfach nur ist: Setze einen Wert auf eine bestimmte Art und Weise und die Anforderung an die get Methode ist: Liefere mir einen Wert zu einem Schl&#252;ssel? Sind das dann die einzigen Testf&#228;lle, die ihr dazu bauen w&#252;rdet?!</p>
]]></content:encoded>
	</item>
	<item>
		<title>Von: Wolfgang Stengel</title>
		<link>http://www.phpblogger.net/2008/12/05/phpunit-wo-soll-man-anfangen/#comment-1444</link>
		<dc:creator>Wolfgang Stengel</dc:creator>
		<pubDate>Tue, 09 Dec 2008 14:39:53 +0000</pubDate>
		<guid isPermaLink="false">http://www.phpblogger.net/?p=461#comment-1444</guid>
		<description>Was schon immer mein Problem bei Unit Testing war sind Funktionen die Abh&#228;ngigkeiten haben, weil sie z.B. etwas an der Datenbank &#228;ndern, oder auf die Session zugreifen. Der R&#252;ckgabewert h&#228;ngt also nicht nur von den Eingabeparametern ab. Viele Funktionen haben auch garkeinen R&#252;ckgabewert, weil sie nur etwas "machen", und nicht etwas "bereitstellen". Ist das nur bei mir so oder trifft das immer auf die meisten Funktionen zu?</description>
		<content:encoded><![CDATA[<p>Was schon immer mein Problem bei Unit Testing war sind Funktionen die Abh&#228;ngigkeiten haben, weil sie z.B. etwas an der Datenbank &#228;ndern, oder auf die Session zugreifen. Der R&#252;ckgabewert h&#228;ngt also nicht nur von den Eingabeparametern ab. Viele Funktionen haben auch garkeinen R&#252;ckgabewert, weil sie nur etwas &#8220;machen&#8221;, und nicht etwas &#8220;bereitstellen&#8221;. Ist das nur bei mir so oder trifft das immer auf die meisten Funktionen zu?</p>
]]></content:encoded>
	</item>
	<item>
		<title>Von: Dirk</title>
		<link>http://www.phpblogger.net/2008/12/05/phpunit-wo-soll-man-anfangen/#comment-1443</link>
		<dc:creator>Dirk</dc:creator>
		<pubDate>Tue, 09 Dec 2008 09:50:46 +0000</pubDate>
		<guid isPermaLink="false">http://www.phpblogger.net/?p=461#comment-1443</guid>
		<description>Warte mal - sehe ich das im Impressum richtig, dass du aus Darmstadt kommst? Wenn du Zeit und Lust hast k&#246;nnen wir uns gerne mal auf einen Kaffee zusammen setzen.</description>
		<content:encoded><![CDATA[<p>Warte mal - sehe ich das im Impressum richtig, dass du aus Darmstadt kommst? Wenn du Zeit und Lust hast k&#246;nnen wir uns gerne mal auf einen Kaffee zusammen setzen.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Von: Dirk</title>
		<link>http://www.phpblogger.net/2008/12/05/phpunit-wo-soll-man-anfangen/#comment-1442</link>
		<dc:creator>Dirk</dc:creator>
		<pubDate>Tue, 09 Dec 2008 09:36:22 +0000</pubDate>
		<guid isPermaLink="false">http://www.phpblogger.net/?p=461#comment-1442</guid>
		<description>Hm.

Mein Klassen-Design hat nicht viele Klassen, deren Methoden ausschlie&#223;lich Private bzw. Protected sind. Der einzige Nutzen f&#252;r so Klassen w&#228;re nat&#252;rlich sie durch andere abzuleiten und dann kann ich wiederum diese testen.

Sprich: irgendwo ist immer die innerste Klasse, die anf&#228;ngt zu arbeiten. Alles andere sind Helper-Klassen, welche die Grundlage f&#252;r die Worker-Klassen bilden. 

Nach meiner Interpretation von Unit Testing brauche ich Helper-Klassen nicht zu testen. Ich teste nur gegen Anforderungen und es gibt keine Anforderungen f&#252;r Helper-Klassen, wenn ich keinen Call darauf machen kann. Wenn sie Worker-Klassen unterst&#252;tzen sind sie f&#252;r mich nur eine Verl&#228;ngerung der Worker-Klasse und m&#252;ssen als Gesamtes den Test erf&#252;llen.

Etwas hergeholt, funktioniert in meinem Design aber ganz gut. Wie gesagt versuche ich reine Helper-Klassen weitestgehend zu vermeiden.</description>
		<content:encoded><![CDATA[<p>Hm.</p>
<p>Mein Klassen-Design hat nicht viele Klassen, deren Methoden ausschlie&#223;lich Private bzw. Protected sind. Der einzige Nutzen f&#252;r so Klassen w&#228;re nat&#252;rlich sie durch andere abzuleiten und dann kann ich wiederum diese testen.</p>
<p>Sprich: irgendwo ist immer die innerste Klasse, die anf&#228;ngt zu arbeiten. Alles andere sind Helper-Klassen, welche die Grundlage f&#252;r die Worker-Klassen bilden. </p>
<p>Nach meiner Interpretation von Unit Testing brauche ich Helper-Klassen nicht zu testen. Ich teste nur gegen Anforderungen und es gibt keine Anforderungen f&#252;r Helper-Klassen, wenn ich keinen Call darauf machen kann. Wenn sie Worker-Klassen unterst&#252;tzen sind sie f&#252;r mich nur eine Verl&#228;ngerung der Worker-Klasse und m&#252;ssen als Gesamtes den Test erf&#252;llen.</p>
<p>Etwas hergeholt, funktioniert in meinem Design aber ganz gut. Wie gesagt versuche ich reine Helper-Klassen weitestgehend zu vermeiden.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Von: phil</title>
		<link>http://www.phpblogger.net/2008/12/05/phpunit-wo-soll-man-anfangen/#comment-1438</link>
		<dc:creator>phil</dc:creator>
		<pubDate>Mon, 08 Dec 2008 05:57:11 +0000</pubDate>
		<guid isPermaLink="false">http://www.phpblogger.net/?p=461#comment-1438</guid>
		<description>Hey Dirk,

das ist schon richtig. Aber die innersten Bausteine meine Applikation sind alle "protected" oder "private"?! F&#228;llt dir da irgendwas auf?! Im Bezug auf Unit-Testing...

Das ist &#252;brigens gleich die erste H&#252;rde, die ich gefunden habe, als ich anfangen wollte meine "Bausteine" zu suchen...

Viele Gr&#252;&#223;e, der noch nicht aufgebende
Philipp</description>
		<content:encoded><![CDATA[<p>Hey Dirk,</p>
<p>das ist schon richtig. Aber die innersten Bausteine meine Applikation sind alle &#8220;protected&#8221; oder &#8220;private&#8221;?! F&#228;llt dir da irgendwas auf?! Im Bezug auf Unit-Testing&#8230;</p>
<p>Das ist &#252;brigens gleich die erste H&#252;rde, die ich gefunden habe, als ich anfangen wollte meine &#8220;Bausteine&#8221; zu suchen&#8230;</p>
<p>Viele Gr&#252;&#223;e, der noch nicht aufgebende<br />
Philipp</p>
]]></content:encoded>
	</item>
	<item>
		<title>Von: Dirk</title>
		<link>http://www.phpblogger.net/2008/12/05/phpunit-wo-soll-man-anfangen/#comment-1437</link>
		<dc:creator>Dirk</dc:creator>
		<pubDate>Mon, 08 Dec 2008 05:52:43 +0000</pubDate>
		<guid isPermaLink="false">http://www.phpblogger.net/?p=461#comment-1437</guid>
		<description>Meiner Ansicht nach ist das etwas quer gedacht. Unit Testing hat in meinen Augen nichts mit dem Testen realistischer F&#228;lle zu tun, sondern soll die Funktionalit&#228;t einzelner Bausteine sicher stellen.

Ziel von Test Driven Development ist doch, erst Tests zu schreiben und dann eine Funktion oder Methode, welche den Test erf&#252;llt. Anschlie&#223;end Refactoring unter der Pr&#228;misse, dass der Test nach wie vor positiv durchl&#228;uft.

Es geht also darum die Kernaufgabe einer Methode zu erfassen und genau diese zu testen. Der Test ist die Code gewordene User Story bzw. Anforderung. Und da ist das Problem: automatisiete Tests hast du ebenso wenig unter Kontrolle, wie eine ungetestete Methode, weil sie nicht von einer Anforderung abgeleitet ist, sondern von einem Ablauf in der Anwendung, der ich (je nach Anforderung) jederzeit &#228;ndern kann. Das ist keine Anforderung, das ist ein Ablauf.

Als Tipp: es hilft, wenn du Unit Tests bei bestehenden Systemen von "Innen nach Au&#223;en" baust. Suche dir erst die Klassen, die wirklich im Kern deines Systems stecken und keine Abh&#228;ngigkeiten haben (meistens Datenbank, Debugging etc). Fange mit deren Methoden an und hangel dich langsam nach au&#223;en. Es bringt nichts von au&#223;en anzufangen, wo Fehler entweder an er Methode liegen oder an einer darunterlegenden Abh&#228;ngigkeit.</description>
		<content:encoded><![CDATA[<p>Meiner Ansicht nach ist das etwas quer gedacht. Unit Testing hat in meinen Augen nichts mit dem Testen realistischer F&#228;lle zu tun, sondern soll die Funktionalit&#228;t einzelner Bausteine sicher stellen.</p>
<p>Ziel von Test Driven Development ist doch, erst Tests zu schreiben und dann eine Funktion oder Methode, welche den Test erf&#252;llt. Anschlie&#223;end Refactoring unter der Pr&#228;misse, dass der Test nach wie vor positiv durchl&#228;uft.</p>
<p>Es geht also darum die Kernaufgabe einer Methode zu erfassen und genau diese zu testen. Der Test ist die Code gewordene User Story bzw. Anforderung. Und da ist das Problem: automatisiete Tests hast du ebenso wenig unter Kontrolle, wie eine ungetestete Methode, weil sie nicht von einer Anforderung abgeleitet ist, sondern von einem Ablauf in der Anwendung, der ich (je nach Anforderung) jederzeit &#228;ndern kann. Das ist keine Anforderung, das ist ein Ablauf.</p>
<p>Als Tipp: es hilft, wenn du Unit Tests bei bestehenden Systemen von &#8220;Innen nach Au&#223;en&#8221; baust. Suche dir erst die Klassen, die wirklich im Kern deines Systems stecken und keine Abh&#228;ngigkeiten haben (meistens Datenbank, Debugging etc). Fange mit deren Methoden an und hangel dich langsam nach au&#223;en. Es bringt nichts von au&#223;en anzufangen, wo Fehler entweder an er Methode liegen oder an einer darunterlegenden Abh&#228;ngigkeit.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Von: phil</title>
		<link>http://www.phpblogger.net/2008/12/05/phpunit-wo-soll-man-anfangen/#comment-1431</link>
		<dc:creator>phil</dc:creator>
		<pubDate>Fri, 05 Dec 2008 17:44:44 +0000</pubDate>
		<guid isPermaLink="false">http://www.phpblogger.net/?p=461#comment-1431</guid>
		<description>Hi Jungs,

ja, ich habe da noch ein paar weitere Convenience Funktionen, die ich noch in den Artikel hinzuf&#252;gen kann. Zum einen kannst du f&#252;r deine eigenen Objekte eine -&gt;_toString() Methode zur Verf&#252;gung stellen und f&#252;r PHP-Interne Objekte kann man sicher ein var_export($p_args[$i], true) einsetzen.

@Christoph
Du hast schon recht, dass man damit nicht alles abfangen kann, aber das kann fast nur passieren, in Funktionen, die auf externe Eingaben warten, also ist die Anzahl der Funktionen schon mal reduziert und zum anderen will ich das ja auch benutzen, um einen Anfang hinzubekommen. Vom blo&#223;en ansehen einer existierenden Funktion komme ich n&#228;mlich vielleicht noch nicht mal auf alle Kombinationen, die mittlerweile im Betrieb vorkommen und so hat man schon mal eine Sammlung, die man nutzen kann.

Und noch etwas weitergesponnen, wenn man dann ein Set von Testf&#228;llen hat, dann k&#246;nnte man auch das anlegen von neuen Testf&#228;llen automatisieren, so wie Timi das vorschl&#228;gt.</description>
		<content:encoded><![CDATA[<p>Hi Jungs,</p>
<p>ja, ich habe da noch ein paar weitere Convenience Funktionen, die ich noch in den Artikel hinzuf&#252;gen kann. Zum einen kannst du f&#252;r deine eigenen Objekte eine ->_toString() Methode zur Verf&#252;gung stellen und f&#252;r PHP-Interne Objekte kann man sicher ein var_export($p_args[$i], true) einsetzen.</p>
<p>@Christoph<br />
Du hast schon recht, dass man damit nicht alles abfangen kann, aber das kann fast nur passieren, in Funktionen, die auf externe Eingaben warten, also ist die Anzahl der Funktionen schon mal reduziert und zum anderen will ich das ja auch benutzen, um einen Anfang hinzubekommen. Vom blo&#223;en ansehen einer existierenden Funktion komme ich n&#228;mlich vielleicht noch nicht mal auf alle Kombinationen, die mittlerweile im Betrieb vorkommen und so hat man schon mal eine Sammlung, die man nutzen kann.</p>
<p>Und noch etwas weitergesponnen, wenn man dann ein Set von Testf&#228;llen hat, dann k&#246;nnte man auch das anlegen von neuen Testf&#228;llen automatisieren, so wie Timi das vorschl&#228;gt.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Von: timi</title>
		<link>http://www.phpblogger.net/2008/12/05/phpunit-wo-soll-man-anfangen/#comment-1430</link>
		<dc:creator>timi</dc:creator>
		<pubDate>Fri, 05 Dec 2008 12:48:00 +0000</pubDate>
		<guid isPermaLink="false">http://www.phpblogger.net/?p=461#comment-1430</guid>
		<description>Da hast Du sicherlich Recht, Christoph - NUR auf Live-Parameter sollte man sich nicht verlassen. Zumal das Protokollieren von Objekten und Querverweisen sicherlich schwer f&#228;llt.

@Phil: Wie willst Du ganze Objekte, die als Parameter &#252;bergeben werden, protokollieren? Hast Du Dir da schon was &#252;berlegt?</description>
		<content:encoded><![CDATA[<p>Da hast Du sicherlich Recht, Christoph - NUR auf Live-Parameter sollte man sich nicht verlassen. Zumal das Protokollieren von Objekten und Querverweisen sicherlich schwer f&#228;llt.</p>
<p>@Phil: Wie willst Du ganze Objekte, die als Parameter &#252;bergeben werden, protokollieren? Hast Du Dir da schon was &#252;berlegt?</p>
]]></content:encoded>
	</item>
</channel>
</rss>

