<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="http://unfoldingneurons.com/"
	>

<channel>
	<title>DaRaFF&#039;s Blog &#187; test driven development</title>
	<atom:link href="http://daraff.ch/tag/test-driven-development/feed/" rel="self" type="application/rss+xml" />
	<link>http://daraff.ch</link>
	<description>Gedanken über Themen, die mich beschäftigen</description>
	<lastBuildDate>Sun, 05 Feb 2012 07:02:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>FizzBuzz Kata mit Javascript</title>
		<link>http://daraff.ch/2010/08/fizzbuzz-kata-mit-javascript/</link>
		<comments>http://daraff.ch/2010/08/fizzbuzz-kata-mit-javascript/#comments</comments>
		<pubDate>Sat, 07 Aug 2010 05:20:11 +0000</pubDate>
		<dc:creator>DaRaFF</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Kata]]></category>
		<category><![CDATA[bdd]]></category>
		<category><![CDATA[behaviour driven development]]></category>
		<category><![CDATA[Code Kata]]></category>
		<category><![CDATA[test driven development]]></category>

		<guid isPermaLink="false">http://daraff.ch/?p=1309</guid>
		<description><![CDATA[So, heute geht es wieder mal ans Eingemachte. In letzter Zeit merke ich immer wieder, dass mir Übung ziemlich gut tut Darum habe ich die allseits beliebte FizzBuzz Kata in Javascript mit dem Jasmine BDD Framework umgesetzt. Wer die Regeln &#8230; <a href="http://daraff.ch/2010/08/fizzbuzz-kata-mit-javascript/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>So, heute geht es wieder mal ans Eingemachte. In letzter Zeit merke ich immer wieder, dass mir Übung ziemlich gut tut <img src='http://daraff.ch/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Darum habe ich die allseits beliebte FizzBuzz Kata in Javascript mit dem <a href="http://pivotal.github.com/jasmine/" target="_blank">Jasmine BDD Framework</a> umgesetzt. Wer die Regeln von FizzBuzz nicht kennt, kann sie <a href="http://codingdojo.org/cgi-bin/wiki.pl?KataFizzBuzz" target="_blank">hier</a> nachlesen.</p>
<p>Meine Ziele waren folgende:</p>
<ul>
<li>Javascript Syntax intuitiver niederschreiben können</li>
<li>Testgetrieben entwickeln</li>
<li>Das ganze sollte auch noch ein annehmbares Tempo haben</li>
<li>Netbeans Shortcuts anwenden (Maus nicht verwenden)</li>
</ul>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="640" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/eqDfhdYK_wk&amp;hl=de_DE&amp;fs=1" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="640" height="385" src="http://www.youtube.com/v/eqDfhdYK_wk&amp;hl=de_DE&amp;fs=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
 <p><a href="http://daraff.ch/?flattrss_redirect&amp;id=1309&amp;md5=2bbe7c685f1f78932f6cfcdbf6b42c82" title="Flattr" target="_blank"><img src="http://daraff.ch/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://daraff.ch/2010/08/fizzbuzz-kata-mit-javascript/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		<atom:link rel="payment" href="http://daraff.ch/?flattrss_redirect&amp;id=1309&amp;md5=2bbe7c685f1f78932f6cfcdbf6b42c82" type="text/html" />
	</item>
		<item>
		<title>Javascript Unit Testing mit JsTestDriver</title>
		<link>http://daraff.ch/2010/07/javascript-unit-testing-mit-jstestdriver/</link>
		<comments>http://daraff.ch/2010/07/javascript-unit-testing-mit-jstestdriver/#comments</comments>
		<pubDate>Sat, 24 Jul 2010 06:00:07 +0000</pubDate>
		<dc:creator>DaRaFF</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Qualität]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[jstestdriver]]></category>
		<category><![CDATA[mock]]></category>
		<category><![CDATA[software qualität]]></category>
		<category><![CDATA[test driven development]]></category>
		<category><![CDATA[testen]]></category>
		<category><![CDATA[xUnit]]></category>

		<guid isPermaLink="false">http://daraff.ch/?p=1009</guid>
		<description><![CDATA[Einführung Da ich mich momentan sehr für Qualität in der Softwareentwicklung interessiere, darf das Unit Testing natürlich nicht fehlen. Mit PHPUnit konnte ich nun schon einige sehr positive Erfahrungen machen. Da auch viele PHP Projekte mit Javascript arbeiten, suchte ich &#8230; <a href="http://daraff.ch/2010/07/javascript-unit-testing-mit-jstestdriver/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><strong>Einführung</strong></p>
<p>Da ich mich momentan sehr für Qualität in der Softwareentwicklung interessiere, darf das Unit Testing natürlich nicht fehlen. Mit PHPUnit konnte ich nun schon einige sehr positive Erfahrungen machen. Da auch viele PHP Projekte mit Javascript arbeiten, suchte ich deshalb auch nach einen Testwerkezeug für JS.<br />
Auf der Webseite <a href="http://testdrivenwebsites.com/2010/04/19/java-script-xunit-style-frameworks-comparison/" target="_blank">Test Driven Websites</a> bin ich auf einen schönen Javascript Unit Testing Framework Vergleich gestossen. Der Favorit war ganz klar JsTestDriver und nach einigem weiteren Surfen im Netz, hat sich für mich dieser Eindruck bestätigt. Da es sehr viele Test Frameworks für Javascript gibt, habe ich den allgemeinen Eindrücken im Netz einfach vertraut und mich für JsTestDriver entschieden.</p>
<p><strong>Highlights von JsTestDriver</strong></p>
<ul>
<li>xUnit konformer Syntax (sprich, der Syntax lehnt sich an PHPUnit oder Junit an)</li>
<li>Die Tests benötigen kein HTML File, wie in anderen JS Testframeworks</li>
<li>Client/Server Architektur für Tests (Das Prinzip ist ähnlich wie bei Selenium) -&gt; Der Test-Server muss somit nicht lokal laufen</li>
<li>Durch die Client/Server Architektur können mehrere Browser gleichzeitig getestet werden</li>
<li>Plugin für Eclipse und IntelliJ IDEA &#8211; bei jedem Save werden die Tests automatisch durchgeführt</li>
<li>Plugin Architektur &#8211; JsTestDriver bietet Plugins um andere Unit Testing Frameworks oder auch Mocking Frameworks zu integrieren</li>
<li>Problemlos in Continuous Integration Prozess integrierbar</li>
</ul>
<p><strong>Stolpersteine</strong></p>
<ul>
<li>JsTestDriver besitzt keine Möglichkeit zu mocken (ok, alle anderen JS Frameworks auch nicht). Es kann aber problemlos ein Mocking Framework eingebunden werden</li>
<li>Achtung bei globalen Variablen/Funktionen/Objekte &#8211; werden die globalen Variablen beim Testdurchlauf überschrieben, haben sie beim nächsten Durchlauf immer noch den überschriebenen Wert. Dies gilt so lange, bis entweder der Server neu gestartet wird, oder das Source File, wo die Variable deklariert wurde verändert wird. Der Grund ist Performance: Der Server cacht alle .js Dateien und lädt sie nur neu, wenn eine Datei auch verändert wurde.</li>
</ul>
<p><strong>Installation</strong></p>
<p>Auf der JsTestDriver <a href="http://code.google.com/p/js-test-driver/wiki/GettingStarted" target="_blank">Homepage</a>, wird sehr einfach beschrieben, wie man das Framework installieren und konfigurieren kann.<br />
Auf der <a href="http://blog.james-carr.org/2009/06/16/more-test-driven-development-with-javascript-jstestdriver/" target="_blank">Homepage</a> von James Carr erfährt man weitere nette Details über JsTestDriver.</p>
<p><strong>Code Example</strong></p>
<pre class="brush:js">TestCase("MyTestCase", {
    setUp: function() {
        //...
    },

    testAssertionWithMessage: function() {
        assertTrue("this is not true", false);
    },

    testAssertionWithoutMessage: function() {
        var actual = 5;
        assertEqual(5, actual);
    },

    tearDown: function() {
        //...
    }
};</pre>
<p><strong>Fazit</strong></p>
<p>JsTestDriver ist für mich absolut empfehlenswert. Ich konnte mich dank den PHPUnit Kenntnissen sehr rasch im Framework zurechtfinden und hatte schon nach kurzer Zeit die ersten Tests geschrieben. Die grössten Vorteile sind für mich: CI, erweiterbar mit anderen Frameworks, Multibrowsertesting</p>
 <p><a href="http://daraff.ch/?flattrss_redirect&amp;id=1009&amp;md5=20fc354db0d3ab153a353c81f1313d65" title="Flattr" target="_blank"><img src="http://daraff.ch/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://daraff.ch/2010/07/javascript-unit-testing-mit-jstestdriver/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<atom:link rel="payment" href="http://daraff.ch/?flattrss_redirect&amp;id=1009&amp;md5=20fc354db0d3ab153a353c81f1313d65" type="text/html" />
	</item>
		<item>
		<title>Buchrezension Clean Code von Robert C. Martin</title>
		<link>http://daraff.ch/2010/03/buchrezension-clean-code-von-robert-c-martin/</link>
		<comments>http://daraff.ch/2010/03/buchrezension-clean-code-von-robert-c-martin/#comments</comments>
		<pubDate>Fri, 12 Mar 2010 15:36:59 +0000</pubDate>
		<dc:creator>DaRaFF</dc:creator>
				<category><![CDATA[Buchrezension]]></category>
		<category><![CDATA[Qualität]]></category>
		<category><![CDATA[buch]]></category>
		<category><![CDATA[clean code]]></category>
		<category><![CDATA[refactoring]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[test driven development]]></category>
		<category><![CDATA[wissen]]></category>

		<guid isPermaLink="false">http://daraff.ch/?p=732</guid>
		<description><![CDATA[Nachdem ich zu ende des letzten Jahres in einen Bücher-Einkauf-Wahn verfallen bin, habe ich doch immerhin schön brav die Bücher durchgeackert und möchte nun meine erste Buchrezension schreiben. Es handelt sich dabei um Clean Code von Robert C. Martin. Als &#8230; <a href="http://daraff.ch/2010/03/buchrezension-clean-code-von-robert-c-martin/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Nachdem ich zu ende des letzten Jahres in einen <a href="http://daraff.ch/2009/12/verspatete-weihnachtsbescherung/" target="_blank">Bücher-Einkauf-Wahn</a> verfallen bin, habe ich doch immerhin schön brav die Bücher durchgeackert und möchte nun meine erste Buchrezension schreiben.</p>
<p>Es handelt sich dabei um Clean Code von Robert C. Martin. Als ich die ersten Seiten des Buches gelesen habe, habe ich bereits meine ersten Erkenntnisse in einem <a href="http://daraff.ch/2010/01/clean-code-produzieren-was-sind-die-probleme/" target="_blank">Blogeintrag</a> niedergeschrieben.</p>
<p><iframe src="http://rcm-de.amazon.de/e/cm?lt1=_blank&#038;bc1=FFFFFF&#038;IS2=1&#038;bg1=FFFFFF&#038;fc1=000000&#038;lc1=0000FF&#038;t=daraff-21&#038;o=3&#038;p=8&#038;l=as1&#038;m=amazon&#038;f=ifr&#038;asins=3826655486" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe></p>
<p><strong>Einführung</strong></p>
<p>Im ersten Kapitel nimmt Robert C. Martin kein Blatt vor den Mund. Er beschreibt sehr schön, wie schnell die Spezies Softwareentwickler die Schuld von schlechtem Code auf andere abschiebt (Zeitmangel, Chef usw.). Wir sind aber schliesslich die Profis und sollten dementsprechend unser Werk verteidigen.</p>
<p>Er beschreibt auch, warum wir uns so verhalten und warum es so schwierig ist guten Code zu schreiben. Erstens ist den meisten gar nicht bewusst, dass guter und sauberer Code längerfristig enorm wichtig ist und zweitens wissen viele auch gar nicht, was sauberer Code ist.</p>
<p><strong>Wie mache ich es richtig</strong></p>
<p>In den nächsten Kapitel beschreibt Martin sehr detailliert wie man es richtig macht.</p>
<ul>
<li>Wie wählt man aussagekräftige Namen für Variablen, Methoden usw.</li>
<li>Wie sollten Funktionen strukturiert sein (Grösse, Komplexität usw.)</li>
<li>Was sind gute und was sind schlechte Kommentare</li>
<li>Wie sollte man seinen Code formatieren</li>
<li>Der Umgang mit Objekten und Datenstrukturen</li>
<li>Wie sollte man Error Handling anwenden</li>
<li>Wie sollte man Schnittstellen verwenden</li>
<li>Wie sollte man Klassen aufbauen</li>
<li>Wie baut man ganze Softwaresysteme</li>
<li>Warum benötigt man Unit Tests</li>
</ul>
<p>Martin drückt auch klar aus, dass saubere Namensgebung, Unit Testing und Refactoring die zentralen Erfolgsrezepte für gute und vor allem langlebige Software sind.</p>
<p><strong>Refactoring</strong></p>
<p>Bis jetzt konnte man nur konsumieren. Im nächsten Teil des Buches muss man aber selber mitdenken. Martin beschreibt Schritt für Schritt, wie er Klassen von bekannten Projekten &#8220;refaktorisiert&#8221;. Dieser Teil bringt einem nur dann etwas, wenn man sich intensiv mit dem abgedruckten Code beschäftigt.</p>
<p><strong>Code Smells</strong></p>
<p>Im letzten Teil des Buches fasst Martin nochmals alle Code Smells (Dinge, die Code schlecht machen) zusammen, welche man während der ganzen Zeit erarbeitet hat.</p>
<p><strong>Mein persönliches Fazit</strong></p>
<p>Für mich ist dieses Buch unglaublich wertvoll. Im ersten Teil wurde mir bewusst gemacht, warum wir als Entwickler so reagieren, wie wir es tun. Und danach wird schön beschrieben, wie man es richtig macht.</p>
<p>Ich wusste immer, dass etwas falsch läuft beim programmieren und das ich bzw. meine Kollegen unsauberen Code schreiben. Nun kann ich endlich sagen, was es ist und wie man es besser macht. Das hilft auch bei Diskussionen mit Kollegen, wenn man ihren Code begutachtet und begründen kann, warum ihr Code nicht so &#8220;optimal&#8221; ist.</p>
 <p><a href="http://daraff.ch/?flattrss_redirect&amp;id=732&amp;md5=f92c1a052add79bae4204638db7f3187" title="Flattr" target="_blank"><img src="http://daraff.ch/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://daraff.ch/2010/03/buchrezension-clean-code-von-robert-c-martin/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		<atom:link rel="payment" href="http://daraff.ch/?flattrss_redirect&amp;id=732&amp;md5=f92c1a052add79bae4204638db7f3187" type="text/html" />

		<series:name><![CDATA[Clean Code]]></series:name>
	</item>
		<item>
		<title>Test Driven Development mit PHP – Erste Praxiserfahrungen</title>
		<link>http://daraff.ch/2010/02/test-driven-development-mit-php-erste-praxiserfahrungen/</link>
		<comments>http://daraff.ch/2010/02/test-driven-development-mit-php-erste-praxiserfahrungen/#comments</comments>
		<pubDate>Sat, 13 Feb 2010 04:49:58 +0000</pubDate>
		<dc:creator>DaRaFF</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Qualität]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[phpunit]]></category>
		<category><![CDATA[refactoring]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[test driven development]]></category>

		<guid isPermaLink="false">http://daraff.ch/?p=645</guid>
		<description><![CDATA[Anfangs Jahr stellte ich Euch in einem ersten Artikel das Grundprinzip von TDD (Test Driven Development) vor. Nun habe ich die ersten Praxiserfahrungen gemacht und möchte von diesen Erfahrungen berichten. Die theoretischen Konzepte hinter TDD habe ich beim lesen schnell &#8230; <a href="http://daraff.ch/2010/02/test-driven-development-mit-php-erste-praxiserfahrungen/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Anfangs Jahr stellte ich Euch in einem <a href="http://daraff.ch/2010/01/einfuhrung-test-driven-development/" target="_blank">ersten Artikel</a> das Grundprinzip von TDD (Test Driven Development) vor. Nun habe ich die ersten Praxiserfahrungen gemacht und möchte von diesen Erfahrungen berichten.</p>
<p>Die theoretischen Konzepte hinter TDD habe ich beim lesen schnell verstanden und dachte auch, dass dies eine gute Sache ist. Es kostet aber dennoch einige Überwindung um richtig mit TDD zu beginnen. Nur allzu schnell fällt man in alte Muster und entwickelt einfach drauf los, weil man sich noch nicht so gut mit TDD und dem Testing Framework auskennt.</p>
<p>Folgende Entwicklungsschritte und Erkenntnisse habe ich durchlaufen:</p>
<p><strong>Schritt 1 &#8211; TDD in der Theorie</strong></p>
<p>Theorie über TDD gelesen und gedacht: &#8220;Wow, das erscheint mir logisch, das muss ich auch mal ausprobieren&#8221;.</p>
<p><strong>Schritt 2 &#8211; Fizzbuzz mit TDD entwickelt</strong></p>
<p>Nachdem ich Bücher gelesen und einige Tutorials gesehen habe, habe ich mich an das erste reale Übungsszenario gemacht. Die Umsetzung der simplen Aufgabe <a href="http://en.wikipedia.org/wiki/Bizz_buzz" target="_blank">Fizzbuzz </a>fiel mir recht leicht und meine Erkenntnis zu diesem Zeitpunkt war, dass TDD relativ easy ist <img src='http://daraff.ch/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p><strong>Schritt 3 &#8211; TDD mit Brownfield Code</strong></p>
<p>Voller Elan ging ich in mein Geschäft und dachte mir: &#8220;So, fangen wir mit TDD an&#8221;.</p>
<p>Relativ schnell bemerkte ich, dass ich es irgendwie nicht fertig brachte, Tests für meine zu testenden Funktionen und Klassen zu formulieren. Diese waren so stark gekoppelt, so dass ich nicht einzelne Funktionalitäten testen konnte, sondern alles instanzieren und einbinden musste. Sinn und Zweck von TDD ist ja, dass man ganz spezifische Funktionen testet und eben nicht das, was sonst noch so alles dran hängt.</p>
<p>Ausserdem bemerkte ich, dass ich mich in der Anwendung des Testing Frameworks noch unsicher fühle (Ich kannte zwar einige Funktionen, dachte aber, dass es da wohl noch mehr gibt <img src='http://daraff.ch/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  ). Daher nahm ich mir vor, zuerst nochmals das PHPUnit Manual durchzuackern, vielleicht ergeben sich dadurch einige Erkenntnisse, wie man gekoppelte Funktionen testen kann.</p>
<p><strong>Schritt 4 &#8211; Das PHPUnit Manual</strong></p>
<p>Ok, wieder zurück zur Theorie. Habe das <a href="http://www.phpunit.de/manual/3.4/en/index.html" target="_blank">PHPUnit Manual</a> durchgeackert und herausgefunden, dass es doch noch 2 oder 3 gute Funktionen neben $blubb-&gt;AssertEquals() gibt <img src='http://daraff.ch/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Eine wichtige Erkenntnis war, dass man Klassen und Funktionen &#8220;mocken&#8221; kann. Das bedeutet, dass man für ganz bestimmte Funktionsaufrufe definieren kann, was man für Ergebnisse zurückerwartet.</p>
<p>Das &#8220;Mocken&#8221; ist zum Beispiel sinnvoll, wenn man mit Daten aus einer Datenbank arbeitet. Wenn man Tests formuliert, weiss man ja nicht wirklich, was genau in der Datenbank steht und die Tests sollen ja auch  nicht davon abhängen,wenn man die Funktion, welche diese Daten verarbeitet sollen, testen will. Also definiert man die Rückgabewerte der Datenbankwerte einfach mittels mocks.</p>
<p><strong>Schritt 5 &#8211; TDD mit Brownfield Code &#8211; Part 2</strong></p>
<p>Ok, wieder zurück im Geschäft und bereit für&#8217;s mocken. Habe zuerst einmal den Datenbanklayer gemockt und dann die ersten Tests geschrieben, mit Erfolg. Nachdem ich aber einige Funktionen und Objekte gemockt habe, setzte sich die Erkenntnis durch, dass es trotzdem schwierig ist, Tests für bestehenden Code zu schreiben.</p>
<p>Warum?</p>
<p>1. Der Code ist untereinander so verknüpft und teilweise auch unsauber, dass es sehr viel Zeit benötigt überhaupt einen vernünftigen Test zu generieren</p>
<p>2. Durch den Zeitdruck sagt man sich schnell mal: &#8220;ok, dass mach ich jetzt noch kurz ohne TDD, ich habe ja Stress&#8221;.</p>
<p><strong>Schritt 7 &#8211; TDD mit Brownfield Code &#8211; Refactoring</strong></p>
<p>Ich beschäftigte mich weiterhin in der Theorie mit TDD und Clean Code. Bei der Arbeit schaffte ich es durch den Zeitdruck aber noch nicht, konsequent TDD anzuwenden.</p>
<p>Inzwischen hatte ich für einige Funktionen Tests geschrieben und diese waren auch alle grün. An einem Wochenende startete ich eine Übungssession für TDD und nahm mir den Brownfield Code vom Geschäft vor. Da ich überhaupt nicht zufrieden mit dem Code war, entschied ich mich für ein Refactoring einer Klasse, für welche bereits Tests bestanden. Zu Hause hatte ich ja auch keine Datenbankanbindung und auch keine saubere Umgebung. Somit konnte ich beim Refactoren die Applikation nie ausführen (also im Browser laufen lassen).</p>
<p>Ich war also am Refactoren und meine Tests waren stets erfolgreich (nach einigem Üben). Am Montag wieder zurück im Geschäft spielte ich die neue Klasse ein und &#8220;bäm&#8221; die Refactorte Klasse lief ohne Probleme.</p>
<p>Das war für mich endgültig die Erkenntnis, dass es ohne TDD nicht mehr geht und dass man mit TDD einfach bessere und fehlerfreiere Software entwickeln kann.</p>
<p><strong>Erkenntnisse</strong></p>
<p>Zitat Robert C. Martin: &#8220;Nur Software die getestet werden kann ist gute Software&#8221;.</p>
<p>Im Endeffekt geht es nur darum gute Software zu entwickeln. Welches Instrument man schlussendlich verwendet ist egal. Meine persönliche Erkenntnis ist aber, dass TDD die Entwicklung von guter Software ermöglicht.</p>
<ul>
<li>TDD fördert die Testbarkeit, weil man vorher schon den Tests dafür schreibt</li>
<li>TDD fördert entkoppelte und komponentenbasierte Software und ergibt somit bessere Software</li>
<li>TDD auf der grünen Wiese ist deutlich einfacher, als mit Brownfield Code</li>
<li>TDD muss man einfach ausprobieren und anwenden &#8211; am Anfang muss man sich konsequent zwingen es anzuwenden. Mit der Zeit ergibt sich ein aha-Effekt in der Praxis und man sieht, dass TDD unglaubliche Vorteile gegenüber der normalen Entwicklung hat
<ul>
<li>Man entwickelt entkoppelte Funktionen</li>
<li>Man fühlt sich sicherer, weil man Tests hat</li>
<li>Bestehender Code kann ohne Probleme angepasst werden, weil man jederzeit weiss, dass die alte Funktionalität noch gegeben ist</li>
</ul>
</li>
<li>Wenn man konsequent mit TDD entwickelt, kann man eine Funktion in einem Brownfieldprojekt erst Refactoren, wenn man für die alte Funktion zuerst Tests geschrieben hat. Nur so kann die bestehende Funktionalität sichergestellt werden</li>
<li>Ohne das Testing Framework gut zu kennen (in meinem Fall PHPUnit) kann man nicht mit TDD entwickeln</li>
</ul>
 <p><a href="http://daraff.ch/?flattrss_redirect&amp;id=645&amp;md5=ae8a172acfab783d9b464a1efd9f31e0" title="Flattr" target="_blank"><img src="http://daraff.ch/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://daraff.ch/2010/02/test-driven-development-mit-php-erste-praxiserfahrungen/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		<atom:link rel="payment" href="http://daraff.ch/?flattrss_redirect&amp;id=645&amp;md5=ae8a172acfab783d9b464a1efd9f31e0" type="text/html" />

		<series:name><![CDATA[TDD]]></series:name>
	</item>
		<item>
		<title>Einführung Test Driven Development</title>
		<link>http://daraff.ch/2010/01/einfuhrung-test-driven-development/</link>
		<comments>http://daraff.ch/2010/01/einfuhrung-test-driven-development/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 07:00:46 +0000</pubDate>
		<dc:creator>DaRaFF</dc:creator>
				<category><![CDATA[Testing]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[test driven development]]></category>

		<guid isPermaLink="false">http://daraff.ch/?p=505</guid>
		<description><![CDATA[Lesetipps Software &#8211; Hauptsache es läuft&#8230; Test Driven Development &#8211; Erste Praxiserfahrungen Wenn ein Entwickler eine Idee für ein neues Feature hat, oder findet, dass man den alten Code umstrukturieren sollte treten immer wieder die gleichen Probleme auf. Kann ich &#8230; <a href="http://daraff.ch/2010/01/einfuhrung-test-driven-development/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div id="lesetipps">
<p><strong>Lesetipps</strong></p>
<div>
<ul>
<li><a href="http://daraff.ch/2010/07/software-hauptsache-es-lauft/">Software &#8211; Hauptsache es läuft&#8230;</a></li>
<li><a href="http://daraff.ch/2010/02/test-driven-development-mit-php-erste-praxiserfahrungen/">Test Driven Development &#8211; Erste Praxiserfahrungen</a></li>
</ul>
</div>
</div>
<p>Wenn ein Entwickler eine Idee für ein neues Feature hat, oder findet, dass man den alten Code umstrukturieren sollte treten immer wieder die gleichen Probleme auf. Kann ich den alten Code ohne Risiko anpassen, so dass die alten Programmteile nachher noch laufen? Wenn ich das Programm von Hand teste, habe ich wirklich an alles gedacht?</p>
<p>Hier setzt Test Driven Development (TDD) ein &#8211; also testgetriebene Entwicklung. TDD bedeutet, dass man für jedes Stück Code, dass man programmiert zuerst ein Test schreibt, somit ist man sicher, dass ein Programmteil auch getestet ist und funktioniert. Wenn man irgendwann die Funktion anpassen will, kann man nach der Veränderung einfach den Test laufen lassen und sich sicher sein, dass die Funktionalität immer noch die gleiche ist.</p>
<p>TDD folgt dem einfachen Grundsatz:</p>
<ol>
<li>Test schreiben</li>
<li>Test durchlaufen &#8211; Test schlägt fehl</li>
<li>Code anpassen</li>
<li>Test durchlaufen &#8211; Test funktioniert</li>
<li>Code Refactoring</li>
</ol>
<p>TDD ein bisschen mehr beschrieben:</p>
<ol>
<li>Test schreiben für eine kleine Funktionalität</li>
<li>Test durchlaufen lassen und sehen, wie der Test fehlschlägt</li>
<li>Den Test so einfach wie möglich, durch hinzufügen einer Funktionalität im Code, zum laufen bringen (hierbei können auch Codesünden begangen werden, dass spielt in der 1. Phase keine Rolle)</li>
<li>Test durchlaufen lassen und sehen, wie der Test funktioniert</li>
<li>Code Refactoring &#8211; Code so korrigieren, dass er sauber ist / Code Redundanzen entfernen</li>
<li>(jedesmal wenn eine Änderung am Code gemacht wird, muss wieder bei 1 begonnen werden bis das Refactoring abgeschlossen ist)</li>
</ol>
<p>Zu beginn dachte ich auch, dass dies ja viel Zusatzaufwand bedeutet. Aber man muss bedenken, dass die Funktionen ja sowieso getestet werden müssen, warum also nicht schon vorher definieren, was man testen will? Ausserdem hat man diese Tests auch in Zukunft und Veränderungen können sofort gecheckt werden, ohne dass man von Hand durchgehen und überlegen muss, ob dies auch wirklich funktionieren könnte.</p>
<p>Ich habe noch einen interessanten <a href="http://www.parlezuml.com/tutorials/agilejava/fizzbuzz/fizzbuzz.html" target="_blank">Link </a>im Netz gefunden, der Anhand eines Videotutorials von FizzBuzz zeigt, wie Test Driven Development mit Java/Junit funktioniert.</p>
<blockquote><p>Quellen<br />
<a href="http://www.amazon.de/Driven-Development-Example-Addison-Wesley-Signature/dp/0321146530/ref=sr_1_1?ie=UTF8&amp;s=books-intl-de&amp;qid=1262418251&amp;sr=8-1-spell" target="_blank">Buch Test-Driven Development by Kent Beck<br />
</a><a href="http://de.wikipedia.org/wiki/Testgetriebene_Entwicklung" target="_blank">Begriff Test Driven Development by Wiki</a></p></blockquote>
 <p><a href="http://daraff.ch/?flattrss_redirect&amp;id=505&amp;md5=1fe9aa39330c140f310582460f185167" title="Flattr" target="_blank"><img src="http://daraff.ch/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://daraff.ch/2010/01/einfuhrung-test-driven-development/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<atom:link rel="payment" href="http://daraff.ch/?flattrss_redirect&amp;id=505&amp;md5=1fe9aa39330c140f310582460f185167" type="text/html" />

		<series:name><![CDATA[TDD]]></series:name>
	</item>
	</channel>
</rss>

