<?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/"
	>

<channel>
	<title>PHP hates me - Der PHP Blog &#187; Qualitätssicherung</title>
	<atom:link href="http://www.phphatesme.com/archives/category/qualitatssicherung/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.phphatesme.com</link>
	<description>PhpHatesMe, but that&#039;s ok!</description>
	<lastBuildDate>Thu, 02 Feb 2012 14:00: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>TemplateMethod vs. method_exists()-Prüfung</title>
		<link>http://www.phphatesme.com/blog/qualitatssicherung/templatemethod-vs-method_exists-prufung/</link>
		<comments>http://www.phphatesme.com/blog/qualitatssicherung/templatemethod-vs-method_exists-prufung/#comments</comments>
		<pubDate>Wed, 11 Jan 2012 07:00:07 +0000</pubDate>
		<dc:creator>ebene7</dc:creator>
				<category><![CDATA[phmnetwork]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Qualitätssicherung]]></category>

		<guid isPermaLink="false">http://blog.ebene7.com/?p=3295</guid>
		<description><![CDATA[Das Entwurfsmuster TemplateMethod kennen und nutzen sicherlich viele von euch. Spätestens, wenn irgendein Framework im Einsatz ist, hat man in der Regel damit zu tun, um z.B. an verschiedenen Stellen im Code eigene Funktionen in einen Ablauf einzuhängen. Das Prinzip &#8230; <a href="http://blog.ebene7.com/2012/01/11/templatemethod-vs-method-exists-pruefung/">Weiterlesen <span>&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Das Entwurfsmuster <a href="http://de.wikipedia.org/wiki/Template_Method" >TemplateMethod</a> kennen und nutzen sicherlich viele von euch. Spätestens, wenn irgendein Framework im Einsatz ist, hat man in der Regel damit zu tun, um z.B. an verschiedenen Stellen im Code eigene Funktionen in einen Ablauf einzuhängen.<span id="more-3295"></span></p>
<p>Das Prinzip ist einfach: in der (abstrakten) Basisklasse wird eine leere Methode definiert, die durch eine konkrete Klasse überschrieben werden kann.</p>
<p>Der Vorteil ist recht offensichtlich. Die Methode kann ohne vorherige Prüfung verwendet werden und das spart an vielen Stellen unnötigen Code. Aus meinem ästhetischem Empfinden der richtige Weg.</p>
<p>Aber auch den anderen Weg habe ich auch schon desöfteren gesehen und mein Bauchgefühl hat ja auch nicht immer recht. Vielleicht ist der schöne Weg ja auch der langsamere?</p>
<p>Gefühl ist gut, Zahlen sind besser! Also habe ich schnell drei Testklassen geschrieben und probiere die verschiedenen Möglichkeiten durch.</p>
<p>Variante 1: Wir verlassen uns darauf, dass die Methode aufgerufen werden kann.</p>
<pre>&lt;?php
class Test1 {
    public function machWas() {
        $this-&gt;machWasAnderes();
    }

    public function machWasAnderes() {
    }
}</pre>
<p>Variante 2: Wir prüfen, ob die Methode existiert und finden nichts.</p>
<pre>&lt;?php
class Test2 {
    public function machWas() {
        if (method_exists($this, 'machWasAnderes')) {
            $this-&gt;machWasAnderes();
        }
    }
}</pre>
<p>Variante 3: Wir prüfen, ob die Methode existiert und rufen sie auf.</p>
<pre>&lt;?php
class Test3 {
    public function machWas() {
        if (method_exists($this, 'machWasAnderes')) {
            $this-&gt;machWasAnderes();
        }
    }

    public function machWasAnderes() {
    }
}</pre>
<p>Zum Vergleich habe ich das folgende Script verwendet.</p>
<pre>&lt;?php
foreach (array('Test1', 'Test2', 'Test3') as $class) {
    $object = new $class();
    $start = microtime(true);

    for($i=0; $i&lt;100000; $i++) {
        $object-&gt;machWas();
    }
    echo $class . ' = ' . round(microtime(true) - $start, 5) . '&lt;br/&gt;';
}</pre>
<p>Ausgabe:</p>
<pre>Test1 = 0.44767
Test2 = 0.48588
Test3 = 0.70881</pre>
<p>In mehreren Durchläufen waren &#8220;Test1&#8243; und &#8220;Test2&#8243; immer fast gleich auf, nur &#8220;Test3&#8243; brauchte etwas länger, weil in der Klasse die Prüfung und die Ausführung der Methode stattfindet.</p>
<p>Fazit: Der Einsatz von Schablonenmethoden lohnt sich doppelt, da der Code übersichtlich bleibt und auch die Geschwindigkeit etwas besser ist.</p>


<!-- Begin SexyBookmarks Menu Code -->
<div class="sexy-bookmarks sexy-bookmarks-expand sexy-bookmarks-center sexy-bookmarks-bg-caring-old">
<ul class="socials">
		<li class="sexy-comfeed">
			<a href="http://blog.ebene7.com/2012/01/11/templatemethod-vs-method-exists-pruefung/feed" rel="nofollow" class="external" title="Abonniere die Kommentare für diesen Beitrag">Abonniere die Kommentare für diesen Beitrag</a>
		</li>
		<li class="sexy-twitter">
			<a href="http://twitter.com/home?status=TemplateMethod+vs.+method_exists()-Pr%C3%BCfung+-+http://bit.ly/yTalLB+&amp;source=shareaholic" rel="nofollow" class="external" title="Twittere diesen Artikel!">Twittere diesen Artikel!</a>
		</li>
		<li class="sexy-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://blog.ebene7.com/2012/01/11/templatemethod-vs-method-exists-pruefung/&amp;t=TemplateMethod+vs.+method_exists()-Pr%C3%BCfung" rel="nofollow" class="external" title="Empfehle diesen Artikel bei Facebook">Empfehle diesen Artikel bei Facebook</a>
		</li>
		<li class="sexy-misterwong">
			<a href="http://www.mister-wong.de/addurl/?bm_url=http://blog.ebene7.com/2012/01/11/templatemethod-vs-method-exists-pruefung/&amp;bm_description=TemplateMethod+vs.+method_exists()-Pr%C3%BCfung&amp;plugin=sexybookmarks" rel="nofollow" class="external" title="Füge hinzu zu Mister Wong">Füge hinzu zu Mister Wong</a>
		</li>
		<li class="sexy-delicious">
			<a href="http://delicious.com/post?url=http://blog.ebene7.com/2012/01/11/templatemethod-vs-method-exists-pruefung/&amp;title=TemplateMethod+vs.+method_exists()-Pr%C3%BCfung" rel="nofollow" class="external" title="Empfehle diesen Artikel bei del.icio.us">Empfehle diesen Artikel bei del.icio.us</a>
		</li>
		<li class="sexy-technorati">
			<a href="http://technorati.com/faves?add=http://blog.ebene7.com/2012/01/11/templatemethod-vs-method-exists-pruefung/" rel="nofollow" class="external" title="Empfehle diesen Artikel bei Technorati">Empfehle diesen Artikel bei Technorati</a>
		</li>
		<li class="sexy-stumbleupon">
			<a href="http://www.stumbleupon.com/submit?url=http://blog.ebene7.com/2012/01/11/templatemethod-vs-method-exists-pruefung/&amp;title=TemplateMethod+vs.+method_exists()-Pr%C3%BCfung" rel="nofollow" class="external" title="Bei StumbleUpon einstellen">Bei StumbleUpon einstellen</a>
		</li>
		<li class="sexy-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://blog.ebene7.com/2012/01/11/templatemethod-vs-method-exists-pruefung/&amp;title=TemplateMethod+vs.+method_exists()-Pr%C3%BCfung" rel="nofollow" class="external" title="Digg this!">Digg this!</a>
		</li>
		<li class="sexy-myspace">
			<a href="http://www.myspace.com/Modules/PostTo/Pages/?u=http://blog.ebene7.com/2012/01/11/templatemethod-vs-method-exists-pruefung/&amp;t=TemplateMethod+vs.+method_exists()-Pr%C3%BCfung" rel="nofollow" class="external" title="Sende dies zu MySpace">Sende dies zu MySpace</a>
		</li>
		<li class="sexy-linkedin">
			<a href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http://blog.ebene7.com/2012/01/11/templatemethod-vs-method-exists-pruefung/&amp;title=TemplateMethod+vs.+method_exists()-Pr%C3%BCfung&amp;summary=Das%20Entwurfsmuster%20TemplateMethod%20kennen%20und%20nutzen%20sicherlich%20viele%20von%20euch.%20Sp%C3%A4testens,%20wenn%20irgendein%20Framework%20im%20Einsatz%20ist,%20hat%20man%20in%20der%20Regel%20damit%20zu%20tun,%20um%20z.B.%20an%20verschiedenen%20Stellen%20im%20Code%20eigene%20Funktionen%20in%20einen%20Ablauf%20einzuh%C3%A4ngen.%0D%0A%0D%0ADas%20Prinzip%20ist%20einfach:%20in%20der%20(abstrak&amp;source=ebene7" rel="nofollow" class="external" title="Empfehle diesen Artikel bei LinkedIn">Empfehle diesen Artikel bei LinkedIn</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>
<!-- End SexyBookmarks Menu Code -->

]]></content:encoded>
			<wfw:commentRss>http://www.phphatesme.com/blog/qualitatssicherung/templatemethod-vs-method_exists-prufung/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8220;Kunden, die diesen Artikel gekauft haben, kauften auch&#8221; in der Softwareentwicklung</title>
		<link>http://www.phphatesme.com/blog/softwaretechnik/kunden-die-diesen-artikel-gekauft-haben-kauften-auch-in-der-softwareentwicklung/</link>
		<comments>http://www.phphatesme.com/blog/softwaretechnik/kunden-die-diesen-artikel-gekauft-haben-kauften-auch-in-der-softwareentwicklung/#comments</comments>
		<pubDate>Fri, 25 Nov 2011 06:00:04 +0000</pubDate>
		<dc:creator>Nils Langner</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Projektwerkstatt]]></category>
		<category><![CDATA[Qualitätssicherung]]></category>
		<category><![CDATA[Softwaretechnik]]></category>

		<guid isPermaLink="false">http://www.phphatesme.com/?p=11303</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p>Zeit für Ideen. Leider nicht meine, sondern von einem anderen Held. Darüber erfahren hab ich über Sebastian Bergmann. Genug verwirrt? Aber eigentlich sollte die Idee im Mittelpunkt stellen, ich wollte nur mal schnell sagen, dass ich damit kaum was zu tun habe.</p>
