<?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>Björns Choice</title>
	<atom:link href="http://www.bjoerns-choice.de/feed" rel="self" type="application/rss+xml" />
	<link>http://www.bjoerns-choice.de</link>
	<description>What choice do I have?</description>
	<lastBuildDate>Wed, 04 Apr 2012 05:51:41 +0000</lastBuildDate>
	<language>de-DE</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4-beta4-20742</generator>
		<item>
		<title>Firebug: Logfunktionen</title>
		<link>http://www.bjoerns-choice.de/archives/491?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=firebug-logfunktionen</link>
		<comments>http://www.bjoerns-choice.de/archives/491#comments</comments>
		<pubDate>Wed, 04 Apr 2012 05:50:58 +0000</pubDate>
		<dc:creator>Björn</dc:creator>
				<category><![CDATA[Computer]]></category>
		<category><![CDATA[Tutorials]]></category>

		<guid isPermaLink="false">http://www.bjoerns-choice.de/?p=491</guid>
		<description><![CDATA[Viele Entwickler betrachten Firebug als die Mutter aller Web-Tools. Diese Ansicht ist durchaus begründet, denn Firebug umfassst mächtige Werkzeuge, mit welchen man so ziemlich alles machen kann, was man als Webentwickler so täglich braucht, angefangen von kleineren CSS-Experimenten bishin zum Debuggen von komplexen JScript-Anwendungen sowie dem Profiling von Webseiten. Was nicht ganz so bekannt ist, [...]]]></description>
			<content:encoded><![CDATA[<p>Viele Entwickler betrachten <a href="http://getfirebug.com/">Firebug</a> als die Mutter aller Web-Tools. Diese Ansicht ist durchaus begründet, denn Firebug umfassst mächtige Werkzeuge, mit welchen man so ziemlich alles machen kann, was man als Webentwickler so täglich braucht, angefangen von kleineren CSS-Experimenten bishin zum Debuggen von komplexen JScript-Anwendungen sowie dem Profiling von Webseiten.</p>
<p>Was nicht ganz so bekannt ist, man kann sogar über den Firebug aus JScript heraus Debug-Logs generieren.</p>
<p>Beispielsweise gibt&#8230;</p>
<pre class="brush: jscript; title: ; notranslate">
console.log('Hallo Welt!');
</pre>
<p>&#8230;genau diesen Text in der Konsole aus.</p>
<p>Das kann man noch etwas verfeinern, denn schließlich unterscheidet man Infos, Warnings, Errors und Debugs!</p>
<pre class="brush: jscript; title: ; notranslate">
console.debug('Debug');
console.info('Information');
console.warn('Warnung');
console.error('Fehler');
</pre>
<p>Und auch die Ausgabe von Variablen kommt nicht zu kurz:</p>
<pre class="brush: jscript; title: ; notranslate">
var banane = 1.234;
var orange = &quot;Test&quot;;
console.log(&quot;Mein %a hat den Wert %d&quot;, orange, banane);
</pre>
<p>Ästheten können auch Gruppen bilden, welche in der Konsole sauber dargestellt werden:</p>
<pre class="brush: jscript; title: ; notranslate">
console.group('meine Gruppe');
    console.info('Info1');
    console.debug('Was ich wissen wollte...');
console.groupEnd();
</pre>
<p>Über noch mehr Möglichkeiten dieser Funktionen, wie z.B. Zeitwerte, Stacks u.s.w kann man sich <a href="http://getfirebug.com/logging">hier auf der Seite von Firebug</a> informieren.</p>
<p>Übrigens:<br />
Die meisten dieser Funktionen sind mittlerweile auch im Debugger des Google Chrome verfügbar!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bjoerns-choice.de/archives/491/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>kreatives WAIT-Kommando für DOS</title>
		<link>http://www.bjoerns-choice.de/archives/483?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=kreatives-wait-kommando-fur-dos</link>
		<comments>http://www.bjoerns-choice.de/archives/483#comments</comments>
		<pubDate>Mon, 19 Mar 2012 13:03:39 +0000</pubDate>
		<dc:creator>Björn</dc:creator>
				<category><![CDATA[Computer]]></category>
		<category><![CDATA[Tutorials]]></category>

		<guid isPermaLink="false">http://www.bjoerns-choice.de/?p=483</guid>
		<description><![CDATA[Vielleicht standen Sie auch mal vor dieser Thematik: Es gibt keinen direkten Weg, ein einfaches WAIT-Kommando in DOS zu stricken. Während ich an einer Lösung für eine kleine Aufgabe arbeitete, stolperte ich über einen sehr kreativen Weg, dies zu lösen: Ja, genau. Das PING-Kommando kann als WAIT-Alternative verwendet werden! Ein paar ergänzende Erklärungen: Die IP-Adresse [...]]]></description>
			<content:encoded><![CDATA[<p>Vielleicht standen Sie auch mal vor dieser Thematik: Es gibt keinen direkten Weg, ein einfaches WAIT-Kommando in DOS zu stricken. Während ich an einer Lösung für eine kleine Aufgabe arbeitete, stolperte ich über einen sehr kreativen Weg, dies zu lösen:</p>
<pre class="brush: php; title: ; notranslate">
PING 1.1.1.1 -n 1 -w 25000 &gt;nul
</pre>
<p>Ja, genau. Das PING-Kommando kann als WAIT-Alternative verwendet werden!</p>
<p>Ein paar ergänzende Erklärungen:</p>
<ul>
<li>Die IP-Adresse 1.1.1.1 verweist auf das erste Netzwerk-Device/Karte, daher sollte diese Adresse in den allermeisten Fällen für ein System verfügbar sein.</li>
<li>Der Parameter <code>-n 1</code> setzt die Anzahl der Ping-Versuche auf 1.</li>
<li>Der zweite Parameter -w steht für die Wartezeit. Bitte beachten Sie, dass hier die Angabe in Millisekunden erfolgt, sodass der im Beispiel verwendete Wert 25000 tatsächlich 25 Sekunden entspricht.</li>
<li><code>>NUL</code> routet den Datenstrom aus dem Output in das sogenannte Null-Device, damit wird jede Eingabe oder Antwort dieses Streams akzeptiert und weggelöscht.</li>
</ul>
<p>Natürlich versuche ich immer, WAIT-Operationen in Programmen und Scripts zu vermeiden, aber manchmal hilft es doch, gerade beim Testen. Außerdem ist dies kein sehr exakter Ansatz, hier sollte man also nicht mit einer Atomuhr nachmessen. Dennoch ist dieser kreative Ansatz eine kleine, aber feine Lösung, falls man doch mal um ein WAIT nicht herumkommt&#8230;!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bjoerns-choice.de/archives/483/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Otherland: Bald im Kino?</title>
		<link>http://www.bjoerns-choice.de/archives/479?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=otherland-bald-im-kino</link>
		<comments>http://www.bjoerns-choice.de/archives/479#comments</comments>
		<pubDate>Thu, 19 Jan 2012 21:25:28 +0000</pubDate>
		<dc:creator>Björn</dc:creator>
				<category><![CDATA[Film & Fernsehen]]></category>

		<guid isPermaLink="false">http://www.bjoerns-choice.de/?p=479</guid>
		<description><![CDATA[Scheinbar traut sich wohl ein kleines Filmstudio namens Warner an die Umsetzung der kongenialen Science-Fiction-Saga Otherland von Tad Williams. Mutig, mutig! Hier gibt es den Artikel des Variety Magazins.]]></description>
			<content:encoded><![CDATA[<p>Scheinbar traut sich wohl ein kleines Filmstudio namens Warner an die Umsetzung der kongenialen Science-Fiction-Saga Otherland von Tad Williams. Mutig, mutig!</p>
<p><a href="http://www.variety.com/article/VR1118048854">Hier gibt es den Artikel</a> des Variety Magazins. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.bjoerns-choice.de/archives/479/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>11.11.11</title>
		<link>http://www.bjoerns-choice.de/archives/476?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=11-11-11</link>
		<comments>http://www.bjoerns-choice.de/archives/476#comments</comments>
		<pubDate>Fri, 11 Nov 2011 07:14:46 +0000</pubDate>
		<dc:creator>Björn</dc:creator>
				<category><![CDATA[Aktuelles]]></category>

		<guid isPermaLink="false">http://www.bjoerns-choice.de/?p=476</guid>
		<description><![CDATA[Tolles Datum: 11.11.11 Noch Fragen!?]]></description>
			<content:encoded><![CDATA[<p>Tolles Datum: 11.11.11</p>
<p>Noch Fragen!?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bjoerns-choice.de/archives/476/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Visualisierung von Sortierverfahren</title>
		<link>http://www.bjoerns-choice.de/archives/470?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=visualisierung-von-sortierverfahren</link>
		<comments>http://www.bjoerns-choice.de/archives/470#comments</comments>
		<pubDate>Wed, 28 Sep 2011 05:43:57 +0000</pubDate>
		<dc:creator>Björn</dc:creator>
				<category><![CDATA[Fundstücke]]></category>
		<category><![CDATA[Tutorials]]></category>

		<guid isPermaLink="false">http://www.bjoerns-choice.de/?p=470</guid>
		<description><![CDATA[Die Entwicklung von Sortierverfahren mag zwar für Nicht-Entwickler etwas wie schwarze Magie wirken, ist aber für einen Entwickler Grundwissen. Eine gute, Coffescript-basierte Seite, welche dieses doch manchmal relativ abstrakte Thema on-thy-fly visualisiert, kann hier gefunden werden: http://visualsort.appspot.com]]></description>
			<content:encoded><![CDATA[<p>Die Entwicklung von Sortierverfahren mag zwar für Nicht-Entwickler etwas wie schwarze Magie wirken, ist aber für einen Entwickler Grundwissen.</p>
<p>Eine gute, Coffescript-basierte Seite, welche dieses doch manchmal relativ abstrakte Thema on-thy-fly visualisiert, kann hier gefunden werden:</p>
<p><a href="http://visualsort.appspot.com" title="Visualisierung von Sortierverfahren" target="_blank">http://visualsort.appspot.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bjoerns-choice.de/archives/470/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IT-Weisheiten im Juni</title>
		<link>http://www.bjoerns-choice.de/archives/466?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=it-weisheiten-im-juni</link>
		<comments>http://www.bjoerns-choice.de/archives/466#comments</comments>
		<pubDate>Thu, 30 Jun 2011 10:35:19 +0000</pubDate>
		<dc:creator>Björn</dc:creator>
				<category><![CDATA[Computer]]></category>

		<guid isPermaLink="false">http://www.bjoerns-choice.de/?p=466</guid>
		<description><![CDATA[Weisheit 1: Falls Flash-Anwendungen im Firefox den Browser reproduzierbar zum Absturz bringen, sollte man prüfen, ob in der Flashkonfiguration die Hardwarebeschleunigung aktiviert ist. Weisheit 2: Falls die Authentifizierung von Clients einer einfachen Windows-Heimnetzgruppe nicht funktioniert, könnte es auch daran liegen, dass die Systemzeit der Clients voneinander abweichen. Weisheit 3: VPN-Probleme können durchaus auch durch einen [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Weisheit 1:</strong><br />
Falls Flash-Anwendungen im Firefox den Browser reproduzierbar zum Absturz bringen, sollte man prüfen, ob in der Flashkonfiguration die Hardwarebeschleunigung aktiviert ist.</p>
<p><strong>Weisheit 2:</strong><br />
Falls die Authentifizierung von Clients einer einfachen Windows-Heimnetzgruppe nicht funktioniert, könnte es auch daran liegen, dass die Systemzeit der Clients voneinander abweichen.<br />
<strong><br />
Weisheit 3:</strong><br />
VPN-Probleme können durchaus auch durch einen alten Router ausgelöst werden.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bjoerns-choice.de/archives/466/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Bohemian Rhapsody</title>
		<link>http://www.bjoerns-choice.de/archives/461?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=bohemian-rhapsody</link>
		<comments>http://www.bjoerns-choice.de/archives/461#comments</comments>
		<pubDate>Sat, 18 Jun 2011 12:43:16 +0000</pubDate>
		<dc:creator>Björn</dc:creator>
				<category><![CDATA[Fundstücke]]></category>
		<category><![CDATA[Musikalien]]></category>

		<guid isPermaLink="false">http://www.bjoerns-choice.de/?p=461</guid>
		<description><![CDATA[Respekt&#8230;!]]></description>
			<content:encoded><![CDATA[<p>Respekt&#8230;!</p>
<p><iframe width="450" height="256" src="http://www.youtube.com/embed/irLsjBDPe5c" frameborder="0" allowfullscreen></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bjoerns-choice.de/archives/461/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Biometrie im Bad Orber Freibad: Provinzposse oder zukunftsweisendes Verfahren?</title>
		<link>http://www.bjoerns-choice.de/archives/449?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=biometrie-im-bad-orber-freibad-provinzposse-oder-zukunftsweisendes-verfahren</link>
		<comments>http://www.bjoerns-choice.de/archives/449#comments</comments>
		<pubDate>Sat, 28 May 2011 11:32:39 +0000</pubDate>
		<dc:creator>Björn</dc:creator>
				<category><![CDATA[Aktuelles]]></category>

		<guid isPermaLink="false">http://www.bjoerns-choice.de/?p=449</guid>
		<description><![CDATA[Im Laufe dieser Woche erfuhr ich via Buschfunk von der Nachricht, dass das Zuganssystem des Freischwimmbades im altehrwürdigen Kurort Bad Orb mit einem Fingerabdruck-Verfahren ausgestattet wurde. Nicht nur der Buschfunk funktioniert, natürlich wurde das System überparteilich behandelt und erhielt mediale Aufmerksamkeit (Hessischer Rundfunk, Frankfurter Rundschau, Frankfurter Neue Presse, auch Sat1 meldete sich). Die Stadt will [...]]]></description>
			<content:encoded><![CDATA[<p>Im Laufe dieser Woche erfuhr ich via Buschfunk von der Nachricht, dass das Zuganssystem des Freischwimmbades im altehrwürdigen Kurort Bad Orb mit einem Fingerabdruck-Verfahren ausgestattet wurde.</p>
<p>Nicht nur der Buschfunk funktioniert, natürlich wurde das System überparteilich behandelt und erhielt mediale Aufmerksamkeit (<a href="http://www.hr-online.de/website/rubriken/nachrichten/indexhessen34938.jsp?rubrik=36082&#038;key=standard_document_41617783">Hessischer Rundfunk</a>, <a href="http://www.fr-online.de/rhein-main/eintritt-per-fingerabdruck/-/1472796/8493866/-/index.html">Frankfurter Rundschau</a>, <a href="http://www.fnp.de/fnp/region/hessen/freibad-will-fingerabdruck_rmn01.c.8944078.de.html">Frankfurter Neue Presse</a>, auch <a href="http://www.1730live.de/aktuell/neu/news-details/datum/2011/05/26/mit-fingerabdruck-ins-freibad.html">Sat1</a> meldete sich).</p>
<p>Die Stadt will vorrangig vermeiden, dass die personengebundenen Dauerkarten missbraucht werden und durch den Zaun an andere Schwimmbadbesucher durchgereicht werden. Außerdem sollen Personalkosten an Kassen reduziert werden. Eigentlich eine gute Idee, oder? </p>
<p>Der Einsatz des Fingerabdrucks jedoch weckte den Datenschutz-Drachen. Politiker, Juristen, Datenschützer melden sich zu Wort und kritisieren das Verfahren. </p>
<p>Die Diskussion amüsiert mich ein wenig, denn sie verläuft öffentlich derzeit sehr oberflächlich. Bei all dem Gerede vermisse ich eine klare Beschreibung, wie es <em>technisch denn nun genau funktioniert</em>. Ein Indiz fand ich in einem Artikel, darin hieß es, dass die <em>Daten schließlich nicht zentral gespeichert, sondern nur auf dem Chip vorliegen</em> würden. Das sagt nicht viel. </p>
<p><strong>Wie wäre es garantiert nicht sauber?</strong><br />
Auf dem Chip sind (womöglich im Klartext) die Merkmale vom Fingerabdruck des Trägers gespeichert. Bei der Prüfung am Fingerabdruck-Scanner fragt dieser die gescannten Merkmale bei einen Server an, auf welchem die Merkmale auch gespeichert sind. </p>
<p>So bitte nicht. Wenn die Technik so funktioniert, schlage ich mich sofort auf die Seite der Datenschützer. Provinzposse.</p>
<p><strong>Wie wäre es sauber?</strong><br />
Auf dem Chip ist ein <a href="http://de.wikipedia.org/wiki/Kryptologische_Hashfunktion">Hashwert</a> für die Merkmale des Trägers gespeichert. Bei der Prüfung am Fingerabdruck-Scanner bildet das Gerät ebenso einen Hashwert der Merkmale und vergleicht das Ergebnis mit dem Chip. Die Merkmale selbst werden gar nicht gespeichert, sondern nur zur Ermittlung des Hashwerts verwendet. </p>
<p>Falls dies hinter dem Verfahren steht, gut gemacht! So gehts, so ist es in Ordnung.</p>
<p>Ein Hashwert kann natürlich geknackt werden, damit hätte man das System gehackt, aber dennoch nicht die dem Hash zugrunde liegenden Daten des Fingerabdrucks. Was hätte der Angreifer davon? <strong>Er hätte Zugang ins Freibad!</strong> Dafür lohnen sich hochkomplexe Hashwert-Attacken&#8230; </p>
<blockquote><p>
Zuletzt im Hackerclub:<br />
Hacker-Azubi zum Chef:<br />
<em>&#8220;Nun versuchen wir uns an Biometrie. Was hacken wir jetzt? Den Personalausweis? Bankensysteme? Zugriffe zu High-Security-Gebäuden? Atomkraftwerke? Rüstungskonzerne?&#8221;</em></p>
<p>Chef:<em><br />
&#8220;Nein&#8230;viel besser&#8230; wir hacken das Bad Orber Freibad!&#8221;</em></p></blockquote>
<p>Wem das zuviel Sarkasmus ist&#8230; sorry! <img src='http://www.bjoerns-choice.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Ich würde mich freuen, wenn das Verfahren etwas genauer beschrieben wird. Dann könnte man sich ein gesundes Bild davon machen, ob es sich hierbei um eine Provinzposse oder um ein zukunftsweisendes Verfahren handelt.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bjoerns-choice.de/archives/449/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Modultests mit PHPUnit</title>
		<link>http://www.bjoerns-choice.de/archives/440?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=modultests-mit-phpunit</link>
		<comments>http://www.bjoerns-choice.de/archives/440#comments</comments>
		<pubDate>Wed, 23 Mar 2011 20:48:47 +0000</pubDate>
		<dc:creator>Björn</dc:creator>
				<category><![CDATA[Computer]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tutorials]]></category>

		<guid isPermaLink="false">http://www.bjoerns-choice.de/?p=440</guid>
		<description><![CDATA[Eine kleine private Exkursion in die Tiefen einer OpenSource-Gemeinde hat mir mal wieder vor Augen gehalten, wie man sich das Coder-Dasein durch die Verwendung von Modultests (&#8220;UnitTests&#8221;) vereinfachen kann. Nicht jeder benutzt sie, jeder sollte. In der PHP-Programmierung ist die ideale Software hierfür PHPUnit. Die Software wird im GitHub verteilt, ist gut dokumentiert, weit verbreitet [...]]]></description>
			<content:encoded><![CDATA[<p>Eine kleine private Exkursion in die Tiefen einer OpenSource-Gemeinde hat mir mal wieder vor Augen gehalten, wie man sich das Coder-Dasein durch die Verwendung von <a href="http://de.wikipedia.org/wiki/Unittest">Modultests</a> (&#8220;UnitTests&#8221;) vereinfachen kann. Nicht jeder benutzt sie, jeder sollte. In der PHP-Programmierung ist die ideale Software hierfür <a href="http://www.phpunit.de">PHPUnit</a>.</p>
<p>Die Software wird im GitHub verteilt, ist <a href="http://www.phpunit.de/manual/3.5/en/index.html">gut dokumentiert</a>, weit verbreitet (guckt mal in viele größere Klassen rein, man stolpert oft über den einen oder anderen Testordner) und genießt hohes Ansehen bei Entwicklern. Die Software ist auch im PEAR und kann darüber installiert werden (ein paar Dependencies gibt es für zusätzliche Funktionen). </p>
<p>An einem einfachen Beispiel möchte ich die grundsätzliche Verfahrensweise demonstrieren. Angenommen, in einem PHP-Projekt gibt es irgendwo eine Funktion, welche den Ostersonntag eines Jahres bestimmt. Der Einfachheit halber nennen wir sie <em>easter($jahr)</em>. So eine Funktion könnte beispielsweise eingebunden sein, wenn es um die Errechnung von verschiedenen Feiertage geht &#8211; somit könnte sie eine gewisse Kritikalität im Projekt innehaben. Wie testet man nun so eine Funktion mit PHPUnit?</p>
<p>Ich steige hier mal mitten in PHPUnit ein: </p>
<pre class="brush: php; title: ; notranslate">
require_once 'includes/functions.php';
 
class EasterTest extends PHPUnit_Framework_TestCase {
  public function testEasterOk() {
    $easter2011 = easter(2011);
    $this-&gt;assertEquals($easter2011, gmmktime(0,0,0,4,24,2011));
  }
 
  public function testEasterFalse() {
    $easter2011 = easter(2011);
    $this-&gt;assertNotEquals($easter2011, gmmktime(0,0,0,12,24,2011));
  }
} 
</pre>
<p>Zuerst habe einen Verweis auf das PHP-Script (hier: functions.php), in welcher die Funktion <em>easter($Jahr)</em> enthalten ist. Dann generiere ich eine Klasse (&#8220;EasterTest&#8221;), welche PHPUnit erweitert. In dieser Klasse sind zwei Tests abgelegt:</p>
<ul>
<li>Ein Gutfall (ist der 24.4.2011 Ostern?) </li>
<li>Ein Schlechtfall (ist der 24.12.2011 Ostern?) </li>
</ul>
<p><strong>Jetzt kommt der trockene theoretische Teil&#8230;</strong><br />
Hier geht es nicht etwa darum, das Ergebnis zu finden &#8211; das hat man ohnehin schneller mit einem Blick auf dem Kalender. Vielmehr ist es Ziel, das Ergebnis der Funktion mit einem definierten &#8220;Wunschergebnis&#8221; zu vergleichen. Ich weiß, dass der 24.04. dieses Jahr der Ostersonntag ist&#8230; und ich weiß, dass es der 24.12. definitiv nicht ist. </p>
<p>PHPUnit &#8211; wie auch fast alle andere Software in diesem Umfeld &#8211; arbeitet mit &#8220;Assertions&#8221; (Behauptungen). Es gibt eine Sammlung von einfachen Funktionen, welche solche Assertions in verschiedenen Konstrukten ermöglichen &#8211; angefangen von Vergleichsoperationen wie die im Beispiel verwendeten assertEquals und assertNotEquals über False/True-Varianten, Array-Prüfern und einigem anderen. </p>
<p>Ist dies viel Arbeit?<br />
Bitte urteilt selbst.. ein einfacher Test ist fix geschrieben. Nicht schwer, oder?</p>
<p><strong>Zurück zur Praxis. </strong><br />
Wie kann man nun die Tests auswerten? Am einfachsten über die Shell. Und hier ist es nun wirklich egal, ob man sich in einer Dosbox, Bash oder wo auch immer aufhält.</p>
<pre class="brush: bash; title: ; notranslate">
D:\htdocs\&gt;phpunit EasterTest.php
PHPUnit 3.5.11 by Sebastian Bergmann.

..
 
Time: 0 seconds, Memory: 3.75Mb
 
OK (2 tests, 2 assertions)
</pre>
<p>PHPUnit kann auch andere Output-Formate, beispielsweise das TAP-Format (&#8220;Test Anything Protocol&#8221;), JSON, XML und andere.</p>
<pre class="brush: bash; title: ; notranslate">
D:\htdocs\&gt;phpunit --tap EasterTest.php
TAP version 13
ok 1 - EasterTest::testEasterOk
ok 2 - EasterTest::testEasterFalse
1..2
</pre>
<p>Wenn ich nun in einem Test einen Fehler habe, sieht das so aus (ich habe hierfür den Test 1 so verändert, dass die Behauptung lautet, der 23.04.2011 wäre Ostersonntag &#8211; ist aber in Wirklichkeit der Samstag davor):</p>
<pre class="brush: bash; title: ; notranslate">
D:\htdocs\&gt;phpunit --tap EasterTest.php
TAP version 13
not ok 1 - Failure: EasterTest::testEasterOk
  ---
  message: 'Failed asserting that &lt;integer:1303516800&gt; matches expected &lt;integer:1303603200&gt;.'
  severity: fail
  data:
    got: 1303516800
    expected: 1303603200
  ...
ok 2 - EasterTest::testEasterFalse
1..2
</pre>
<p>Wenn ich nun &#8211; wann und warum auch immer &#8211; an der eigentlichen Funktion wieder mal arbeite, dann habe ich weiterhin meine gespeicherten Tests. Wenn diese mir also Mist zurückgeben, ist entweder mein Test falsch (eher unwahrscheinlich), oder meine veränderte Funktion ist nicht ok&#8230; <em>und genau darum geht es hier</em>. Modultests wie dieser hier machen den Code deutlich stabiler und nachträgliche Arbeiten, Erweiterungen etc. erheblich einfacher. </p>
<p>Und wenn es mal Bugs gibt&#8230; schreibt einen Test und fixt dann den Bug!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bjoerns-choice.de/archives/440/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>qTranslate</title>
		<link>http://www.bjoerns-choice.de/archives/422?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=qtranslate</link>
		<comments>http://www.bjoerns-choice.de/archives/422#comments</comments>
		<pubDate>Tue, 08 Mar 2011 21:02:39 +0000</pubDate>
		<dc:creator>Björn</dc:creator>
				<category><![CDATA[Computer]]></category>

		<guid isPermaLink="false">http://www.bjoerns-choice.de/?p=422</guid>
		<description><![CDATA[Ich teste gerade qTranslate. Mal sehen, wie das funktioniert!]]></description>
			<content:encoded><![CDATA[<p>Ich teste gerade <a href="http://wordpress.org/extend/plugins/qtranslate/">qTranslate</a>. Mal sehen, wie das funktioniert!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bjoerns-choice.de/archives/422/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

