<?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; Testing</title>
	<atom:link href="http://daraff.ch/category/softwareengineering/testing/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>Software – Hauptsache es läuft…</title>
		<link>http://daraff.ch/2010/07/software-hauptsache-es-lauft/</link>
		<comments>http://daraff.ch/2010/07/software-hauptsache-es-lauft/#comments</comments>
		<pubDate>Tue, 27 Jul 2010 11:38:18 +0000</pubDate>
		<dc:creator>DaRaFF</dc:creator>
				<category><![CDATA[Qualität]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[software qualität]]></category>
		<category><![CDATA[testen]]></category>

		<guid isPermaLink="false">http://daraff.ch/?p=1051</guid>
		<description><![CDATA[Immer wieder höre ich den Satz von Entwicklern und Chef&#8217;s: &#8220;Hauptsache das Programm läuft&#8230;&#8221;. Inzwischen reagiere ich ziemlich allergisch gegen diese Aussage und versuche dann auch prompt den Leuten zu erklären, warum es nicht genügt, dass ein Programm einfach nur &#8230; <a href="http://daraff.ch/2010/07/software-hauptsache-es-lauft/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Immer wieder höre ich den Satz von Entwicklern und Chef&#8217;s: &#8220;Hauptsache das Programm läuft&#8230;&#8221;. Inzwischen reagiere ich ziemlich allergisch gegen diese Aussage und versuche dann auch prompt den Leuten zu erklären, warum es nicht genügt, dass ein Programm einfach nur läuft. Häufig mit mässigem Erfolg. Ich versuche in diesem Post aber aufzuzeigen, was ich darüber denke, wie Softwareentwicklung funktionieren muss.</p>
<p>Schlüsselfaktoren für eine langfristig gute und qualitativ hochwertige Software sind:</p>
<ul>
<li>Kommunikation zwischen den beteiligten Personen (Projektleiter, Entwickler, Kunde)</li>
<li>Automatisierung wo es nur geht -&gt; Continuous integration</li>
<li>Stimmung / Motivation im Team -&gt; <a href="http://daraff.ch/2010/06/wie-werde-ich-ein-besserer-softwareentwickler/" target="_blank">Der Wille sich ständig verbessern zu wollen</a></li>
<li>Abdeckung der Software durch Tests -&gt; Unit Tests, Integration Tests, &#8230;</li>
<li>Kontinuierliches Refactoring -&gt; Die Software ändert sich schliesslich immer</li>
<li>Regelmässige Code Reviews</li>
<li>Modularer und unabhängiger Aufbau der Softwarekomponenten</li>
</ul>
<p>Es ist zwar etwas zusammengewürfelt, aber ich möchte einfach noch ein paar Gedanken zu den oben aufgezählten Punkten erwähnen.</p>
<p><strong>Wenn das Programm läuft ist man nur halb fertig</strong></p>
<p>Wenn man glaubt, das man mit einer Funktion fertig ist, hat man normalerweise etwa die hälfte geschafft (ausser man entwickelt mit TDD, da ist&#8217;s besser)Wenn bei uns die Lehrlinge jeweils sagen, dass sie fertig sind, frage ich sie:</p>
<ul>
<li> Ist der Code dokumentiert?</li>
<li>Ist der Code mit Tests abgedeckt?</li>
<li>Hat jemand ein Review von deinem Code gemacht?</li>
<li>Hast du den Code schon refaktorisiert bzw. aufgeräumt?</li>
<li>Läuft es auch auf einer anderen Installation?</li>
</ul>
<p>Natürlich ist die Antwort eigentlich immer nein (wahrscheinlich wie bei den meisten Entwicklern). Man sollte sich also auch unter Zeitdruck immer fragen, ob die Aufgabe auch wirklich erledigt ist. Niemals sollte man sich damit zufrieden geben, dass es einfach nur läuft, auch wenn einem dies jemand anders so vermitteln will.</p>
<p><strong>Modularer Aufbau von Software</strong></p>
<p>Inzwischen bin ich der festen Überzeugung, dass Software modular aufgebaut und in kleine Teile unterteilt sein sollte. Viele kleine Legosteine, welche keine Abhängigkeiten haben, sind viel einfacher zu einem ganzen zusammenzufügen, also grosse und undurchschaubare Konstrukte. Zwei wichtige Prinzipien sind hier <a href="http://www.clean-code-developer.de/wiki/CcdOrangerGrad#SeparationofConcerns" target="_blank">Separation of Concern</a> und <a href="http://www.clean-code-developer.de/wiki/CcdGelberGrad#DependencyInversionPrinciple" target="_blank">Dependency Inversion Principle</a>.</p>
<p><strong>Testen</strong></p>
<p>Immer wieder höre ich, dass z.B. Unit Testing nur Zeit benötigt und eigentlich gar nicht soviel bringt. Diesem Punkte kann ich absolut nicht zustimmen. Testing ist etwas absolut essentielles.</p>
<p>Schreibe ich Tests, formuliere ich meine Anforderungen an die Funktion. Ausserdem stelle ich sicher, dass meine Architektur im kleinen gut ist (bei zu vielen Abhängigkeiten wird es schwierig überhaupt zu testen). Zudem muss ich keine Angst vor Refactorings haben. Aussagen wie diese gibt es nicht mehr: &#8220;Ich mach mal lieber nichts an dieser Funktion, ich weiss ja nicht, ob sie nachher noch funktioniert&#8221;.</p>
<p><strong>Refactoring</strong></p>
<p>Refactoring ist immer wieder nötig, da sich die Software auch ständig ändert. Wer kein Refactoring macht, sondern alles an das Bestehende anhängt, wird über kurz oder lang einen riesen Krüppel generieren.</p>
<p><strong>Code Reviews</strong></p>
<p>Code Reviews haben mehrere Vorteile. Man kann mit anderen kommunizieren und so auch seinen Horizont erweitern. Ausserdem sieht jemand anders häufig Fehler oder unklare Konstrukte, die einem so nie aufgefallen wären.</p>
<p><strong>Zusammenhang zwischen Code Reviews, Modularität, Testing und Refactoring</strong></p>
<p>Die Zusammenhänge ergeben sich eigentlich von alleine. Um gute Software, sprich unabhängige, modulare Software zu produzieren, muss man sie mit Tests abdecken. Da sich Software ständig ändert, muss sie Refaktorisiert werden, ohne Tests ist dies nicht ohne Fehler möglich. Die Code Reviews unterstützen diesen Prozess.</p>
 <p><a href="http://daraff.ch/?flattrss_redirect&amp;id=1051&amp;md5=fb5e0f660963b83bfd209e540e63c881" 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/software-hauptsache-es-lauft/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<atom:link rel="payment" href="http://daraff.ch/?flattrss_redirect&amp;id=1051&amp;md5=fb5e0f660963b83bfd209e540e63c881" type="text/html" />
	</item>
		<item>
		<title>Javascript Mocking mit JsMockito – Teil I</title>
		<link>http://daraff.ch/2010/07/javascript-mocking-mit-jsmockito-teil-i/</link>
		<comments>http://daraff.ch/2010/07/javascript-mocking-mit-jsmockito-teil-i/#comments</comments>
		<pubDate>Sun, 25 Jul 2010 08:45:54 +0000</pubDate>
		<dc:creator>DaRaFF</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[mock]]></category>
		<category><![CDATA[stub]]></category>
		<category><![CDATA[unit testing]]></category>

		<guid isPermaLink="false">http://daraff.ch/?p=1020</guid>
		<description><![CDATA[Einleitung Heute möchte ich über das Thema Mocking unter Javascript schreiben. Wie schon bei den Testing Frameworks, gibt es auch einige Mocking Frameworks. Ich habe mich wieder über TestDrivenWebsites inspirieren lassen und mich für JsMockito entschieden, welcher ein Klon vom &#8230; <a href="http://daraff.ch/2010/07/javascript-mocking-mit-jsmockito-teil-i/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><strong>Einleitung</strong></p>
<p>Heute möchte ich über das Thema Mocking unter Javascript schreiben. Wie schon bei den Testing Frameworks, gibt es auch einige Mocking Frameworks. Ich habe mich wieder über <a href="http://testdrivenwebsites.com/2010/04/19/java-script-xunit-style-frameworks-comparison/" target="_blank">TestDrivenWebsites</a> inspirieren lassen und mich für <a href="http://jsmockito.org/" target="_blank">JsMockito</a> entschieden, welcher ein Klon vom entsprechenden JMock für Java ist. Ich setze in diesem Artikel voraus, das JsTestDriver installiert und einsatzbereit, da JsMockito integriert wird.</p>
<p>Dieses mal hatte ich es aber nicht so einfach, bis ich die ersten funktionierenden Beispiele hatte. Folgend liste ich die wichtigsten Quellen auf, auf welchen ich Beispiele für JsMockito gefunden habe:</p>
<ul>
<li>JsMockito <a href="http://jsmockito.org/" target="_blank">Homepage</a></li>
<li><a href="http://github.com/chrisleishman/jsmockito" target="_blank">Sourcen</a> auf Github</li>
<li>JsMockito <a href="http://chrisleishman.github.com/jsmockito/api/1.0.2/" target="_blank">API</a></li>
</ul>
<p>Da in den kurz gehaltenene Beispielen die Benennung der Variablen vielleicht nicht immer Ideal gewesen ist (vorallem beim Function Mocking), dauerte es eine Weile, bis ich begriffen hatte, wie das Mocking anzuwenden ist. Ich versuche darum nochmals ein Beispiel durchzuspielen und auf die wichtigsten Punkte einzugehen.</p>
<p><strong>Installation</strong></p>
<p>Es müssen die Sourcen von <a href="http://jshamcrest.destaquenet.com/" target="_blank">JsHamcrest</a> (JsMockito baut auf JsHamcrest auf) und <a href="http://jsmockito.org/" target="_blank">JsMockito</a> heruntergeladen und über die JsTestDriver.conf eingebunden werden.</p>
<p>Danach folgt die Integration in JsTestDriver mittels</p>
<pre class="brush:js">JsHamcrest.Integration.JsTestDriver();
JsMockito.Integration.JsTestDriver();</pre>
<p>Das wärs schon, JsMockito sollte nun einsatzbereit sein.</p>
<p><strong>Mocken von Objekten</strong></p>
<p>Ich arbeite momentan an einem Projekt, bei dem loose Kopplung von Objekten und Funktionen nicht existiert. Sprich, es werden neue Instanzen ohne Dependency Injection erzeugt. Somit wird das Mocken noch um einiges erschwert.</p>
<p>Ich möchte nun anhand eines Beispiel zeigen, wie man die Abhängigkeiten mocken kann.</p>
<pre class="brush:js">myapp = {
    Greeter: {
        greet: function(name){
           return "Hello " + name + "!";
        },
        goodbye: function(name){
            return "Bye " + name + "!";
        }
    }
};</pre>
<p>Ich habe ein Objekt Greeter mittels Object Literals erzeugt.</p>
<p>Nun folgt der Test Code.</p>
<pre class="brush:js">TestCase("GreeterTest", {
    setUp: function() {
        //tmp backup, because myapp.Greeter is global and the mock
        //is overwriting the methods i mock
        this.tmpObjectGreeter = myapp.Greeter;
    },

    testMockupObjectGreeter: function(){
        //prepare an object for mocking - some stubbing functions will be added
        //to the object
        myapp.Greeter = mock(myapp.Greeter);
        //if i call greet() - return value = "Hello Mockito"
        //else nothing is happening to other functions in the object
        //same behaviour as before the mock
        when(myapp.Greeter).greet().thenReturn("Hello Mockito!");

        assertEquals("", "Hello Mockito!", myapp.Greeter.greet("Mr. Johnson"));
        assertEquals("", "Bye Mr. Johnson!", myapp.Greeter.goodbye("Mr. Johnson"));
    },

    tearDown: function() {
        //Restore myapp.Greeter to original
        myapp.Greeter = this.tmpObjectGreeter;
    }
});</pre>
<p>Da ich beim mocken das real existierende globale Objekt Greeter verändere, muss ich Greeter im setUp zwischenspeichern und beim tearDown wieder in den Originalzustand zurückversetzen. Wie schon im letzten <a href="http://daraff.ch/2010/07/javascript-unit-testing-mit-jstestdriver/" target="_blank">Artikel</a> über JsTestDriver erwähnt, werden veränderte Objekte, Funktionen und Variablen nicht mehr in den Originalzustand zurückversetzt, wenn die Tests erneut aufgerufen werden.</p>
<p>testMockupObjectGreeter zeigt nun auf, wie man ein Objekt mocken kann. Der wichtigste Teil ist die Zeile mit when()&#8230; Hier kann definiert werden, welche Funktionen im Objekt gemockt werden sollen und wie der Mock beim Aufruf reagieren soll. thenReturn ist der einfachste Fall. Hier wird definiert, dass egal wie greet() aufgerufen wird, immer &#8220;Hello Mockito!&#8221; zurückgegeben wird.</p>
<p>Dieses when/then Konstrukt ist sehr mächtig. Man kann beliebige Dinge zurüc﻿kgeben &#8211; primitive Datentypen, Funktionen, Objekte usw.</p>
<p>Im zweiten Teil werde ich auf das mocken von globalen Funktionen eingehen und noch ein bisschen mehr über die Möglichkeiten mit when/then aufzeigen.</p>
 <p><a href="http://daraff.ch/?flattrss_redirect&amp;id=1020&amp;md5=912ec9c973f7f81db8d796dcf480705a" 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-mocking-mit-jsmockito-teil-i/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<atom:link rel="payment" href="http://daraff.ch/?flattrss_redirect&amp;id=1020&amp;md5=912ec9c973f7f81db8d796dcf480705a" 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 Selenium</title>
		<link>http://daraff.ch/2010/07/buchrezension-selenium/</link>
		<comments>http://daraff.ch/2010/07/buchrezension-selenium/#comments</comments>
		<pubDate>Sat, 17 Jul 2010 11:47:46 +0000</pubDate>
		<dc:creator>DaRaFF</dc:creator>
				<category><![CDATA[Buchrezension]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[automatisierung]]></category>
		<category><![CDATA[integrationstest]]></category>
		<category><![CDATA[oberflächentest]]></category>
		<category><![CDATA[selenium]]></category>
		<category><![CDATA[testen]]></category>
		<category><![CDATA[tool]]></category>
		<category><![CDATA[webapplikation]]></category>

		<guid isPermaLink="false">http://daraff.ch/?p=955</guid>
		<description><![CDATA[Mit dem heutigen Artikel möchte ich eine weitere Buchrezension präsentieren. Es handelt sich um das Buch Selenium &#8211; Web-Applikationen automatisiert testen von Michael Kain. Kurze Erklärung zum Thema Selenium ist ein browserunabhängiges Tool, um automatisierte Oberflächen-Tests in Webapplikationen zu generieren &#8230; <a href="http://daraff.ch/2010/07/buchrezension-selenium/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Mit dem heutigen Artikel möchte ich eine weitere Buchrezension präsentieren. Es handelt sich um das Buch Selenium &#8211; Web-Applikationen automatisiert testen von Michael Kain.</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=3937514570" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe></p>
<p><span style="font-weight: normal;" mce_style="font-weight: normal;"><span mce_name="strong" mce_style="font-weight: bold;" style="font-weight: bold;" class="Apple-style-span">Kurze Erklärung zum Them</span></span><span style="font-weight: normal;" mce_style="font-weight: normal;"><span mce_name="strong" mce_style="font-weight: bold;" style="font-weight: bold;" class="Apple-style-span">a</span></span></p>
<p>Selenium ist ein browserunabhängiges Tool, um automatisierte Oberflächen-Tests in Webapplikationen zu generieren und dann auch durchzuführen. Es ist somit möglich, verhalten von Benutzern 1:1 nachzuspielen und in einem continuous integration Prozess zu verwenden.</p>
<p><span style="font-weight: normal;" mce_style="font-weight: normal;"><span mce_name="strong" mce_style="font-weight: bold;" style="font-weight: bold;" class="Apple-style-span">Teil 1 &#8211; Einführung</span></span></p>
<p>Im ersten Teil des Buches wird eine Einführung zu Selenium dargelegt. Was gibt es in Selenium für Module und für welche Art von Tests kann das Tool verwendet werden.</p>
<p><span style="font-weight: normal;" mce_style="font-weight: normal;"><span mce_name="strong" mce_style="font-weight: bold;" style="font-weight: bold;" class="Apple-style-span">Teil 2 &#8211; Die Selenium Module</span></span></p>
<p>Im zweiten Teil des Buches werden einem die verschiedenen Selenium Module und Selenese erklärt.</p>
<ul>
<li>Selenese -&gt; Sprache</li>
<li>Selenium IDE -&gt; Firefox Plugin, um sich Tests einfach über den Browser zusammenzuklicken</li>
<li>Selenium Remote Control -&gt; Testsequenzen über einen Remote Server absetzen und ausführen</li>
<li>Selenium Grid -&gt; Ausführen von Tests auf mehreren Servern mit versch. Browsern und versch. Betriebsystemen</li>
</ul>
<p><span style="font-weight: normal;" mce_style="font-weight: normal;"><span mce_name="strong" mce_style="font-weight: bold;" style="font-weight: bold;" class="Apple-style-span">Teil 3 &#8211; Tips und Tricks + API</span></span></p>
<p>Im letzten Teil des Buches werden noch ein paar Tricks zu verschiedenen Themen aufgezeigt und am Schluss gibt es nochmals eine detaillierte Auflistung der API zu sehen.</p>
<p><span style="font-weight: normal;" mce_style="font-weight: normal;"><span mce_name="strong" mce_style="font-weight: bold;" style="font-weight: bold;" class="Apple-style-span">Fazit</span></span></p>
<p>Das Buch listet alle Module und Befehle von Selenium auf und erklärt diese. Es ist sozusagen ein Selenium &#8211;help. Daher hielt sich meine Begeisterung während des Lesens auch in Grenzen.</p>
<p>Folgende Punkte wurden nicht oder nur in einigen wenigen Sätzen angesprochen:</p>
<ul>
<li>Was sind best practises für Oberflächentests?</li>
<li>Wie wird ein solcher Oberflächentest sinnvollerweise aufgebaut?</li>
<li>Was für eine Testabdeckung macht Sinn?</li>
<li>Welche Teile einer Applikation sollten mit Oberflächentests getestet werden?</li>
<li>Wie können/sollen Unittests mit Oberflächentests kombiniert werden?</li>
<li>Wie können die Testergebnisse sinnvoll validiert werden?</li>
<li>&#8230;</li>
</ul>
<p>Unter Selenium HQ findet man die im Buch beschriebenen Infos auch, einfach auf Englisch.</p>
<p>Trotz der negativen Buchkritik ist Selenium ein sensationelles Instrument, um Oberflächentests zu automatisieren. Ich werde bei Gelegenheit noch einen Artikel darüber schreiben, wenn dies von euch gewünscht wird.</p>
<p><span mce_name="strong" mce_style="font-weight: bold;" style="font-weight: bold;" class="Apple-style-span">Weiterführende Quellen</span></p>
<ul>
<li><a href="http://seleniumhq.org/" mce_href="http://seleniumhq.org/" target="_blank">http://seleniumhq.org/</a></li>
</ul>
 <p><a href="http://daraff.ch/?flattrss_redirect&amp;id=955&amp;md5=35bb66a7202f6fd568181ac6d3ca0abb" 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/buchrezension-selenium/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<atom:link rel="payment" href="http://daraff.ch/?flattrss_redirect&amp;id=955&amp;md5=35bb66a7202f6fd568181ac6d3ca0abb" type="text/html" />
	</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>
	</channel>
</rss>