<p>Wenn man Sebastian Bergmann hört, dann ist ja schon klar, dass es sich um ein QA- oder QM-Thema handelt und genau das ist es auch. im Prinzip geht es dabei nur um einen Commit-Hook. Ja ich weiß, da gibt es viele, aber was haltet ihr von der Idee, dass er einen darauf hinweist, wenn man vergessen hat eine Datei zu comitten oder sogar sie unzupassen? Hääh? Wie soll denn das gehen? Im Prinzip muss man nur folgende Aussage in den Raum stellen: &#8220;<strong>Wenn sie in der Vergangenheit Datei A comitted haben, dann haben sie auch immer Datei B angefasst.</strong>&#8221;</p>
<p>Finde den Ansatz genial. Er ist simpel und trotzdem scheint es effizient zu sein. So viel ich weiß, hat Sebastian dies sogar mal in PHP implementiert. Leider fehlen mir dazu die Links. Hatte mir nur die Idee gemerkt weil ich sie toll fand.</p>
<p>Ich würde ja gerne mehr darüber erzählen, aber die Idee ist ja schon in dem einen Satz wunderbar erklärt, deswegen wird es heute mal ein wenig kürzer und wir denken uns alle, wie toll es wäre, wenn wir das mal austesten dürften.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phphatesme.com/blog/softwaretechnik/kunden-die-diesen-artikel-gekauft-haben-kauften-auch-in-der-softwareentwicklung/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Quick and dirty auf Bewährung</title>
		<link>http://www.phphatesme.com/blog/softwaretechnik/quick-and-dirty-auf-bewahrung/</link>
		<comments>http://www.phphatesme.com/blog/softwaretechnik/quick-and-dirty-auf-bewahrung/#comments</comments>
		<pubDate>Fri, 16 Sep 2011 05:00:24 +0000</pubDate>
		<dc:creator>Nils Langner</dc:creator>
				<category><![CDATA[Projektmanagement]]></category>
		<category><![CDATA[Qualitätssicherung]]></category>
		<category><![CDATA[Softwaretechnik]]></category>

		<guid isPermaLink="false">http://www.phphatesme.com/?p=10457</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p>Wir Softwareentwickler haben doch im Grunde zwei große Probleme, die immer und überall auftreten. Das erste Problem ist Softwarequalität. Es muss schnell gehen und die oberen zehntausend sind sich sicher, dass Qualität teuer und somit das erste ist, was gestrichen werden kann. Unit Tests sind bei vielen Projekten also einfach nur Ballast. Ein weiteres großes Problem ist, dass wir häufig Dinge bauen, die kein Erfolg werden. Wie oft ich schon von Leuten gehört habe, dass ihre Idee mindestens den Weltfrieden bringen wird. Aber so etwas kennt ihr bestimmt alle. Ich würde mal sagen, dass 50% der Features, die ich in meinem Leben umgesetzt habe, besser abgeschaltet werden sollten.</p>
<p>Jetzt kombinieren wir diese beiden Punkte einfach einmal. Wir bauen Zeugs, welches wir eh wegwerfen und ärgern uns über die Qualität der Dinge, die wir bauen. Irgendwie ein Widerspruch. Warum hohe Qualität bei Software die wir eh nicht wirklich benötigen.</p>
<p>Inspiriert hat mich <a href="http://blog.koehntopp.de/archives/3143-Datenschutztheater.html">Kris Köhntopp</a>, als er ein wenig über den Alltag bei booking.com erzählt hat. <em>Wie könnte man also vorgehen?</em> Wir müssen unsere Software in zwei Teile gliedern. Der erste Teil beinhaltet alles, was sauber ist, zum Beispiel Core-Komponenten und auch erfolgreiche Features. Diese Gruppe muss sauber vom Aufbau und Testabdeckung sein. Mehr ist hier wirklich auch mehr.</p>
<p>Neue Features kommen erst mal in die Quarantänezone. Das geht bei kleineren und autarken Dingen wunderbar. Nehmen wir zum Beispiel die Top 5 Artikel auf phphatesme, wenn ich mir die Statistiken ansehe, wird mir klar, dass es ein unnötiges Feature ist. Also rausgeworfenes Geld, dass ich es damals sauber implementiert habe. Eigentlich hätte ich es &#8220;hinrotzen&#8221; sollen und im quick and dirty Verfahren eine Lösung bauen. Wenn das Feature dann ein Erfolg wird, wunderbar, dann machen wir es einfach neu oder setzen unser Optimierungsteam dran. Wenn es kein Erfolg wird: Abschalten.</p>
<p>Ja ich weiß, wenn es mal da ist, dann wird es auch genutzt und eure Produkt-Menschen werden sicher nicht wegwerfen, was schon da ist. Ich glaube, dass dies aber erstens eine Frage der Kommunikation ist und zweitens werden sie ganz schnell sehen, dass ihr Featuredurchsatz nach oben geht und die Dinge, die sich wirklich als erfolgreich herauskrsitalisiert haben eine bessere Qualität besitzen.  Schön war auch das Zitat von Kris &#8220;Wir haben jede Menge beschissenen Code da draußen, der uns reich macht&#8221;.</p>
<p>Nächstes Problem sind die Performance-Junkies. Das Tool muss irgendwann mal tausende von Usern abkönnen und deswegen brauchen wir Techologie X und es muss bis aufs kleinste optimiert sein. Am besten soll es auf einem Server laufen und und und. Bei mir ist es so, dass wir so viele Server im Betrieb haben, dass es kein Problem ist, wenn man noch mal welche hinzustellt. Was ich also sagen will. Wenn euer Tool/Feature im ersten Anlauf nicht viele User abkann, dann schlagt es mit Hardware tot. So teuer sind zwei Server in der Amazon-Cloud nicht, dass man sich das nicht leisten könnte.</p>
<p>Ich glaube, dass die Qualitätswelt mit einer solchen Vorgehensweise glücklich ist und auch die Entwickler, aber es bedeutet ein Umdenken im Prozess.</p>
<p>PS: Das ganze klappt nur bei Projekten und nicht bei Produkten. Sollte ich vielleicht noch zu dem Ansatz hinzufügen. Bei unseren redaktionellen Portalen wäre es ein Fortschritt.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phphatesme.com/blog/softwaretechnik/quick-and-dirty-auf-bewahrung/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>PHPUnit 3.5 unter Linux (Ubuntu) installieren</title>
		<link>http://www.phphatesme.com/blog/qualitatssicherung/phpunit-3-5-unter-linux-ubuntu-installieren/</link>
		<comments>http://www.phphatesme.com/blog/qualitatssicherung/phpunit-3-5-unter-linux-ubuntu-installieren/#comments</comments>
		<pubDate>Mon, 05 Sep 2011 04:00:45 +0000</pubDate>
		<dc:creator>ebene7</dc:creator>
				<category><![CDATA[phmnetwork]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Qualitätssicherung]]></category>

		<guid isPermaLink="false">http://blog.ebene7.com/?p=2955</guid>
		<description><![CDATA[Oftmals scheitert der Einsatz von Software-Tests leider schon mit der Installation der richtigen Software. Im Blog von Christopher habe ich einen handlichen Artikel zur Installation von PHPUnit 3.5 gefunden, der die wichtigsten Schritte kurz zusammen fasst. Das eigentliche Problem ist, dass bei der Installation der Standardpakete nur eine ältere Version von PHPUnit zur Verfügung steht [...]]]></description>
			<content:encoded><![CDATA[<p>Oftmals scheitert der Einsatz von Software-Tests leider schon mit der Installation der richtigen Software. Im Blog von Christopher habe ich einen handlichen Artikel zur <a href="http://cgarvis.tumblr.com/post/4024357504/installing-phpunit-3-5-on-ubuntu-10-10" >Installation von PHPUnit 3.5</a> gefunden, der die wichtigsten Schritte kurz zusammen fasst. <span id="more-2955"></span></p>
<p>Das eigentliche Problem ist, dass bei der Installation der Standardpakete nur eine ältere Version von PHPUnit zur Verfügung steht und sich verschiedene Funktionen im Framework geändert haben.</p>
<p><span style="color: #ff0000;"><strong>Warnung: Ihr verändert durch die Installation das System und tut das auf eigene Verantwortung! </strong></span></p>
<p>Zunächst erstmal PHP und PEAR installieren, bzw. auf den neusten Stand bringen:</p>
<pre>sudo apt-get update
sudo apt-get upgrade
sudo apt-get install -y php-pear php5-curl php5-xdebug
sudo pear channel-update pear.php.net
sudo pear upgrade-all</pre>
<p>Nachdem das Upgrade durchgelaufen ist (kann eine Weile dauern), können wir dann PHPUnit installieren.</p>
<pre>sudo pear channel-discover pear.phpunit.de
sudo pear channel-discover components.ez.no
sudo pear channel-discover pear.symfony-project.com
sudo pear install --alldeps phpunit/PHPUnit</pre>
<p>Zum Schluss prüfen wir noch schnell, ob wir wirklich die gewünschte Version installiert haben.</p>
<pre>developer@developer:~$ phpunit --version
PHPUnit 3.5.15 by Sebastian Bergmann.</pre>
<p>Nun dann, viel Spaß beim Testen!</p>


<!-- Begin SexyBookmarks Menu Code -->
<div class="sexy-bookmarks sexy-bookmarks-expand sexy-bookmarks-center sexy-bookmarks-bg-caring-old">
<ul class="socials">
		<li class="sexy-comfeed">
			<a href="http://blog.ebene7.com/2011/09/05/phpunit-3-5-unter-linux-ubuntu-installieren/feed" rel="nofollow" class="external" title="Abonniere die Kommentare für diesen Beitrag">Abonniere die Kommentare für diesen Beitrag</a>
		</li>
		<li class="sexy-twitter">
			<a href="http://twitter.com/home?status=PHPUnit+3.5+unter+Linux+%28Ubuntu%29+installieren+-+http://bit.ly/o6ZnV5+&amp;source=shareaholic" rel="nofollow" class="external" title="Twittere diesen Artikel!">Twittere diesen Artikel!</a>
		</li>
		<li class="sexy-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://blog.ebene7.com/2011/09/05/phpunit-3-5-unter-linux-ubuntu-installieren/&amp;t=PHPUnit+3.5+unter+Linux+%28Ubuntu%29+installieren" rel="nofollow" class="external" title="Empfehle diesen Artikel bei Facebook">Empfehle diesen Artikel bei Facebook</a>
		</li>
		<li class="sexy-misterwong">
			<a href="http://www.mister-wong.de/addurl/?bm_url=http://blog.ebene7.com/2011/09/05/phpunit-3-5-unter-linux-ubuntu-installieren/&amp;bm_description=PHPUnit+3.5+unter+Linux+%28Ubuntu%29+installieren&amp;plugin=sexybookmarks" rel="nofollow" class="external" title="Füge hinzu zu Mister Wong">Füge hinzu zu Mister Wong</a>
		</li>
		<li class="sexy-delicious">
			<a href="http://delicious.com/post?url=http://blog.ebene7.com/2011/09/05/phpunit-3-5-unter-linux-ubuntu-installieren/&amp;title=PHPUnit+3.5+unter+Linux+%28Ubuntu%29+installieren" rel="nofollow" class="external" title="Empfehle diesen Artikel bei del.icio.us">Empfehle diesen Artikel bei del.icio.us</a>
		</li>
		<li class="sexy-technorati">
			<a href="http://technorati.com/faves?add=http://blog.ebene7.com/2011/09/05/phpunit-3-5-unter-linux-ubuntu-installieren/" rel="nofollow" class="external" title="Empfehle diesen Artikel bei Technorati">Empfehle diesen Artikel bei Technorati</a>
		</li>
		<li class="sexy-stumbleupon">
			<a href="http://www.stumbleupon.com/submit?url=http://blog.ebene7.com/2011/09/05/phpunit-3-5-unter-linux-ubuntu-installieren/&amp;title=PHPUnit+3.5+unter+Linux+%28Ubuntu%29+installieren" rel="nofollow" class="external" title="Bei StumbleUpon einstellen">Bei StumbleUpon einstellen</a>
		</li>
		<li class="sexy-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://blog.ebene7.com/2011/09/05/phpunit-3-5-unter-linux-ubuntu-installieren/&amp;title=PHPUnit+3.5+unter+Linux+%28Ubuntu%29+installieren" rel="nofollow" class="external" title="Digg this!">Digg this!</a>
		</li>
		<li class="sexy-myspace">
			<a href="http://www.myspace.com/Modules/PostTo/Pages/?u=http://blog.ebene7.com/2011/09/05/phpunit-3-5-unter-linux-ubuntu-installieren/&amp;t=PHPUnit+3.5+unter+Linux+%28Ubuntu%29+installieren" rel="nofollow" class="external" title="Sende dies zu MySpace">Sende dies zu MySpace</a>
		</li>
		<li class="sexy-linkedin">
			<a href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http://blog.ebene7.com/2011/09/05/phpunit-3-5-unter-linux-ubuntu-installieren/&amp;title=PHPUnit+3.5+unter+Linux+%28Ubuntu%29+installieren&amp;summary=Oftmals%20scheitert%20der%20Einsatz%20von%20Software-Tests%20leider%20schon%20mit%20der%20Installation%20der%20richtigen%20Software.%20Im%20Blog%20von%20Christopher%20habe%20ich%20einen%20handlichen%20Artikel%20zur%20Installation%20von%20PHPUnit%203.5%20gefunden%2C%20der%20die%20wichtigsten%20Schritte%20kurz%20zusammen%20fasst.%20%0D%0A%0D%0ADas%20eigentliche%20Problem%20ist%2C%20dass%20bei%20&amp;source=ebene7" rel="nofollow" class="external" title="Empfehle diesen Artikel bei LinkedIn">Empfehle diesen Artikel bei LinkedIn</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>
<!-- End SexyBookmarks Menu Code -->

]]></content:encoded>
			<wfw:commentRss>http://www.phphatesme.com/blog/qualitatssicherung/phpunit-3-5-unter-linux-ubuntu-installieren/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Unser größtes Problem &#8230;</title>
		<link>http://www.phphatesme.com/blog/qualitatssicherung/unser-grostes-problem/</link>
		<comments>http://www.phphatesme.com/blog/qualitatssicherung/unser-grostes-problem/#comments</comments>
		<pubDate>Fri, 26 Aug 2011 05:00:20 +0000</pubDate>
		<dc:creator>Nils Langner</dc:creator>
				<category><![CDATA[Projektmanagement]]></category>
		<category><![CDATA[Qualitätssicherung]]></category>

		<guid isPermaLink="false">http://www.phphatesme.com/?p=10173</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p>Lang lang ist&#8217;s her, dass ich einen Artikel geschrieben habe. Das ist zum einen der Froscon geschuldet und zum anderen meiner Elternzeit. Beides ist bis jetzt wirklich gut. Ok, die <a href="http://www.froscon.de">Froscon</a> war gut, um nicht zu sagen, sehr gut. Es war auch das erste mal, dass ich auf einer öffentlichen Konferenz gesprochen habe. Hat mir Spaß gemacht und ich habe rausgefunden, dass Mike und ich da vorne wirklich ein gutes Gespann sind, was wir übrigens noch drei mal dieses Jahr bestätigen werden, denn auf so vielen Konferenzen wurden wir angenommen. Spannendes Jahr.</p>
<p>Jetzt aber wieder zum eigentlichen Thema. Heute geht es um Qualitätsmanagement. Also nicht so richtig. Eigentlich geht es um einen Bestandteil der Entwicklungsprozesses. Vor einiger Zeit wurde ich zu einem Projekt hinzugerufen, in dem schon einiges im Argen war. Das Team hatte nicht mehr so viel Vertrauen in die Projektleitung, wie man sich das vielleicht wünschen würde. Als ich dann mit dem &#8220;Chefentwickler&#8221; geredet hatte, war die wichtigste Aussage &#8220;<strong>Unser größtes Problem ist, dass wir zu viele Probleme haben</strong>&#8220;.</p>
<p>Für die Entwickler war dies wirklich so. Jeder kannte mindestens vier große Probleme und jeder wusste, dass es damals ja auch noch viel mehr gab, an die man sich im Moment auch leider nicht erinnere. Was diese Probleme natürlich nicht löste. Ein ganz ungutes Gefühl Bauchgefühl schwingte bei diesem Projekt immer mit. Ein ordentliches Risikomanagement wurde bis dato auch nicht aufgesetzt.</p>
<p>Womit wir dann begonnen haben ist eine Bestandsaufnahme zu etablieren. Diese Aufnahme umfasste nur die Probleme. Wir sind also hingegangen und haben jeden aus dem Team interviewt. Am Ende hatten wir eine Excel-Tabelle zusammen mit allen bekannten Problemen und siehe da, es waren gar nicht so viele, wie gedacht. Und alleine dieses definitive Wissen um die Anzahl und Relevanz der Dinge, die momentan kritisch waren, gab dem Team ein gutes Gefühl. Auf einmal konnte man den Stand des Projektes besser einschätzen.</p>
<p>In unserem Fall haben wir diese Bestandsaufnahme zu einem festen Ritual gemacht. Einmal alle zwei Wochen sitzt jemand vom Qualitätsmanagement mit einem Entwickler zusammen und aktualisiert die Liste, die nun auch nach Relevanz sortiert ist. Probleme, dir gelöst wurden, werden ans Ende geschrieben und neue Punkte einsortiert.</p>
<p>Durch eine einfache Liste mit Problemen schafft man es das Bauchgefühl der Entwickler in wirkliche Fakten umzuwandeln. In den meisten Fällen, ist es nicht so schlimm, wie man glaubt. Wer ein richtiges Risikomanagement etablieren kann, ist natürlich besser beraten, aber in einigen Fällen fehlen dort sowohl Wissen, als auch Zeit.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phphatesme.com/blog/qualitatssicherung/unser-grostes-problem/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Ausgelagerte Ablaufkontrolle dank Retry-Proxy</title>
		<link>http://www.phphatesme.com/blog/qualitatssicherung/ausgelagerte-ablaufkontrolle-dank-retry-proxy/</link>
		<comments>http://www.phphatesme.com/blog/qualitatssicherung/ausgelagerte-ablaufkontrolle-dank-retry-proxy/#comments</comments>
		<pubDate>Thu, 11 Aug 2011 04:00:09 +0000</pubDate>
		<dc:creator>ebene7</dc:creator>
				<category><![CDATA[phmnetwork]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Qualitätssicherung]]></category>

		<guid isPermaLink="false">http://blog.ebene7.com/?p=2910</guid>
		<description><![CDATA[Neulich bin ich während der Arbeit auf ein kleines Problem gestoßen, welches sich eigentlich sehr einfach lösen lies. Da ich diese Lösung aber nicht wirklich toll fand und ja auch schon länger keinen Artikel mehr geschrieben habe, habe ich mir also ein paar Gedanken dazu gemacht und schreibe heute zum Thema Proxy. Was ist aber [...]]]></description>
			<content:encoded><![CDATA[<p>Neulich bin ich während der Arbeit auf ein kleines Problem gestoßen, welches sich eigentlich sehr einfach lösen lies. Da ich diese Lösung aber nicht wirklich toll fand und ja auch schon länger keinen Artikel mehr geschrieben habe, habe ich mir also ein paar Gedanken dazu gemacht und schreibe heute zum Thema <a href="http://blog.ebene7.com/2009/12/29/decorator-adapter-oder-proxy-was-bist-du-eigentlich/" >Proxy</a>.<span id="more-2910"></span></p>
<p>Was ist aber eigentlich passiert? Für eine bestimmte Aufgabe musste ich Daten in der SimpleDB (Amazon Webservices) zwischengespeichern und dann an anderer Stelle weiter verarbeitet. Nun passiert es hin und wieder, dass meine Weiterleitung schneller als die Datenbank war und ich die Daten (noch) nicht lesen konnte.</p>
<p>Was macht man in diesem Fall? Abwarten, Tee trinken und nochmal probieren. In dem Fall kamen ein paar Zeilen Code dazu und alles lief wie gewünscht. Wirklich schick ist das jedoch so noch nicht.</p>
<p>Erstmal eine einfach Beipielklasse im PHP-Pseudocode zum besseren Verständnis:</p>
<pre>&lt;?php
class SomeWebResource
{
  public function load($key)
  {
    // do something
    return $data;
  }

  public function save($key, $data)
  {
    // do something
    return $flag;
  }

  public function delete($key)
  {
    // do something
    return $flag;
  }
}</pre>
<p>In diesem Beispiel hat unsere Klasse drei Methoden, in denen die selben oder zumindest ähnliche Probleme auftreten können. Die Daten haben das falsche Format, der Webservice ist nicht erreichbar oder was auch immer.</p>
<p>Für diesen Fall bauen wir dann nun die Wiederholung ein.</p>
<pre>&lt;?php
class SomeWebResource
{
  public function load($key)
  {
    $count = 0;
    do {
      try {
        // do something
        return $data;
      } catch (Exception $e) {
        sleep(1);
      }
    } while (3 &gt; $count++);
  }

  public function save($key, $data)
  {
    $count = 0;
    do {
      try {
        // do something
        return $flag;
      } catch (Exception $e) {
        sleep(1);
      }
    } while (3 &gt; $count++);
  }

  public function delete($key)
  {
    $count = 0;
    do {
      try {
        // do something
        return $flag;
      } catch (Exception $e) {
        sleep(1);
      }
    } while (3 &gt; $count++);
  }
}</pre>
<p>Spontan sollten nun jedem mindestens drei Dinge auffallen. Der Code ist gleich um etliche Zeilen länger und wiederholt sich, man könnte fast ein Muster (Pattern) erkennen. Der Code ist nicht wirklich flexibel, wenn es darum geht die Wartezeit oder die Anzahl der Versuche zu konfigurieren. Der Code ist immer da und lässt sich so nicht mehr ohne die Wiederholung ausführen und es ist nicht die Aufgabe dieser Klasse die Wiederholungen zu kontrollieren.</p>
<p>In dem Fall schreit es doch gerade danach, diesen Code recyclebar auszulagern, findet ihr nicht?</p>
<p>Dafür brauchen wir nur eine einfache Proxy-Klasse. Ok, bevor jetzt jemand protestiert, dass sei doch garnicht das Proxy-Pattern, stimmt! Wir leiten die Proxy-Klasse nicht von der Klasse &#8220;SomeWebResource&#8221; ab und haben dadurch eine andere Schnittstelle. In diesem Fall ist das aber egal, denn wir leiten ja auch nur den Methodenaufruf weiter.</p>
<p>Nun aber erstmal die <a href="http://blog.ebene7.com/download/code/E7/Tools/RetryProxy.txt" >RetryProxy</a>-Klasse:</p>
<pre>&lt;?php
class E7_Tools_RetryProxy
{
  // some other methods

  public function call($callback)
  {
    $exception = null;
    $count = 0;
    $args = func_get_args();
    array_shift($args);

    do {
      try {
        return call_user_func_array($callback, $args);
      } catch (Exception $e) {
        $exception = $e;
        sleep($this-&gt;getDelay());
      }
    } while ($this-&gt;getRepititions() &gt; $count++);

    if ($exception instanceof Exception) {
      throw $exception;
    }
  }
}</pre>
<p>Auch hier lässt sich natürlich das selbe Muster erkennen, aber wir haben es von jeder weitern Logik entkoppelt und die gewünschten Werte lassen sich nun einfach über die Setter einstellen.</p>
<p>Die Verwendung ist später ebenfalls einfach.</p>
<pre>&lt;?php
$proxy = new E7_Tools_RetryProxy();
$swr   = new SomeWebResource();
$data  = $proxy-&gt;call(array($swr, 'load'), 42);</pre>
<p>Wer damit etwas experimentieren will, findet die komplette Klasse <a href="http://blog.ebene7.com/download/code/E7/Tools/RetryProxy.txt" >hier</a>. Wie immer freue ich mich natürlich über möglichst zahlreiche Kommentare.</p>


<!-- Begin SexyBookmarks Menu Code -->
<div class="sexy-bookmarks sexy-bookmarks-expand sexy-bookmarks-center sexy-bookmarks-bg-caring-old">
<ul class="socials">
		<li class="sexy-comfeed">
			<a href="http://blog.ebene7.com/2011/08/11/ausgelagerte-ablaufkontrolle-dank-retry-proxy/feed" rel="nofollow" class="external" title="Abonniere die Kommentare für diesen Beitrag">Abonniere die Kommentare für diesen Beitrag</a>
		</li>
		<li class="sexy-twitter">
			<a href="http://twitter.com/home?status=Ausgelagerte+Ablaufkontrolle+dank+Retry-Proxy+-+http://bit.ly/oXq6pf+&amp;source=shareaholic" rel="nofollow" class="external" title="Twittere diesen Artikel!">Twittere diesen Artikel!</a>
		</li>
		<li class="sexy-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://blog.ebene7.com/2011/08/11/ausgelagerte-ablaufkontrolle-dank-retry-proxy/&amp;t=Ausgelagerte+Ablaufkontrolle+dank+Retry-Proxy" rel="nofollow" class="external" title="Empfehle diesen Artikel bei Facebook">Empfehle diesen Artikel bei Facebook</a>
		</li>
		<li class="sexy-misterwong">
			<a href="http://www.mister-wong.de/addurl/?bm_url=http://blog.ebene7.com/2011/08/11/ausgelagerte-ablaufkontrolle-dank-retry-proxy/&amp;bm_description=Ausgelagerte+Ablaufkontrolle+dank+Retry-Proxy&amp;plugin=sexybookmarks" rel="nofollow" class="external" title="Füge hinzu zu Mister Wong">Füge hinzu zu Mister Wong</a>
		</li>
		<li class="sexy-delicious">
			<a href="http://delicious.com/post?url=http://blog.ebene7.com/2011/08/11/ausgelagerte-ablaufkontrolle-dank-retry-proxy/&amp;title=Ausgelagerte+Ablaufkontrolle+dank+Retry-Proxy" rel="nofollow" class="external" title="Empfehle diesen Artikel bei del.icio.us">Empfehle diesen Artikel bei del.icio.us</a>
		</li>
		<li class="sexy-technorati">
			<a href="http://technorati.com/faves?add=http://blog.ebene7.com/2011/08/11/ausgelagerte-ablaufkontrolle-dank-retry-proxy/" rel="nofollow" class="external" title="Empfehle diesen Artikel bei Technorati">Empfehle diesen Artikel bei Technorati</a>
		</li>
		<li class="sexy-stumbleupon">
			<a href="http://www.stumbleupon.com/submit?url=http://blog.ebene7.com/2011/08/11/ausgelagerte-ablaufkontrolle-dank-retry-proxy/&amp;title=Ausgelagerte+Ablaufkontrolle+dank+Retry-Proxy" rel="nofollow" class="external" title="Bei StumbleUpon einstellen">Bei StumbleUpon einstellen</a>
		</li>
		<li class="sexy-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://blog.ebene7.com/2011/08/11/ausgelagerte-ablaufkontrolle-dank-retry-proxy/&amp;title=Ausgelagerte+Ablaufkontrolle+dank+Retry-Proxy" rel="nofollow" class="external" title="Digg this!">Digg this!</a>
		</li>
		<li class="sexy-myspace">
			<a href="http://www.myspace.com/Modules/PostTo/Pages/?u=http://blog.ebene7.com/2011/08/11/ausgelagerte-ablaufkontrolle-dank-retry-proxy/&amp;t=Ausgelagerte+Ablaufkontrolle+dank+Retry-Proxy" rel="nofollow" class="external" title="Sende dies zu MySpace">Sende dies zu MySpace</a>
		</li>
		<li class="sexy-linkedin">
			<a href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http://blog.ebene7.com/2011/08/11/ausgelagerte-ablaufkontrolle-dank-retry-proxy/&amp;title=Ausgelagerte+Ablaufkontrolle+dank+Retry-Proxy&amp;summary=Neulich%20bin%20ich%20w%C3%A4hrend%20der%20Arbeit%20auf%20ein%20kleines%20Problem%20gesto%C3%9Fen%2C%20welches%20sich%20eigentlich%20sehr%20einfach%20l%C3%B6sen%20lies.%20Da%20ich%20diese%20L%C3%B6sung%20aber%20nicht%20wirklich%20toll%20fand%20und%20ja%20auch%20schon%20l%C3%A4nger%20keinen%20Artikel%20mehr%20geschrieben%20habe%2C%20habe%20ich%20mir%20also%20ein%20paar%20Gedanken%20dazu%20gemacht%20und%20schreibe%20he&amp;source=ebene7" rel="nofollow" class="external" title="Empfehle diesen Artikel bei LinkedIn">Empfehle diesen Artikel bei LinkedIn</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>
<!-- End SexyBookmarks Menu Code -->

]]></content:encoded>
			<wfw:commentRss>http://www.phphatesme.com/blog/qualitatssicherung/ausgelagerte-ablaufkontrolle-dank-retry-proxy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>You&#8217;re doing it wrong</title>
		<link>http://www.phphatesme.com/blog/tools/youre-doing-it-wrong/</link>
		<comments>http://www.phphatesme.com/blog/tools/youre-doing-it-wrong/#comments</comments>
		<pubDate>Tue, 26 Jul 2011 13:00:00 +0000</pubDate>
		<dc:creator>Nils Langner</dc:creator>
				<category><![CDATA[Qualitätssicherung]]></category>
		<category><![CDATA[Tools & Helferlein]]></category>
		<category><![CDATA[Vorträge]]></category>

		<guid isPermaLink="false">http://www.phphatesme.com/blog/tools/youre-doing-it-wrong/</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p>Selenium anti-patterns and how to start to address them.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phphatesme.com/blog/tools/youre-doing-it-wrong/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

