<?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>blog.codecentric.de &#187; Agilität</title>
	<atom:link href="http://blog.codecentric.de/category/agile/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.codecentric.de</link>
	<description>Blog von codecentric über Agilität, Architektur, Java, Performance und Enterprise Content Management</description>
	<lastBuildDate>Thu, 02 Sep 2010 13:49:13 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Business Case für Agilität</title>
		<link>http://blog.codecentric.de/2010/09/business-case-fur-agilitat/</link>
		<comments>http://blog.codecentric.de/2010/09/business-case-fur-agilitat/#comments</comments>
		<pubDate>Wed, 01 Sep 2010 17:13:46 +0000</pubDate>
		<dc:creator>Mirko Novakovic</dc:creator>
				<category><![CDATA[Agilität]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[Business Case]]></category>
		<category><![CDATA[Kanban]]></category>
		<category><![CDATA[SCRUM]]></category>

		<guid isPermaLink="false">http://blog.codecentric.de/?p=5096</guid>
		<description><![CDATA[Agile Methoden wie Scrum oder Kanban  etablieren sich zunehmend als Alternative zu klassischen Vorgehensmodellen in der Softwareentwicklung. Ist das alles nur ein großer Hype oder steckt mehr dahinter? Gibt es vielleicht sogar einen echten Business Case? Anhand einer idealisierten Geschichte &#8230; <a href="http://blog.codecentric.de/2010/09/business-case-fur-agilitat/">weiterlesen  <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<blockquote><p>Agile Methoden wie Scrum oder Kanban  etablieren sich zunehmend als  Alternative zu klassischen Vorgehensmodellen in der Softwareentwicklung.  Ist das alles nur ein großer Hype oder steckt mehr dahinter? Gibt es  vielleicht sogar einen echten Business Case? Anhand einer idealisierten  Geschichte soll verdeutlicht werden, welche Chancen die Agilität bietet  und warum sich ein Umstieg rechnet.</p></blockquote>
<p><img class="alignleft size-full wp-image-5102" src="http://blog.codecentric.de/wp-content/uploads/2010/09/bt_magazin.png" alt="" width="200" height="283" />In der aktuellen Ausgabe des <a href="http://it-republik.de/business-technology/" target="_blank">Business Technology </a>Magazins beschreiben Andreas und ich anhand einer fiktiven Geschichte, warum sich Agilität auch aus finanzieller Sicht für Unternehmen lohnt.</p>
<p>Die 4 Kernthesen für den Business Case für Agilität sind dabei:</p>
<ol>
<li>Schneller geschäftlicher Nutzen und Time to Market</li>
<li>Weniger Fehl- und Blindleistungen</li>
<li>Risikomanagement von komplexen Situationen</li>
<li>Hohe und nachhaltige Qualität</li>
</ol>
<p>Den vollständigen Artikel kann man von unserer Webseite herunterladen: <a title="Business Case für Agilität" href="http://www.codecentric.de/de/m/kompetenzen/publikationen/artikel/publikation.html?id=/inhalte/publikationen/artikel/2009_2010/business-case-fuer-agilitaet" target="_blank">Business Case für Agilität</a></p>
<div id="crp_related"><ul><li><a href="http://blog.codecentric.de/2010/03/meet-the-experts-2010/" rel="bookmark" class="crp_title">Meet The Experts 2010</a></li><li><a href="http://blog.codecentric.de/2010/04/agilitat-und-eam/" rel="bookmark" class="crp_title">Agilität und EAM</a></li><li><a href="http://blog.codecentric.de/2009/09/scrum-als-dienstleister/" rel="bookmark" class="crp_title">Scrum als Dienstleister</a></li><li><a href="http://blog.codecentric.de/2010/04/der-agile-juni-workshops-und-trainings-rund-um-agilitat/" rel="bookmark" class="crp_title">Der agile Juni &#8211; Workshops und Trainings rund um Agilität</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://blog.codecentric.de/2010/09/business-case-fur-agilitat/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>codecentric startet ihren ersten Podcast</title>
		<link>http://blog.codecentric.de/2010/08/codecentric-startet-ihren-ersten-podcast/</link>
		<comments>http://blog.codecentric.de/2010/08/codecentric-startet-ihren-ersten-podcast/#comments</comments>
		<pubDate>Mon, 09 Aug 2010 11:02:09 +0000</pubDate>
		<dc:creator>Andreas Ebbert-Karroum</dc:creator>
				<category><![CDATA[Agilität]]></category>
		<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[codecentric]]></category>

		<guid isPermaLink="false">http://blog.codecentric.de/?p=4938</guid>
		<description><![CDATA[Ein Fünftel der Arbeitszeit aller Mitarbeiter bei codecentric sind der Weiterbildung und der Erforschung und Entwicklung eigener Ideen gewidmet. Ein für die strategische Ausrichtung der Firma wichtiger Aktivposten. Insbesondere bei den Themen, bei denen wir Vordenker sein wollen, sind wir &#8230; <a href="http://blog.codecentric.de/2010/08/codecentric-startet-ihren-ersten-podcast/">weiterlesen  <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ein Fünftel der Arbeitszeit aller Mitarbeiter bei codecentric sind der Weiterbildung und der Erforschung und Entwicklung eigener Ideen gewidmet. Ein für die strategische Ausrichtung der Firma wichtiger Aktivposten. Insbesondere bei den Themen, bei denen wir Vordenker sein wollen, sind wir da natürlich besonders aktiv. In den Themengebieten Agilität, Architektur, Enterprise Content Management, Java und Performance entspinnen sich deshalb &#8211; geplant und ungeplant &#8211; immer wieder sehr interessante Diskussionen.</p>
<p>Ab heute gibt es für alle die Möglichkeit diesen Diskussionen teilweise beizuwohnen. Ab heute gibt es den <a href="http://podcast.codecentric.de">codecentric competence center podcast</a>.</p>
<p>Die Leiter der competence center, und ggf. auch geladene Gäste, setzen sich regelmäßig zusammen und diskutieren aktuelle Themen aus den jeweiligen Bereichen. Initial haben wir uns einen 2-wöchigen Rhythmus vorgenommen. Der erste Podcast behandelt die Themen &#8220;Story Points&#8221; und &#8220;Benennung von Java Klassen&#8221;. Langweilig? Ganz im Gegenteil! Wir hatten sehr viel Spaß bei der Diskussion der Themen.</p>
<p>Ich würde mich über Feedback über Inhalt, Gestaltung, Qualität, Länge, etc. im <a href="http://podcast.codecentric.de/2010/08/04/codecentric-competence-center-podcast-1/#respond">Kommentarbereich des Podcasts</a> freuen. Wer möchte, kann den Podcast auch auf  iTunes <a href="http://www.itunes.com/podcast?id=386155317">abonnieren und bewerten</a>.</p>
<p style="text-align: center;"><a href="http://www.itunes.com/podcast?id=386155317"><img class="aligncenter" title="iTunes Logo" src="http://podcast.codecentric.de/files/2010/08/iTunes.png" alt="" width="126" height="118" /></a></p>
<div id="crp_related"><ul><li><a href="http://blog.codecentric.de/2010/06/happy-birthday-codecentric-blog/" rel="bookmark" class="crp_title">Happy Birthday &#8211; codecentric Blog</a></li><li><a href="http://blog.codecentric.de/2009/03/meet-the-experts/" rel="bookmark" class="crp_title">meet the experts</a></li><li><a href="http://blog.codecentric.de/2009/09/retrospektive-meet-the-experts-agilitat/" rel="bookmark" class="crp_title">Retrospektive: meet the experts &#8211; agilität</a></li><li><a href="http://blog.codecentric.de/2009/10/jug-koln-5-oktober-vortragsfolien-von-eclipse-rap/" rel="bookmark" class="crp_title">JUG Köln &#8211; 5. Oktober &#8211; Vortragsfolien von Eclipse RAP</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://blog.codecentric.de/2010/08/codecentric-startet-ihren-ersten-podcast/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Agile Enterprise &#8211; Auswirkungen auf die IT</title>
		<link>http://blog.codecentric.de/2010/08/agile-enterprise-auswirkungen-auf-die-it/</link>
		<comments>http://blog.codecentric.de/2010/08/agile-enterprise-auswirkungen-auf-die-it/#comments</comments>
		<pubDate>Sat, 07 Aug 2010 18:36:44 +0000</pubDate>
		<dc:creator>Mirko Novakovic</dc:creator>
				<category><![CDATA[Agilität]]></category>
		<category><![CDATA[Agile Enterprise]]></category>
		<category><![CDATA[Agile Software Development]]></category>
		<category><![CDATA[Agile Software Factory]]></category>
		<category><![CDATA[scrum agile xp jeff sutherland scrummaster certification]]></category>

		<guid isPermaLink="false">http://blog.codecentric.de/?p=4892</guid>
		<description><![CDATA[Gerade eben habe ich in der Computer Woche einen Artikel mit dem Thema &#8220;Sind ERP-Systeme für das Business zu langsam?&#8221; gelesen und dort einen interessanten Begriff entdeckt: Agile Enterprise. Immerhin formuliert von einem Partner und Leiter der Management Beratung bei &#8230; <a href="http://blog.codecentric.de/2010/08/agile-enterprise-auswirkungen-auf-die-it/">weiterlesen  <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Gerade eben habe ich in der <a href="http://www.computerwoche.de/" target="_self">Computer Woche</a> einen Artikel mit dem Thema &#8220;Sind ERP-Systeme für das Business zu langsam?&#8221; gelesen und dort einen interessanten Begriff entdeckt: <strong>Agile Enterprise</strong>. Immerhin formuliert von einem Partner und Leiter der Management Beratung bei Ernst &amp; Young.</p>
<p>Da wir uns starkt mit agiler Software Entwicklung beschäftigen, habe ich mich gefragt, was ein &#8220;Agiles Unternehmen&#8221; ausmacht. Also habe ich mal Google befragt und ein wenig nachgelesen. Eine gute Zusammenfassung findet man bei <a href="http://www.businessdictionary.com/definition/agile-enterprise.html" target="_blank">Business Dictionary</a>:</p>
<p><span id="more-4892"></span></p>
<blockquote><p>Fast moving, <strong>flexible</strong> and robust firm capable of rapid response to <strong>unexpected challenges</strong>, events, and opportunities. Built on policies and processes that facilitate <strong>speed and change</strong>, it aims to achieve <strong>continuous competitive advantage</strong> in serving its customers. Agile enterprises use diffused authority and <strong>flat organizational structure</strong> to speed up information flows among different departments, and develop close, <strong>trust-based relationships</strong> with their customers and suppliers.</p></blockquote>
<p>Grundsätzlich zusammengefasst sind &#8220;Agile Unternehmen&#8221; also die Unternehmen, die besonders schnell und flexibel auf sich ändernde Marktbedingungen reagieren können. In den meisten Artikeln, die ich gefunden habe werden Selbstorganisation und Interaktion zwischen Mitarbeitern und Abteilungen als Basis für agile Unternehmen gesehen. Aber was bedeutet das jetzt für die IT?</p>
<p>Aber zurück zum Artikel. Es geht um große ERP Systeme und das die meisten Unternehmen Schwierigkeiten haben auf die steigende Flexibilität und Geschwindigkeit des Business zu reagieren. Grund sind die hohe Komplexität der Systeme, teilweise schlechte Produktqualität, ein hohes Maß an Customizing an des Systemen und teilweise auch das Alter dieser Monolithen. Bleibt die Aussage: &#8220;<strong>ERP bremst Business!</strong>&#8220;.</p>
<p>Soweit so gut, viele der Aussagen sind bis dahing für mich durchaus nachvollziehbar und sehen wir auch täglich in unseren Projekten. Nicht nur bei ERP Systemen, sondern bei vielen Standardsoftware &#8220;Monstern&#8221; &#8211; beispielsweise auch im Bereich der Versicherungskernsysteme. Ich habe mich immer gefragt, warum man zunächst viele Millionen in Lizenzkosten investiert, dann merkt, dass der &#8220;Standard&#8221; eigentlich nicht zu den eigenen Prozessen passt und man nur 20% der Funktionen benötigt. Deshalb führt man auch erst mal ein mehrjähriges Customizing Projekt durch. Meistens hat man die Software danach soweit angepasst, das sie nicht mehr Release fähig ist oder jedes Upgrade wieder mit hohen Anpassungsaufwänden verbunden ist. Aber das beste kommt noch: ca. 20% muss man jedes Jahr für die Wartung der Standard Software zahlen &#8211; sprich: Alle 5 Jahre hat man die Software noch mal gekauft.</p>
<p>Leider liefert der Artikel nicht wirklich interessante Lösungsszenarien. Zunächst wird bemängelt, dass die Strategien der ERP Hersteller die großen Versprechen von SOA nicht gehalten haben &#8211; insbesondere, weil die SOA von den Herstellern fast ausschließlich technisch betrachtet wurden.</p>
<p>Eine mögliche Lösung wird in der Cloud und in Software as a Service gesehen &#8211; da hat mich der Artikel dann auch entgültig abgehangen. Wenn ich also mein &#8220;Monster&#8221; nicht mehr selber betreibe, sondern in der  &#8220;Wolke&#8221;, dann sind meine Business Probleme weg und ich bin auf einmal flexibel und schnell!? Da scheinen einige der der Experten doch eher im &#8220;Nebel&#8221; zu stehen.</p>
<p>Da ich mich seit einigen Wochen damit beschäftige das &#8220;<a href="http://holykaw.alltop.com/the-real-reason-apple-is-so-innovative" target="_blank">Why</a>&#8221; für unsere Agile Software Factory zu finden, hat mir dieser Artikel wirklich sehr geholfen.</p>
<p>Aus meiner Sicht liegt die Lösung für das Problem doch klar auf der Hand:</p>
<p>Wenn Agile Enterprise heißt, dass mann innovativ sein (<a href="http://de.wikipedia.org/wiki/Zeitorientierte_Wettbewerbsstrategien" target="_blank">First Mover</a>) und schnell reagieren (Fast Follower) muss, dann kann die Lösung doch nicht in &#8220;Standard&#8221; und &#8220;Monolithen&#8221; liegen. Standard ist definitiv nicht innovativ und Monolithen sind in der Regel komplex und wenig flexibel anzupassen.</p>
<p>Aus meiner Sicht muss man bei der Umsetzung der Geschäftsprozesse auf individuelle Software setzen. Die genutzten Komponenten können aber sehr wohl Standard sein. Was ich damit meine ist, dass ich niemandem empfehlen würde eine Buchhaltungssoftware inidividuell selber zu bauen &#8211; hier ist durch gesetzliche Vorgaben etc. wenig Innovation und Individualität zu erwarten. Allerdings können sich die Prozesse rund um die Buchhaltung sehr wohl stark unterscheiden und zu einem Wettbewerbsvortei werden. Kunden können über Web und Mobile direkt eingebunden werden, Geschäftsvorfälle können automatisiert werden und andere, eigene Systeme können sich direkt integrieren. Insbesondere kann man &#8220;Insellösungen&#8221; vermeiden und dem Benutzer eine einheitliche Oberfläche und schnelle Bearbeitung in einem System anbieten.</p>
<p>Um schnell und flexibel zu sein, mit unbekannten Anforderungen umgehen zu können und das Risiko von inidividueller Entwicklung zu reduzieren, muss man auf agile Vorgehensweisen setzen. Mit schwerfälligen Wasserfallmethoden und Projekten mit Laufzeiten von mehreren Monaten oder Jahren bis man dem Business etwas Lauffähiges anbieten kann, wird man heute nicht mehr konkurrenzfähig sein.</p>
<p>Genau das ist unsere Agile Software Factory: Ein etablierters Vorgehensmodell auf Basis von Scrum und XP mit vielen Best Practices (&#8220;Agile&#8221;) und dem Einsatz von standardisierten Komponenten und Frameworks (&#8220;Factory&#8221;).</p>
<p>Bei den Komponeten setzen wir meistens auf Open Source, da die verwendeten Standards und offene Quellen zu einer verbesserten Integrierbarkeit und schnelleren Entwicklung führen &#8211; zudem ist man weniger von der &#8220;Politik&#8221; einzelner Hersteller abhängig. <a href="http://www.alfresco.com/" target="_blank">Alfresco</a> im Bereich ECM, <a href="http://www.pentaho.com/" target="_blank">Pentaho</a> für Business Intelligence, <a href="http://www.liferay.com/">Liferay</a> als Portal Lösung, <a href="http://www.opencms.org" target="_blank">OpenCms</a> als CMS  oder <a href="http://www.compiere.com/" target="_blank">Compiere</a> im Bereich ERP und CRM sind nur Beispiele für Open Source Komponenten, die wir in die Anwendungen unserer Kunden integrieren. Die individuellen Prozesse und Anwendungen werden dabei auch auf Basis von etablierten Best Practices mit Open Source Frameworks wie <a href="http://www.springsource.org/" target="_blank">Spring</a>, <a href="http://www.hibernate.org" target="_blank">Hibernate</a>, <a href="http://www.jboss.org/drools" target="_blank">Drools</a>, <a href="http://www.jboss.org/jbpm" target="_blank">jBpm</a> oder <a href="http://www.mulesoft.org/" target="_blank">Mule</a> entwickelt. Immer auf Basis leichtgewichtiger, evolutionärer Architekturen!</p>
<p>Die agile Vorgehensweise sorgt dafür, dass das Business alle 2-4 Wochen neue und benötigte Funktionen zur Verfügung gestellt bekommt &#8211; und das in hoher Qualität durch automatisierte Unit-, Regressions- und Systemtest, sowie kontinuierlicher Integration, Pair-Programming und automatisierter Code- und Designüberprüfungen.</p>
<p>Mein Fazit: Wenn wir als IT auf sich schneller ändernde Business Anforderungen reagieren wollen (&#8220;Agile Enterprise&#8221;), dann müssen wir uns von großen &#8220;Standardsoftware Mostern&#8221; und langlaufenden Projekten trennen. Die Lösung für mich sind agile Projekte &#8211; allerdings auf Basis von standardisierten Anwendungsbausteinen und Frameworks.</p>
<div id="crp_related"><ul><li><a href="http://blog.codecentric.de/2008/11/codecentric-w-jax-2008-tag-2-05112008/" rel="bookmark" class="crp_title">codecentric @ W-Jax 2008, Tag 2, 05.11.2008</a></li><li><a href="http://blog.codecentric.de/2009/09/scrum-als-dienstleister/" rel="bookmark" class="crp_title">Scrum als Dienstleister</a></li><li><a href="http://blog.codecentric.de/2010/09/business-case-fur-agilitat/" rel="bookmark" class="crp_title">Business Case für Agilität</a></li><li><a href="http://blog.codecentric.de/2010/03/der-agile-entwickler/" rel="bookmark" class="crp_title">Der Agile Entwickler</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://blog.codecentric.de/2010/08/agile-enterprise-auswirkungen-auf-die-it/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sprint Reflection mal anders</title>
		<link>http://blog.codecentric.de/2010/08/sprint-reflection-mal-anders/</link>
		<comments>http://blog.codecentric.de/2010/08/sprint-reflection-mal-anders/#comments</comments>
		<pubDate>Thu, 05 Aug 2010 09:51:44 +0000</pubDate>
		<dc:creator>Fabian Lange</dc:creator>
				<category><![CDATA[Agilität]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[reflection]]></category>
		<category><![CDATA[SCRUM]]></category>

		<guid isPermaLink="false">http://blog.codecentric.de/?p=4851</guid>
		<description><![CDATA[Es gibt viele Wege eine Reflection über einen vergangenen Sprint zu machen, und ab und zu probieren wir auch neue Ideen aus. So wurden wir in unserer letzten Reflection in die Rolle eines Künstlers versetzt und haben unsere Eindrücke des &#8230; <a href="http://blog.codecentric.de/2010/08/sprint-reflection-mal-anders/">weiterlesen  <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Es gibt viele Wege eine Reflection über einen vergangenen Sprint zu machen, und ab und zu probieren wir auch neue Ideen aus.<br />
So wurden wir in unserer letzten Reflection in die Rolle eines Künstlers versetzt und haben unsere Eindrücke des vergangenen Sprints in ein Bild gefasst.<br />
Was auf den ersten Blick merkwürdig erschien funktionierte aber überraschend gut. Das Bild stellt kompakt die wichtigsten Eindrücke zusammen und provoziert andere Emotionen also eine reine Liste über die zu verbessernden Dinge. Mal sehen ob wir dieses Mittel irgendwann wieder einsetzen.<br />
Als Beispiel möchte ich mein Bild zeigen und beschreiben. Die Bilder der Kollegen waren zwar auch interessant, jedoch möchte ich sie nicht ungefragt veröffentlichen. <img src='http://blog.codecentric.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
<span id="more-4851"></span><br />
<img class="aligncenter size-full wp-image-4852" title="a_different_reflection" src="http://blog.codecentric.de/wp-content/uploads/2010/08/a_different_reflection.png" alt="" width="565" height="419" /></p>
<p>Man sieht den Langen Weg zum Ziel auf dem wir dem Ziel aber schon sehr nahe gekommen sind. Ich hoffe auf eine Belohnung für die super Sprints und wünsche mir deshalb einen Kuchen hinter der Ziellinie.<br />
Unter dem Weg sind sowohl unsere Architektur also auch der Zweck des Projekts zu erkennen (oder auch nicht). Die Architektur funktioniert gut, und der Kunde erkennt den Wert wo er früher noch Fragezeichen im Kopf hatte.<br />
Über dem Weg ist links oben unsere Teststabilität zu erkennen mit der ich offensichtlich nicht so glücklich bin. Maßnahmen wurden ergriffen um dies zu ändern.<br />
Auch unzufrieden bin ich mit unserem Burndown gewesen. Zwar passt es grundsätzlich, sollte aber unterhalb und nicht oberhalb der Linie liegen.<br />
Zufrieden war ich offensichtlich auch mit der Menge der umgesetzten Funktionalität und, dass diese echten Mehrwert in Form von Geld für unseren Kunden generiert.<br />
Abgerundet wird das Bild durch meinen Eindruck einer erneut super gelaufenen Produktpräsentation.</p>
<p>Was haltet Ihr von dieser Art der Reflection?</p>
<div id="crp_related"><ul><li><a href="http://blog.codecentric.de/2008/09/scrummaster-certification-training/" rel="bookmark" class="crp_title">ScrumMaster Certification Training</a></li><li><a href="http://blog.codecentric.de/2009/07/codecentric-coding-night-facts-figures/" rel="bookmark" class="crp_title">codecentric coding night &#8211; facts &#038; figures</a></li><li><a href="http://blog.codecentric.de/2010/03/das-marchen-vom-agilen-entwickler/" rel="bookmark" class="crp_title">Das Märchen vom agilen Entwickler</a></li><li><a href="http://blog.codecentric.de/2010/05/codecentric-jax-2010-day-3/" rel="bookmark" class="crp_title">codecentric @ JAX 2010 Day 3</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://blog.codecentric.de/2010/08/sprint-reflection-mal-anders/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Die Besten Ausreden warum der Build bricht</title>
		<link>http://blog.codecentric.de/2010/07/die-besten-ausreden-warum-der-build-bricht/</link>
		<comments>http://blog.codecentric.de/2010/07/die-besten-ausreden-warum-der-build-bricht/#comments</comments>
		<pubDate>Wed, 28 Jul 2010 22:42:06 +0000</pubDate>
		<dc:creator>Fabian Lange</dc:creator>
				<category><![CDATA[Agiles Testen]]></category>
		<category><![CDATA[eXtreme Programming]]></category>
		<category><![CDATA[build]]></category>
		<category><![CDATA[hudson]]></category>

		<guid isPermaLink="false">http://blog.codecentric.de/?p=4789</guid>
		<description><![CDATA[Wir bei codecentric haben hunderte von automatischen Builds die täglich laufen und.. manchmal auch fehlschlagen. Doch soll es hier nicht um faule Ausreden wie &#8220;ach das war doch nur ne kleine Änderung das sollte nicht schiefgehen&#8221; gehen, sondern um die &#8230; <a href="http://blog.codecentric.de/2010/07/die-besten-ausreden-warum-der-build-bricht/">weiterlesen  <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Wir bei codecentric haben hunderte von automatischen Builds die täglich laufen und.. manchmal auch fehlschlagen. Doch soll es hier nicht um faule Ausreden wie &#8220;ach das war doch nur ne kleine Änderung das sollte nicht schiefgehen&#8221; gehen, sondern um die Fälle in denen der Build bricht weil.. nunja.. man weiß es halt nicht so richtig.</p>
<p>Klar sagt man schnell gern: Oh das muss kosmische Strahlung sein. Ich werfe den Build nochmal an. Aber wir wissen alle daß das nicht stimmen kann. Um wirklich effizient ein CI System nutzen zu können im Folgenden eine Liste von Ursachen von solch spontanen Buildfehlschlägen und wie man sie beheben kann.<br />
<span id="more-4789"></span></p>
<ul>
<li>Ein Test führt <strong>Zeitberechnung</strong> durch, und sowohl im Testcode als auch im Produktionscode wird die Zeit genommen. Während das fast immer ohne erkennbare Unterschiede funktioniert, kann es ab und zu Abweichungen geben. Die Meldungen sehen dann merkwürdigerweise so aus: Time was 23:30:00 but expected 23:30:00 (die Milli- und Mikrosekunden werden von den üblichen toString Methoden nicht angezeigt.)</li>
<li>Code, Testcode oder das CI lassen nach Ausführungen Dateien liegen. Oft handelt es sich um Logdateien, manchmal Ergebnisse von Tests. Dies kann Ergebnisse verfälschen, weshalb unbedingt diese Dateien zu entfernen sind. Auch sollte unbedingt <strong>Festplatten Monitoring</strong> eingesetzt werden, da auf Buildservern die Platten schnell sehr voll werden (Hudson bietet Optionen zur Überwachung und zum Aufräumen)</li>
<li>Benutzer die sich auf dem CI Server einloggen können so versehentlich <strong>Ressourcen sperren</strong>, z.B. Dateien durch Öffnen, oder Ports durch manuelles Serverstarten. Oder sonstwas, womit keiner gerechnet hat. Deshalb sollte es auf Buildservern keine Benutzerlogins geben. Sämtliche Analysen sollten wenn überhaupt nur lesend erfolgen. Dennoch sollte den Entwicklern bewusst sein, daß je nach Tool selbst lesender Zugriff schon Schreibzugriff verhindert.</li>
<li>Es handelt sich nicht zwingend um einen Bug im Code oder Test wenn das Systemdatum den Ersten Januar 1970 anzeigt. Natürlich könnte es ein Fehler sein, aber eventuell geht die Uhr des Buildservers auch einfach falsch. Buildserver sollten immer die <strong>aktuelle Uhrzeit verwenden</strong>. Dies kann ganz einfach mit einem ntp daemon sichergestellt werden. Falls ein Test eine bestimmte Uhrzeit testen möchte, so sollte nicht die Systemzeit verändert werden, sondern stattdessen der Code so umgebaut werden, daß er einen TimeProvider verwendet welcher im Test die gewünschte Uhrzeit liefert, sich ansonsten wie die normale Systemzeit verhält.</li>
<li>Falls es doch schmutziger Tricks bedarf um gewisse Teile des Codes zu testen, so ist es in der Regel sicherer die <strong>Testausführung zu forken</strong>, dadurch können dann selbst umgesetzte Systemvariablen keinen Einfluss auf die Tests in anderen JVMs haben. Code Coverage Tools und andere Bytecodemanipulierer zählen mitunter auch als Hack. Geforkte Ausführung ist oft sicherer.</li>
<li>Falls Ihr mehrere Buildserver habt, stellt sicher, daß diese sich so ähnlich wie nur möglich sind. Nur wenn man es sich wirklich leisten kann und will sollte man mehrere verschiedene Server mit fest <strong>definierten</strong> Unterschieden als Farm aufsetzen. So kann dann auf Systemspezifika getestet werden. Allerdings sollte es keine überraschenden Unterschiede geben.</li>
<li>Man sollte in Erwägung ziehen das zu testende System für die nächtlichen Integrationstest (automatisch) <strong>komplett neu zu installieren</strong>. Diese Testserver werden mit der Zeit instabil, insbesondere dann wenn viele explorative Tests und ad-hoc Demonstrationen auf dem System gemacht werden. Komplette Neuinstallation klingt abschreckend, ist aber oft einfacher als gedacht. Allerdings dauert die Installation jede Nacht dann etwas mehr Zeit.</li>
<li>Wenn man Software für automatische Tests deployed sollte man unbedingt zuerst den Server stoppen, die neue Software an die richtige Stelle kopieren und dann den Server starten. Jegliche Art von &#8220;<strong>hot deployment</strong>&#8221; ist leider nicht stabil genug um verlässlichen Ergebnisse zu liefern.</li>
<li>Nach jeglicher Art von <strong>Konfigurationsänderung</strong> oder Veränderungen an der erweiterten Testinfrastruktur sollte ein manueller Testlauf gestartet werden. Tut man dies nicht vermischt sich diese Änderung mit dem nächsten Entwicklercommit und dieser sucht dann vergebens in seinem Code nach der Änderung die den Test brach, obwohl es sich um die Konfiguration handelt.</li>
<li>Falls sich Tests aufhängen oder blockieren, insbesondere wenn mehrere Tests zur gleichen Zeit (nicht zwingend in dem gleichen Prozess) laufen, so sollte man sich darüber freuen, <strong>einen Heap und Threaddump</strong> machen und erst dann die JVM neustarten. Es kann sein, daß die Tests zufällig eines dieser unheimlich schwer zu findenden <strong>Nebenläufigkeitsproblemen</strong> gefunden haben. Man sollte dafür dankbar sein, da man den Fehler sonst nie gefunden hätte. Leider wird zu oft einfach nur neugestartet.</li>
</ul>
<p>Natürlich ist es möglich, daß weiterhin der Build bricht ohne daß die Software Fehler enthält. Aber genau dies verschwendet viel Zeit auf der Suche nach Phantomfehlern. Deshalb muss man die Schwachstellen seines Builds kennen und daran arbeiten diese zu beheben.</p>
<p>Wir hatten zum Beispiel ein Problem mit einer unserer Integrationtest Suiten. Die Tests verbinden sich mit einem externen Dienst, welcher manchmal nicht antwortet oder nur hängt. Bis vor kurzem brach dies unseren Build. Das Ergebnis war, daß jeder Entwickler sich den roten Build ansah, die Logs studierte und schlussendlich zur Feststellung gelangt, daß mal wieder der Dienst nicht verfügbar war. Nach einer Diskussion über dieses Problem beschlossen wir diese Zeitverschwendung nicht mehr zu machen. Also fügten wir eine kleine Mechanik in die Tests ein, welche die Timeouts erkennt und den Build nicht brechen lässt. Dafür markiert es den Test mit dem nichtkritischem Tag &#8220;timeouted&#8221;. Natürlich können wir keine Aussage über den Test treffen, aber er ist ebenso wenig Grün wie Rot. Da aber Rot das Anzeichen für die Entwickler ist tätig zu werden konnten wir ihn nicht Rot machen. Leider führt dies zu der Einschränkung, daß wirkliche Grüne Builds keine Tests mit dem Tag &#8220;timeouted&#8221; haben dürfen. Im RobotFramework kann man <a href="http://robotframework.googlecode.com/svn/trunk/doc/userguide/RobotFrameworkUserGuide.html#setting-background-colors">einen dritten Zustand für &#8220;nichtkritische Fehlschläge&#8221;</a> definieren. Vielleicht ist dies ja auch eine Option für Euch?</p>
<p>Die wichtigste Botschaft ist: <strong>Wenn ein gebrochener Build nicht durch Test- oder Produktionscode verursacht wurde, so muss man unbedingt die Ursache finden und beheben</strong>. Man kann nicht einfach auf kosmische Strahlen verweisen, da sonst irgendwann jeder einfach nur &#8220;kosmische Strahlen&#8221; sagt und der Build keine Aussagekraft mehr hat. <strong>Ein roter Build sollte immer bedeuten: Leute macht was!</strong></p>
<div id="crp_related"><ul><li><a href="http://blog.codecentric.de/2009/04/can-i-change-this-code/" rel="bookmark" class="crp_title">Kann ich diesen Code ändern?</a></li><li><a href="http://blog.codecentric.de/2010/02/selenium-und-ssl-zertifikate/" rel="bookmark" class="crp_title">Selenium und SSL-Zertifikate</a></li><li><a href="http://blog.codecentric.de/2009/09/commite-jeden-tag-oder-wirf-es-weg-lebe-agilitat-jeden-tag/" rel="bookmark" class="crp_title">Commite jeden tag, oder wirf es weg &#8211; Lebe Agilität jeden Tag</a></li><li><a href="http://blog.codecentric.de/2009/11/continuous-integration-im-uberblick/" rel="bookmark" class="crp_title">Continuous Integration im Überblick</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://blog.codecentric.de/2010/07/die-besten-ausreden-warum-der-build-bricht/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wer kommt zu spät zum Daily Scrum?</title>
		<link>http://blog.codecentric.de/2010/07/wer-kommt-zu-spat-zum-daily-scrum/</link>
		<comments>http://blog.codecentric.de/2010/07/wer-kommt-zu-spat-zum-daily-scrum/#comments</comments>
		<pubDate>Wed, 28 Jul 2010 14:43:16 +0000</pubDate>
		<dc:creator>Andreas Ebbert-Karroum</dc:creator>
				<category><![CDATA[Scrum]]></category>
		<category><![CDATA[Daily Scrum]]></category>
		<category><![CDATA[Motivation]]></category>

		<guid isPermaLink="false">http://blog.codecentric.de/?p=4723</guid>
		<description><![CDATA[Das tägliche Scrum dauert nur eine Viertelstunde und ist das zentrale Instrument eines Teams, um den Tag zu koordinieren und strukturieren. Da sollte man meinen, dass jede Minute zählt und jedem dem Meeting die Priorität und Bedeutung beimisst, die es &#8230; <a href="http://blog.codecentric.de/2010/07/wer-kommt-zu-spat-zum-daily-scrum/">weiterlesen  <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Das tägliche Scrum dauert nur eine Viertelstunde und ist das zentrale Instrument eines Teams, um den Tag zu koordinieren und strukturieren. Da sollte man meinen, dass jede Minute zählt und jedem dem Meeting die Priorität und Bedeutung beimisst, die es verdient. Die Erfahrung zeigt aber, dass es immer wieder geschieht, dass Teammitglieder nicht rechtzeitig zum Daily Scrum erscheinen. Wie geht man am besten mit der Situation um?</p>
<p><span id="more-4723"></span></p>
<p>Vor einigen Tagen fand auf Twitter eine vergleichsweise lebhafte Diskussion zu dem Thema statt (welche durch das 140-Zeichen-Limit effektiv unterbunden wurde). Auslöser war ein Vorschlag von <a href="http://twitter.com/itagile/status/19555664723">it-agile</a> Zuspätkommende sollten als Strafe auf <a href="http://www.betterplace.org/groups/scrum-but-too-late">betterplace.org spenden</a>. Daraufhin regnete es Thesen und Vorschläge, was ich zum Anlass nehmen möchte, das Problem gerne nochmal aus einem anderen Blickwinkel zu beleuchten.</p>
<p>Grundsätzlich produziert jegliches Handeln bestimmte Ergebnisse, welche wiederum eine oder mehrere Folgen nach sich ziehen. Wenn wir als mögliche Ergebnisse &#8220;zu spät zum Daily Scrum&#8221; und &#8220;pünktlich zum Daily Scrum&#8221; analysieren, welche Handlungen führen zu den Ergebnissen, und welche Folgen zieht sie nach sich?</p>
<h4>Ergebnis: &#8220;Zu spät zum Daily Scrum&#8221;</h4>
<table border="1">
<tbody>
<tr>
<th width="33%"><strong>Handlungen</strong></th>
<th width="33%"><strong>Ergebnisse</strong></th>
<th width="33%"><strong>Folgen</strong></th>
</tr>
<tr>
<td valign="top">
<ul>
<li>Zu spät von zu Hause losgefahren</li>
<li>Zu spät aus einem anderen Meeting rausgekommen</li>
<li>Gerade etwas anderes &#8220;wichtiges&#8221; zu tun</li>
<li>Die Uhr ging nach</li>
<li>Vertieft in die Arbeit und nicht gemerkt dass Daily Scrum ist</li>
</ul>
</td>
<td valign="top">
<ul>
<li>Zu spät zum Daily Scrum</li>
<li><em>(und noch weitere, die uns an dieser Stelle aber nicht weiter interessieren)</em></li>
</ul>
</td>
<td valign="top">
<ul>
<li>Andere im Team sind sauer</li>
<li>Die Zeit der anderen Teammitglieder wird vergeudet. Im gemeinsamen Interesse das Sprint-Commitment halten zu können, wird das wichtigste  vermutlich wiederholt werden.</li>
<li>Informationsaustausch ist funktioniert</li>
<li>Strafe für&#8217;s zu spät kommen</li>
</ul>
</td>
</tr>
</tbody>
</table>
<h4>Ergebnis: &#8220;Pünktlich zum Daily Scrum&#8221;</h4>
<table border="1">
<tbody>
<tr>
<th width="33%"><strong>Handlungen</strong></th>
<th width="33%"><strong>Ergebnisse</strong></th>
<th width="33%"><strong>Folgen</strong></th>
</tr>
<tr>
<td valign="top">
<ul>
<li>Man steht pünktlich zum Daily Scrum auf und geht in den entsprechenden Raum</li>
</ul>
</td>
<td valign="top">
<ul>
<li>Pünktlich zum Daily Scrum</li>
<li><em>(und noch weitere, die uns an dieser Stelle aber nicht weiter interessieren)</em></li>
</ul>
</td>
<td valign="top">
<ul>
<li>Flüssiges Meeting, das pünktlich zu Ende ist</li>
<li>Belohnung für&#8217;s pünktlich sein</li>
</ul>
</td>
</tr>
</tbody>
</table>
<h4>Wer kommt zu spät</h4>
<p>Interessant und störend wird die Situation erst, wenn sie gehäuft auftritt. Das heißt entweder kommt eine Person immer wieder zu spät, oder es sind sogar alle Teammitglieder gleichermaßen daran beteilig. Nun bieten sich auf den ersten Blick über die Betrafung oder Belohnung des jeweiligen Verhaltens zwei Hebel an.</p>
<p>Eine Möglichkeit besteht darin, Zuspätkommende zu bestrafen. Wenn die Strafe nur hoch genug ist (ein Finger abhacken pro Minute Zuspätkommen) wird mit Sicherheit niemend mehr auf absehbare Zeit zu spät zum Daily Scrum kommen. Dies wird aber zu lasten von anderen gewünschten Aktivitäten erfolgen, da jeder unter allen Umständen und Eventualitäten pünktlich sein möchte. Dann werden andere wichtige Meetings gar nicht erst wahrgenommen. Die Familie wird vernachlässigt, weil man sich schon um 5 Uhr morgens auf den Weg macht, um gegen Megastaus und Bahnausfälle gewapptnet zu sein. Klar, ich übertreibe jetzt, aber der Punkt ist denke ich klar: Natürlich kann ich ein Verhalten erzwingen, aber um welchen Preis? Außerdem: Verantwortlich für das Stattfinden und die Durchführung des Daily Scrums ist der Scrum Master. Hat er die nötige Weisungsbefugnis, um die Strafen auch durchzusetzen? Vermutlich nicht, denn das würde ja in einem starken Gegensatz zu der vom Team zu recht eingeforderten Selbstorganisation stehen. Eine Sackgasse.</p>
<p>Wie sieht&#8217;s mit Belohnungen aus? Wer pünktlich kommt, erhält als kleines Dankeschön € 100,00 in Bar. Ach, warum so geizig: € 10.000. Und, klappts? Abgesehen davon, dass der Product Owner die gestiegenen Kosten wohl nicht finanzieren würde, nutzt sich der Effekt der Belohnung spätestens nach dem einhunderstem Daily Scrum ab: Millionäre dürfen ruhig zu spät kommen. Außerdem ist eins ja wohl sonnenklar: Ohne die Belohnung wird überhaupt niemand mehr kommen.</p>
<p>Ok, abgehackte Finger und Millionenboni sind natürlich absurd (hoffe ich), aber es hilft die Effekte die stattfinden zu beleuchten. Was passiert wohl bei reduzierten Strafen und Belohnungen?</p>
<p>Wie wär&#8217;s mit einem Kaffee für alle, die pünktlich sind? Auch was anfangs vielleicht dazu gedacht sein mag ein jungagiles Team an den Prozess zu gewöhnen, kann schnell zum Bumerag werden. Wir Menschen haben da nämlich eine ganz dumme Angewohnheit: Selbst wenn wir Handlungen aus eigenen Antrieb ausführen, wenn es dafür eine Belohnung gibt, neigen wir dazu die Handlung nachträglich dem Erreichen der Belohnung zuzuschreiben. Ein Verdrängungseffekt findet statt: an die Stelle unserer intrinsischen Motivation tritt die extrinsische Belohnung. Um die erwünschte Handlung aufrecht zu erhalten, muß die Belohnung erhalten oder sogar erhöht werden. Irgendwann kommt niemand mehr wegen eines lausigen Kaffees zum Daily Scrum. Da muß es schon ein Latte Macchiato sein. Oder im Winter ein Irish Coffee <img src='http://blog.codecentric.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Die Belohnung lenkt jedenfalls den Fokus vom eigentlichen Ziel ab (nur zur Erinnerung: ein flüssiges und schnelles Daily Scrum) hin zum Erreichen der Belohnung. Das dieser Effekt um so stärker auftritt, wenn die Handlung ursprünglich nicht intrinsisch motiviert war, versteht sich von selbst. Belohnungen sind also kein probates Mittel, um Verspätungen dauerhaft einzudämmen.</p>
<p>Als Bestrafung für verspätetes Erscheinen wurden auf Twitter unter anderem die Zahlung eines kleineren Geldbetrags an einen guten Zweck oder öffentliches Singen genannt. Aber auch kleine Bestrafungen können einen ähnlich desaströsen Effekt haben, wie Belohnungen. Als Beispiel sei hier die Studie &#8220;<a href="http://radyschool.ucsd.edu/faculty/directory/gneezy/docs/fine.pdf">A Fine Is A Price</a>&#8221; (2000: Gneezy, U. / Rustichini, A) angeführt: In einigen Kindergärten wurde eine kleine Geldstrafe für verspätetes Abholen der Kinder eingeführt. Es stiegen nicht die Anzahl der Verspätungen an, diese blieben auch auf dem fast doppeltem Niveau, nachdem die Geldstrafe wieder abgeschafft wurde. Die Autoren erklären dieses Verhalten mit einem unvollständigen Vertrag. Auf die Situation des Daily Scrums übertragen könnte das heißen, dass der unvollständige Vertrag formuliert werden kann als: &#8220;Wir treffen uns täglich zur selben Zeit und am gleichen Ort zum Daily Scrum. Dies sehen wir als richtig und wichtig an. Wenn sich jemand verspätet wird meistens auf ihn gewartet, und das wichtigste wiederholt, damit wir gemeinsam unser Sprint commitment halten können. Wenn sich die Verspätungen häufen wird aber vermutlich etwas geschehen.&#8221; Dieses unkonkrete etwas, das geschieht, ist potentiell unerwünscht, aber sehr diffus. Dies wird durch die Geldstrafe konkretisiert, was in den Augen der Mitglieder die Geldstrafe zur schlimmstmöglichen Konsequenz macht.</p>
<p>Leider gibt die Studie keine Empfehlungen an die Hand, welche besseren Alternativen es gibt, den unvollständigen Vertrag zu konkretisieren.</p>
<h4>Informierend oder Kontrollierend</h4>
<p>Laut der kognitiven Bewertungstheorie (<a href="http://de.wikipedia.org/wiki/Selbstbestimmungstheorie">Cognitive Evaluation Theorie</a>) macht es einen Unterschied, ob ein extrinsischer Faktor, wie eine Belohnung oder eine Bestrafung, als kontrollierend oder informierend wahrgenommen wird. Während sich kontrollierende Faktoren negativ auf die intrinsische Motivation auswirken (und entweder rebellisches oder angepasstes Verhalten verursachen), haben lediglich informierende Faktoren keinen negativen Einfluß auf die intrinsische Motivation. Das heißt um auf lange Sicht alle Teilnehmer zur Pünktlichkeit zu bewegen, muß das Team einen Weg finden den Zuspätkommer zu informieren, ohne den Kontrollaspekt des Feedbacks überzubetonen. Dies könnte z.B. durch Ich-Botschaften geschehen, in denen andere Teammitglieder erklären, wie sie die Situation erleben. Wenn alle damit einverstanden sind, kann die Konsequenz fürs Verspäten auch eine öffentliche Gesangseinlage sein, oder ein mitgebrachter Kuchen, oder oder oder. In jeden Fall dürfte der &#8220;konkretisierte Vertrag&#8221; so individuell wie das Team sein.</p>
<p>Gibt es in Deinem Team Maßnahmen gegen Verspätungen im Daily Scrum &#8211; oder allgemein in den Scrum Meetings? Ich würde mich über Eure Kommentare freuen.</p>
<div id="crp_related"><ul><li><a href="http://blog.codecentric.de/2010/07/zusammensetzung-des-scrum-teams/" rel="bookmark" class="crp_title">Zusammensetzung des Scrum-Teams</a></li><li><a href="http://blog.codecentric.de/2009/10/der-klassische-projektmanager-in-scrum/" rel="bookmark" class="crp_title">Der klassische Projektmanager in Scrum</a></li><li><a href="http://blog.codecentric.de/2010/06/schon-diesen-freitag-agile-experten-zum-greifen-nah/" rel="bookmark" class="crp_title">Schon diesen Freitag: Agile Experten zum greifen nah</a></li><li><a href="http://blog.codecentric.de/2008/07/codecentric-prasentiert-scrum-fur-virtuelle-teams-bei-der-jug-koln/" rel="bookmark" class="crp_title">codecentric präsentiert Scrum für virtuelle Teams bei der JUG Köln Codecentric Presents Scrum for Virtual Teams at JUG Cologne<!--:--></a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://blog.codecentric.de/2010/07/wer-kommt-zu-spat-zum-daily-scrum/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>XPath und CSS Locators mit der Selenium IDE analysieren</title>
		<link>http://blog.codecentric.de/2010/07/xpath-und-css-locators-mit-der-selenium-ide-analysieren/</link>
		<comments>http://blog.codecentric.de/2010/07/xpath-und-css-locators-mit-der-selenium-ide-analysieren/#comments</comments>
		<pubDate>Wed, 28 Jul 2010 06:00:28 +0000</pubDate>
		<dc:creator>Andreas Ebbert-Karroum</dc:creator>
				<category><![CDATA[Agiles Testen]]></category>
		<category><![CDATA[Robot Framework]]></category>
		<category><![CDATA[Selenium]]></category>

		<guid isPermaLink="false">http://blog.codecentric.de/?p=4718</guid>
		<description><![CDATA[Auf der robotframework-users-Mailingliste tauchte eine Frage auf, wie man &#8220;Radio Buttons&#8221; mit der SeleniumLibrary handhaben soll. Es gab offenbar ein Problem mit dem von der SeleniumLibrary generierten XPath-Ausdruck, und der Benutzer wußte nicht genau, wie er das Problem weiter analysieren &#8230; <a href="http://blog.codecentric.de/2010/07/xpath-und-css-locators-mit-der-selenium-ide-analysieren/">weiterlesen  <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Auf der robotframework-users-Mailingliste tauchte eine Frage auf, <a href="http://groups.google.com/group/robotframework-users/browse_thread/thread/1189972464bf5adf">wie man &#8220;Radio Buttons&#8221; mit der SeleniumLibrary handhaben soll</a>. Es gab offenbar ein Problem mit dem von der SeleniumLibrary generierten XPath-Ausdruck, und der Benutzer wußte nicht genau, wie er das Problem weiter analysieren konnte.</p>
<p>Da ich es auch in einem privaten E-Mail-Wechsel nicht geschafft habe, das Vorgehen zu erläutern, habe ich einen kurzen Screencast gemacht (Gegen Ende musste ich den während der Testausführung kurz pausieren, um innerhalb der 5 Minuten zu bleiben). <span id="more-4718"></span></p>
<p>Hier ist der Screencast: Unten rechts ist ein kleines Icon, mit dem man in den Vollbildmodus wechseln kann:</p>
<p><object id="scPlayer" class="embeddedObject" width="600" height="364" type="application/x-shockwave-flash" data="http://content.screencast.com/users/AndreasEK/folders/Jing/media/d85c3c79-4676-41f3-9a8b-14d6de7a5c19/bootstrap.swf" ><param name="movie" value="http://content.screencast.com/users/AndreasEK/folders/Jing/media/d85c3c79-4676-41f3-9a8b-14d6de7a5c19/bootstrap.swf" /><param name="quality" value="high" /><param name="bgcolor" value="#FFFFFF" /><param name="flashVars" value="thumb=http://content.screencast.com/users/AndreasEK/folders/Jing/media/d85c3c79-4676-41f3-9a8b-14d6de7a5c19/FirstFrame.jpg&#038;containerwidth=1680&#038;containerheight=1020&#038;content=http://content.screencast.com/users/AndreasEK/folders/Jing/media/d85c3c79-4676-41f3-9a8b-14d6de7a5c19/SelectButton.swf&#038;blurover=false" /><param name="allowFullScreen" value="true" /><param name="scale" value="showall" /><param name="allowScriptAccess" value="always" /><param name="base" value="http://content.screencast.com/users/AndreasEK/folders/Jing/media/d85c3c79-4676-41f3-9a8b-14d6de7a5c19/" /></object></p>
<div id="crp_related"><ul><li><a href="http://blog.codecentric.de/2010/08/einfache-performanceanalyse-mit-appdynamics-lite/" rel="bookmark" class="crp_title">Einfache Performanceanalyse mit AppDynamics Lite</a></li><li><a href="http://blog.codecentric.de/2008/08/folien-der-scrum-prasentation-auf-der-jug-cologne/" rel="bookmark" class="crp_title">Folien der Scrum Präsentation auf der JUG Cologne</a></li><li><a href="http://blog.codecentric.de/2010/05/verwendung-von-tdd-in-der-praxis/" rel="bookmark" class="crp_title">Verwendung von TDD in der Praxis</a></li><li><a href="http://blog.codecentric.de/2009/12/scrumday-in-dusseldorf/" rel="bookmark" class="crp_title">#scrumday in düsseldorf</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://blog.codecentric.de/2010/07/xpath-und-css-locators-mit-der-selenium-ide-analysieren/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zusammensetzung des Scrum-Teams</title>
		<link>http://blog.codecentric.de/2010/07/zusammensetzung-des-scrum-teams/</link>
		<comments>http://blog.codecentric.de/2010/07/zusammensetzung-des-scrum-teams/#comments</comments>
		<pubDate>Fri, 23 Jul 2010 08:26:09 +0000</pubDate>
		<dc:creator>Marc Clemens</dc:creator>
				<category><![CDATA[Scrum]]></category>
		<category><![CDATA[Agilität]]></category>
		<category><![CDATA[agility]]></category>
		<category><![CDATA[SCRUM]]></category>

		<guid isPermaLink="false">http://blog.codecentric.de/?p=4581</guid>
		<description><![CDATA[Im Umfeld der agilen Methode „Scrum“ würde ich gerne einen wichtigen Aspekt des Projektmanagements näher betrachten. Die Zusammensetzung des Projektteams. Im klassischen Projektmanagement ist dies eine der grundlegendsten Aufgaben des Projektleiters. Im Idealfall kann er sein Projektteam selbst zusammenstellen und &#8230; <a href="http://blog.codecentric.de/2010/07/zusammensetzung-des-scrum-teams/">weiterlesen  <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Im Umfeld der agilen Methode „Scrum“ würde ich gerne einen wichtigen Aspekt des Projektmanagements näher betrachten. Die Zusammensetzung des Projektteams. Im klassischen Projektmanagement ist dies eine der grundlegendsten Aufgaben des Projektleiters. Im Idealfall kann er sein Projektteam selbst zusammenstellen und im laufenden Projekt verändern. Im realen Arbeitsalltag unterliegt er natürlich vielen äußeren Zwängen wie z.B. einer begrenzten Auswahl an potentiellen Teammitglieder, der Konkurrenz durch anderen Projekte und Budgetgrenzen, was aber nichts daran ändert, dass der Projektleiter diese Befugnis haben sollte.</p>
<p><span id="more-4581"></span>Bei Scrum gibt es die Rolle des Projektleiters nicht mehr. Die meisten Befugnisse und Verantwortlichkeiten haben sich auf die drei Rollen Product Owner, Scrum Master und Team verteilt. Wie geschieht das im Bereich der Teamzusammenstellung? Dabei sind folgende Teilaufgaben zu betrachten:</p>
<ul>
<li>Initiale Teamzusammensetzung</li>
<li>Fehlende Fähigkeiten im Team</li>
<li>Vergrößern des Teams (um      Velocity zu steigern)</li>
<li>Verkleinern des Teams (bei      „Leerlauf“)</li>
<li>„Low Performer“ und      „Störenfriede“ identifizieren und ausschließen</li>
</ul>
<p><strong>Initiale Teamzusammensetzung</strong><br />
Die Zusammenstellung des Teams bei Projektstart kann nicht durch das Team selber ge­sche­hen, das gibt es zu diesem Zeitpunkt noch gar nicht. Durch seine Budget­ver­ant­wort­lich­keit hat der Product Owner natürlich einen sehr starken Einfluss, aber die genaue Entscheidung liegt sinnvollerweise beim Scrum Master. Er sollte darauf achten, dass das Team gerade in der ersten Zeit funktionieren kann, sowohl von den fachlichen als auch den sozialen Fähigkeiten der einzelnen Teammitglieder.</p>
<p>Die hier auftauchende Frage wie eine gute Zusammensetzung des Projektteams über den gesamten Projektverlauf aussieht, halte ich für sehr spannend würde aber den Rahmen sprengen. Diese werde ich in einem zukünftigen Artikel beleuchten.</p>
<p><strong>Fehlende Fähigkeiten</strong><br />
Sollten im Team für das Projekt benötigte Kompetenzen fehlen, wird das durch das Team sehr schnell als Hindernis artikuliert. Meist erfolgt dies schon in den Daily Scrums, spätestens aber in den Retrospektiven. Es ist dann die Aufgabe des Scrum Masters dafür zu sorgen das Team mit den fehlenden Fähigkeiten auszustatten. Da bieten sich dem Scrum Master unterschiedliche Handlungsoptionen:</p>
<ul>
<li>Veränderung der Teamzusammensetzung</li>
<li>Schulung/Coaching von Teammitgliedern</li>
<li>Hinzuziehen eines Spezialisten</li>
</ul>
<p><strong>Vergrößerung des Teams<br />
</strong>Hier geht es um die Entscheidung das Team zu vergrößern um die Velocity langfristig zu steigern. Der Grund kann eine sinkende (oder stagnierende) Velocity, der ansteigenden Termindruck des Projekts von außen oder einfach freie Mitarbeiterkapazitäten die in laufende Projekte eingebunden werden sollen sein.</p>
<p>Dieser Fall beschäftigt vor allem den Product Owner und das Team. Der Product Owner muss immer zwischen einer steigenden Velocity und den höheren Kosten (durch ein größeres Team) abwägen. Das Team wiederum kann beurteilen ob und in welcher Form weitere Teammitglieder überhaupt sinnvoll helfen.</p>
<p><strong>Verkleinerung des Teams</strong><br />
Im Projektgeschäft kommt es immer wieder zu „Leerlauf“. Die Gründe hierfür sind sehr unterschiedlich, z.B. sind alle weiteren Aufgaben abhängig von einer Spezialistenaufgabe und sind so blockiert, zum Sprintende ist das Sprint-Backlog leer oder das Projekt­ende zeichnet sich gar durch eine leeres Product-Backlog ab. Auch lassen Projekte meist nur eine begrenzte Parallelisierung zu. Diese kann im Laufe des Projekts variieren und so „Leerlauf“ erzeugen. Dabei kann es sich beim „Leerlauf“ um ein spontanes Phänomen handeln oder er ist von systematischer Natur.</p>
<p>Erste Aufgabe ist es, zu erkennen, dass ein systematischer „Leerlauf“ vorliegt. Hier sind Team und Scrum Master gefordert. Dann ist eine passende Lösung zu finden, bevorzugt (und auch in den meisten Fällen möglich) im bestehenden Team, z.B. durch Neuschneiden der Aufgaben um die Spezialisten-Engpässe zu umgehen.</p>
<p>Aber gerade wenn es Richtung Projektende geht oder eine bisher genutzte hohe Parallelisierbarkeit entfällt, kann es Sinn machen, ein großes Team zu verkleinern.</p>
<p>Die Frage, welche neue Teamgröße sinnvoll ist, kann evtl. noch das Team entscheiden. Ich halte es aber für unklar, wie und durch wen die Teammitglieder ermittelt werden, die das Team verlassen müssen.</p>
<p><strong>Low Performer und Störenfriede</strong><br />
Als eine der schwierigeren Aufgaben im Projektmanagement empfinde ich den Umgang mit Teammitgliedern, die nicht das benötigte Leistungsniveau zeigen oder massiv und anhaltend Unruhe in die Gruppe bringen. Eine Stärke von Scrum kann bei der Selbstregulierung innerhalb der Gruppe liegen. Diese setzt aber entsprechende soziale Kompetenzen und ein gutes Standing bei den anderen Teammitgliedern voraus. Es ist möglich, dass das alleine die Situation nicht rettet. Dann ist der Scrum Master gefordert, solche Dinge zu erkennen, anzusprechen und auf eine Lösung zu drängen. Ultima Ratio bleibt in solchen Situationen, das entsprechende Teammitglied aus dem Team zu entfernen, wobei unklar ist, wer diese (harte und recht endgültige) Entscheidung fällen darf.</p>
<p><strong>Fazit<br />
</strong>Auch in diesem Bereich teilen sich die Aufgaben auf die neuen Rollen auf. Gerade für harte Entscheidungen, aber auch in der Startphase von Projekten kann der &#8220;klassische Projektleiter&#8221; trotz allem vermisst werden.</p>
<div id="crp_related"><ul><li><a href="http://blog.codecentric.de/2009/10/der-klassische-projektmanager-in-scrum/" rel="bookmark" class="crp_title">Der klassische Projektmanager in Scrum</a></li><li><a href="http://blog.codecentric.de/2009/10/agile-testing-days-keynote-mit-stuart-reid-investing-in-individuals-and-interactions/" rel="bookmark" class="crp_title">Agile Testing Days &#8211; Keynote mit Stuart Reid &#8211; Investing in individuals and interactions</a></li><li><a href="http://blog.codecentric.de/2009/09/scrum-als-dienstleister/" rel="bookmark" class="crp_title">Scrum als Dienstleister</a></li><li><a href="http://blog.codecentric.de/2009/07/ausblick-meet-the-experts-agilitat-am-4-september/" rel="bookmark" class="crp_title">Ausblick: Meet The Experts &#8211; Agilität am 4. September</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://blog.codecentric.de/2010/07/zusammensetzung-des-scrum-teams/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Struktur einer wartbaren und skalierenden Fachtest-Suite</title>
		<link>http://blog.codecentric.de/2010/07/struktur-einer-wartbaren-und-skalierenden-fachtest-suite/</link>
		<comments>http://blog.codecentric.de/2010/07/struktur-einer-wartbaren-und-skalierenden-fachtest-suite/#comments</comments>
		<pubDate>Tue, 20 Jul 2010 14:59:06 +0000</pubDate>
		<dc:creator>Andreas Ebbert-Karroum</dc:creator>
				<category><![CDATA[Agiles Testen]]></category>
		<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Robot Framework]]></category>
		<category><![CDATA[Softwaredesign]]></category>
		<category><![CDATA[Wartbarkeit]]></category>

		<guid isPermaLink="false">http://blog.codecentric.de/?p=4578</guid>
		<description><![CDATA[Du hast angefangen automatische Fachtests zu schreiben, um nicht in jedem Sprint manuell die Ergebnisse aller vorherigen Sprints testen zu müssen. Prima, wir auch. Nach einer Weile des erfolgreichen Testens ähneln die ganzen Tests aber immer mehr einem Gestrüpp statt &#8230; <a href="http://blog.codecentric.de/2010/07/struktur-einer-wartbaren-und-skalierenden-fachtest-suite/">weiterlesen  <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.codecentric.de/wp-content/uploads/2010/07/2010-07-16_2335-small.png"></a>Du hast angefangen automatische Fachtests zu schreiben, um nicht in jedem Sprint manuell die Ergebnisse aller vorherigen Sprints testen zu müssen. Prima, wir auch. Nach einer Weile des erfolgreichen Testens ähneln die ganzen Tests aber immer mehr einem Gestrüpp statt einer sauber entworfenen Test-Suite. Mist, bei uns auch. Was ist da schief gelaufen? Im Laufe der Zeit haben sich bei uns einige Muster und Herangehensweisen herausgebildet, die zu einer stabilen, skalierenden und vor allem auch wartbaren Testinfrastruktur führen, welche ich im Folgenden näher vorstellen möchte.<span id="more-4578"></span></p>
<p>Betrachtet werden soll hier lediglich die Struktur der Fachtests selbst. Außen vor bleiben sämtliche Überlegungen zur konkreten Ausführung (Logging, Parallelisierung) und Hardware. Wie schon des Öfteren erwähnt benutzen wir das Robot Framework zur Fachtest-Automatisierung, deshalb sind einige der vorgestellten Erkenntnisse spezifisch für das Robot Framework. Das meiste lässt sich aber auch auf andere Testframeworks übertragen. Wenn Ihr also Fitnesse, Cucumber, Concordion, etc. verwendet, braucht Ihr nicht gleich aufhören, zu lesen <img src='http://blog.codecentric.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Genug des Vorworts, los geht&#8217;s:</p>
<p>In letzter Zeit hat es viele, gute Artikel gegeben, die sich mit der Frage beschäftigen, was einen einzelnen, guten Fachtest ausmacht: Da sei zum Beispiel Gojko Adzics Beitrag &#8220;<a href="http://gojko.net/2010/06/16/anatomy-of-a-good-acceptance-test/">Anatomy of a good acceptance test</a>&#8221; empfohlen, oder Dale Emerys Artikel &#8220;<a href="http://cwd.dhemery.com/2009/11/wmaat/ ">Writing Maintainable Automated Acceptance Tests</a>&#8221; (<a href="http://dhemery.com/pdf/writing_maintainable_automated_acceptance_tests.pdf ">PDF</a>), welcher die Ideen mit Codebeispielen und dem Robot Framework illustriert (<a href="http://blog.objectmentor.com/articles/2009/12/07/writing-maintainable-automated-acceptance-tests">Uncle Bob zeigt das Gleiche nochmal mit FitNesse</a>). Nun bleibt ein einzelner, exzellent aufgebauter Fachtest aber selten alleine, wie aber schreibt man eine wartbare Test-Suite? Mit Test-Suite bezeichne ich nicht nur die Summe alles Tests, sondern alles, was notwendig ist, um die Tests auch auszuführen (also auch zusätzliche Artefakte, Libraries, Frameworks, etc.). Die Diskussion möchte ich mit einem Zitat aus Dales Artikel einleiten:</p>
<blockquote><p>The need to change tests comes from two directions: changes in  requirements and changes in the system’s implementation. Either kind of  change can break any number of automated tests. If the tests become out  of sync with either the requirements or the implementation, people stop  running the tests or stop trusting the results. To get the tests back in  sync, we must change the tests to adapt to the new requirements or the  new implementation.</p></blockquote>
<p>Die Notwendigkeit, Änderungen an der Test-Suite durchzuführen, ergibt sich also zum Einen aus Änderungen an den Anforderungen, und zum anderen aus Änderungen in der Umsetzung. Und was für einen einzelnen Test gilt, gilt natürlich erst recht für eine ganze Test-Suite. Wie soll eine ganze Test-Suite aber aufgebaut sein, um sich den Änderungen möglichst gut anpassen zu können? Offenbar gibt es Teile, die eher stabil sind und Teile, die flexibel und variabel sind.</p>
<p><strong>Stabil</strong> sind z.B. das Testframework selbst und die zugehörigen Libraries und Plug-Ins. Diese wird man nicht mal eben austauschen sondern nach Möglichkeit konstant halten. Ebenso konstant sollten die Testfälle selbst bleiben, wenn es keine Geschäftsgrundlage gibt, die Tests zu ändern. Was allerdings problemlos möglich sein sollte: neue Tests unabhängig von den anderen hinzufügen. Wo sind dann die <strong>variablen </strong>Teile der Test-Suite, wenn sowohl die Tests (gedanklich ganz oben), als auch die Plattform (gedanklich ganz unten) stabil sein sollen. Die nachfolgende Grafik soll dies verdeutlichen und beschreibt den Aufbau einer wartbaren und skalierenden Test-Suite. Die einzelnen Schichten werden unterhalb der Grafik im Detail beschrieben, ganz grob lässt sich die Frage nach den variablen Teilen ganz einfach beantworten: Wenn ich ein System habe, dass an zwei Enden Stabil sein soll, insgesamt aber flexibel, dann müssen die variablen Anteile natürlich in der Mitte sitzen.</p>
<p>Im Folgenden soll der schichtenhafte Aufbau betrachtet werden. Die  unterschiedlichen Farben symbolisieren dabei die unterschiedlichen Arten  von Dateien im Robot-Framework:</p>
<ul>
<li><strong>rot:</strong> Testfälle und  Test-Suiten selbst sind durch rote Kästchen hervorgehoben.</li>
<li><strong>grün:</strong> Robots Resource-Dateien sind grün. Resourcen beinhalten Keywords, die  von anderen Resourcen, oder von Testfällen aufgerufen werden können.  Vereinfacht gesprochen ist ein Keyword einer Methode nicht unähnlich,  eine Resource ist also eine kleine Sammlung von Hilfsmethoden.</li>
<li><strong>blau:</strong> Elemente des Robot Frameworks selbst sind blau.</li>
</ul>
<p>Am linken  Rand der Grafik ist der Grad der Stabilität, bzw. der Variabilität der  Schicht aufgetragen. Oben und unten ergibt sich ein Maximum an  Stabilität, welches zur Mitte hin abnimmt und dort ein Maximum der Variabilität aufweist.  Das bedeutet, dass die Elemente in der Mitte der Grafik am Häufigsten  Änderungen ausgesetzt sind, während die Elemente oben und unten über die  Zeit relativ konstant bleiben.</p>
<div id="attachment_4625" class="wp-caption aligncenter" style="width: 610px"><a href="http://blog.codecentric.de/wp-content/uploads/2010/07/Scalable-And-Maintainable-Acceptance-Test-Suite.png" rel="lightbox"><img class="size-medium wp-image-4625 " title="Scalable and Maintainable Acceptance Test-Suite" src="http://blog.codecentric.de/wp-content/uploads/2010/07/Scalable-And-Maintainable-Acceptance-Test-Suite-600x416.png" alt="Scalable and Maintainable Acceptance Test-Suite" width="600" height="416" /></a><p class="wp-caption-text">Scalable and Maintainable Acceptance Test-Suite</p></div>
<p>Die einzelnen Schichten im Detail:</p>
<h4>Test Cases</h4>
<p>Die Testfälle selbst sollten ausschließlich angefasst werden müssen, wenn sich die Anforderungen ändern. Unsere präferierte Art und Weise das Verhalten in Robot zu spezifizieren ist <a href="http://blog.codecentric.de/2009/11/givenwhenthen-und-beispieltabellen-mit-dem-robot-framework/">das &#8220;Given / When / Then&#8221;-Format, garniert mit Beispieltabellen</a> (das <a href="http://blog.codecentric.de/2010/05/kleine-grammatik-zum-schreiben-von-ausfuhrbaren-spezifikationen-auf-deutsch/">geht auch auf Deutsch</a>). Andersherum formuliert bedeutet das, wenn sich die Anforderungen nicht ändern, darf es keinen technischen Grund geben, die Dateien mit den Testfällen auch nur anzufassen.</p>
<h4>Test Suites</h4>
<p>Testfälle sollten zu funktional zusammenhängenden Test-Suites gruppiert werden. Anfangs hatten wir einzelne Testfälle nach der User Story gruppiert, in welcher diese entstanden sind. Im Nachhinein hat sich aber herausgestellt, dass man dann oft suchen musste, wo sich welcher Test versteckte, wenn mehrere thematisch verwandte Stories existierten. Besser ist es, die <a href="http://robotframework.googlecode.com/svn/tags/robotframework-2.5/doc/userguide/RobotFrameworkUserGuide.html#tagging-test-cases">Test Cases mit der User Story zu taggen</a>, und die Tests nach Thema zu gruppieren.</p>
<h4>Imports</h4>
<p>Die nächste Schicht habe ich &#8220;Imports&#8221; genannt. Ihr Zweck ist das Mapping von Testfällen zu Resource-Dateien, welche die Keywords zur Automatisierung des Fachtests enthalten. Da die Tests selbst nicht durch technische Gründe geändert werden sollen, die Keywords aber laufend refactored und verschoben werden, brauchen wir etwas, das genau dieses Mapping herstellt. Da thematisch verwandte Tests in einer Test-Suite vermutlich ähnliche Imports brauchen, verwenden alle Tests in einer Test-Suite die gleiche Import-Resource. Umgekehrt wird jede Import-Resource nur von Tests aus einer Test-Suite verwendet.</p>
<p>Eigentlich enthalten die Import-Resourcen keine eigenen Keywords. Sie bieten sich allerdings trotzdem für solche &#8220;Einmal-Keywords&#8221; an, die ausschließlich in genau dieser Test-Suite verwendet werden, und in keiner der Resource-Dateien aus dem Layer darunter Sinn machen.</p>
<h4>Aggregierende Objekte</h4>
<p>Die Schicht mit der größten Änderungsfrequenz beinhaltet aggregierende Objekte: Bei Tests einer Weboberfläche hat sich schon das Entwicklungsmuster eines &#8220;<a href="http://code.google.com/p/selenium/wiki/PageObjects">Page Objects</a>&#8221; etabliert (hier weitere Beispiele für <a href="http://us1.campaign-archive1.com/?u=8a43ccdb821548b314780e0f3&amp;id=5c4d715177">Page Objects mit Selenium</a> selbst oder mit <a href="http://blog.m.artins.net/acceptance-tests-with-jbehave-selenium-page-objects/">JBehave</a>). Abstrahierend vom Konzept einer Webseite findet in dieser Schicht das klassische Softwaredesign statt: wie wird Code strukturiert, um flexibel um wartbar zu sein. Page Objects sind eine Möglichkeit, wenn es tatsächlich um Webseiten geht. Allgemein können das auch andere Aggregate wie Business- oder Domänenobjekte, Services oder ähnliches sein.</p>
<h4>Library Adapter</h4>
<p>Wir haben eine Schichte der &#8220;Library Adapter&#8221; eingeführt, nachdem wir auf der robotframework-users Mailingliste recht ausführlich über das Thema &#8220;<a href="http://groups.google.com/group/robotframework-users/browse_thread/thread/124680e08dd90cfd/c97de6416ae84977?#c97de6416ae84977">Multiple initialization of a Library</a>&#8221; diskutierten <em>(an dieser Stelle ein dickes Dankeschön an Pekka, Janne und die anderen Roboter, die auch auf schräge Fragen schnell und kompetent antworten)</em>. Fazit der Diskussion war, dass man Libraries am besten über eine Resource importiert, um sicher zu stellen, dass man nur eine Instanz der Library im System hat. Nach der Einführung der Library Adapter haben sich diese aber auch aus weiteren Perspektiven als nützlich erwiesen: Wird eine Library mit Parametern initialisiert (wie das z.B. bei der <a href="http://robotframework-seleniumlibrary.googlecode.com/hg/doc/SeleniumLibrary.html?r=2.4">SeleniumLibrary</a> der Fall ist) hat man nun nur noch eine Stelle im Code, an der die Parameter stehen (<a href="http://de.wikipedia.org/wiki/DRY">DRY</a>). Desweiteren kann die Library still und heimlich um weitere Funktionalität ergänzt werden,  indem Keywords die thematisch eigentlich in die Library gehörten temporär in dem Library-Adapter aufgefangen werden, bis die entsprechende Funktionalität in der Library abgebildet ist.</p>
<h4>Platform</h4>
<p>Die Plattform umfasst die installierten Komponenten des Robot Frameworks und der <a href="http://code.google.com/p/robotframework/wiki/TestLibraries">verfügbaren Libraries</a>.</p>
<h3>Fazit</h3>
<p>Abschließend kann ich feststellen, dass wir mit unserer neuen Struktur der Test-Suite deutliche Fortschritte gemacht haben. Andrerseits lernen auch wir ständig dazu und ich bin mir sicher, dass neue Erkenntnisse weiteren Einfluss auf Struktur und Gliederung der Test-Suite und einzelner Tests haben. Ich hoffe, dass wir unser bisher erworbenes Wissen hier gut zusammenfassen und präsentieren konnten, damit auch andere Projekte davon profitieren können.</p>
<p>Wie sehen Deine Erfahrungen bzgl. der Wartbarkeit von Test-Suites aus? Führen andere Technologien zu anderen Test-Suites? Gibt es in der vorgestellten Zwischenlösung noch Probleme, die uns bisher nicht aufgefallen sind? Ich freue mich auf die Kommentare.</p>
<div id="crp_related"><ul><li><a href="http://blog.codecentric.de/2009/11/givenwhenthen-und-beispieltabellen-mit-dem-robot-framework/" rel="bookmark" class="crp_title">Given/When/Then und Beispieltabellen mit dem Robot Framework</a></li><li><a href="http://blog.codecentric.de/2010/04/fachtests-mit-dem-robot-framework-in-der-muttersprache-schreiben/" rel="bookmark" class="crp_title">Fachtests mit dem Robot Framework in der Muttersprache schreiben</a></li><li><a href="http://blog.codecentric.de/2010/05/kleine-grammatik-zum-schreiben-von-ausfuhrbaren-spezifikationen-auf-deutsch/" rel="bookmark" class="crp_title">Kleine Grammatik zum Schreiben von ausführbaren Spezifikationen auf Deutsch</a></li><li><a href="http://blog.codecentric.de/2010/03/robot-framework-fachtests-in-eclipse-entwickeln-und-mit-maven-ausfuhren/" rel="bookmark" class="crp_title">Robot Framework Fachtests in Eclipse entwickeln und mit Maven ausführen</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://blog.codecentric.de/2010/07/struktur-einer-wartbaren-und-skalierenden-fachtest-suite/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Dateidownloads mit Selenium &#8211; einfach unmöglich?</title>
		<link>http://blog.codecentric.de/2010/07/dateidownloads-mit-selenium-einfach-unmoglich/</link>
		<comments>http://blog.codecentric.de/2010/07/dateidownloads-mit-selenium-einfach-unmoglich/#comments</comments>
		<pubDate>Fri, 09 Jul 2010 14:28:33 +0000</pubDate>
		<dc:creator>Andreas Ebbert-Karroum</dc:creator>
				<category><![CDATA[Agiles Testen]]></category>
		<category><![CDATA[Robot Framework]]></category>
		<category><![CDATA[Selenium]]></category>

		<guid isPermaLink="false">http://blog.codecentric.de/?p=4543</guid>
		<description><![CDATA[Wenn man anfängt Fachtests zu automatisieren kommt man recht schnell an den Punkt, an dem geprüft werden muss, ob über eine Weboberfläche angebotene Dokumente bestimmten Kriterien genügen. Wer das schon einmal probiert hat weiß: Dateidownloads automatisch zu durchzuführen und zu &#8230; <a href="http://blog.codecentric.de/2010/07/dateidownloads-mit-selenium-einfach-unmoglich/">weiterlesen  <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Wenn man anfängt Fachtests zu automatisieren kommt man recht schnell an den Punkt, an dem geprüft werden muss, ob über eine Weboberfläche angebotene Dokumente bestimmten Kriterien genügen. Wer das schon einmal probiert hat weiß: Dateidownloads automatisch zu durchzuführen und zu testen, ist aber einfach unmöglich &#8230; oder?</p>
<p><span id="more-4543"></span>Häufige Waffe der Wahl für Tests von Web-UIs ist Selenium. In der Konstellation &#8220;Selenium vs. Download&#8221; ergeben sich gleich mehrere Probleme, die gelöst werden müssen:</p>
<ol>
<li><strong>Dateidownload:</strong> Der Download-Dialog, der sich nach einem Klick auf ein Dokument öffnet ist in allen Browsern nativ und kann nicht über JavaScript gesteuert werden. Eine schlechte Ausgangslage für Selenium: Ohne eine Möglichkeit auf den Dialog Einfluß zu nehmen, bleibt dieser geöffnet und der Testcase hängt.</li>
<li><strong>Dateitransfer:</strong> Unter der Annahme, dass das erste Problem gelöst werde kann, ergibt sich ein Folgeproblem: Falls der Selenium-Server nicht auf dem gleichen Rechner läuft, wie der Server zur Testautomatisierung, muss die gerade heruntergeladene Datei auch noch irgendwie auf den Testautomatisierungs-Server transferiert werden.</li>
</ol>
<h4>Ansätze zur Lösung des Downloadproblems</h4>
<p>Das Problem des Dateidownloads kann auf unterschiedliche Weisen gelöst werden.</p>
<p><strong>1. Fensterautomatisierung</strong><br />
Der erste Ansatz hat was von &#8220;Brute Force&#8221;: Sucht man im Internet nach einer Lösung findet man recht schnell <a href="http://www.jsystemtest.org/?q=node/70">Vorschläge</a>, den Download-Dialog über eine native Fensterautomatisierung wie <a href="http://www.autoitscript.com/autoit3/index.shtml">AutoIt</a> fernzusteuern. D.h. man würde AutoIt so vorbereiten, dass es auf einen Download-Dialog unterschiedlicher Browser wartet, und an der Stelle an der Selenium hängen bleiben würde das Ruder übernimmt, die Datei speichert und den Dialog wieder schließt. Danach kann Selenium wie gewohnt weitermachen. </p>
<p>Das mag funktionieren, aber ich fand die Lösung technischen overkill, und wie sich gezeigt hat, geht es auch wesentlich einfacher.</p>
<p><strong>2. Standardverhalten des Browsers anpassen</strong><br />
Die zweite Möglichkeit besteht darin, das Profil des Browsers dahingehend anzupassen, dass sich z.B. beim Klick auf ein PDF erst gar kein Dialog öffnet, der fragt, was der Benutzer mit der Datei anstellen möchte, sondern diese kommentarlos und ohne jede Nachfrage in ein vorbestimmtes Verzeichnis schreibt. Dazu muss mit dem entsprechenden Browser und Profil einmal ein Download durchgeführt werden, um dann dort das Standardverhalten festzulegen (&#8220;Für Dateien dieses Typs immer diese Aktion ausführen&#8221;).</p>
<p>Na gut, das könnte funktionieren. Man muss &#8220;nur&#8221; sicherstellen dass alle EntwicklerInnen, Hudson-Instanzen, etc das gleiche Browserprofil verwenden. Und je nach dem wieviele unterschiedliche Dateitypen heruntergeladen werden sollen, ist das auch ein kleines Stück arbeit.</p>
<p><strong>3. Direkter Download</strong><br />
Warum eigentlich den Umweg über Selenium? Wäre es nicht viel cooler, wenn man die Datei einfach ohne Selenium runterlädt? Dann hätte man das zweite Problem auch gleich mit erschlagen. Warum eigentlich nicht, wget gibt es schließlich nicht nur für Linux, sondern auch <a href="http://gnuwin32.sourceforge.net/packages/wget.htm">für Windows</a>. Problem gelöst? Nicht ganz: was ist mit Dateien, die nicht frei zugänglich sind? Was ist wenn ich erst mit Selenium einen bestimmten Zustand herstellen möchte, um dann auf eine möglicherweise generierte Datei zuzugreifen? Für öffentliche Dateien scheint die Lösung gut zu funktionieren, aber für manche Situationen ist die Lösung wohl noch nicht ausreichend.</p>
<p><strong>Fazit: Downloadproblem</strong><br />
Ok, es ist möglich Dateien herunterzuladen, es ist aber mit etwas Arbeit und eventuell weiteren Werkzeugen verbunden. Aber der erste Schritt ist ja, dass man überhaupt eine funktionierende Lösung hat.</p>
<p>Was war nochmal das andere Problem?</p>
<h4>Ansätze zur Lösung des Dateitransfer-Problems</h4>
<p>Na gut, zugegeben, das ist kein wirkliches Problem. FTP kann heutzutage doch jeder. Fast jeder. Für unser favorisiertes Werkzeug zur Fachtestautmatisierung, das <a href="http://code.google.com/p/robotframework/">Robot Framework</a>, gibt es leider <a href="http://code.google.com/p/robotframework/issues/detail?id=86">noch keine Library, die per FTP auf entfernte Dateien zugreifen kann</a>. Hier hieße es also mal wieder flugs eine eigene kleine Library geschrieben, was aber auch nicht so schwierig sein dürfte. </p>
<h4>Problem gelöst</h4>
<p>In Verbindung mit den Ansätzen 1 und 2 von oben wäre es also möglich das Problem vollständig zu lösen:</p>
<ul>
<li>Datei mit Selenium herunterladen und in ein Verzeichnis schreiben, das über FTP erreichbar ist</li>
<li>Dann per FTP die Datei zum Server zu Fachtestautomatisierung transferrieren.</li>
<li>Danach können dann nach belieben Checks auf der Datei ausgeführt werden.</li>
</ul>
<p>Puh &#8230; das sieht nach einer Menge Arbeit für ein eigentlich recht einfaches Problem aus. </p>
<p>Irgendwie nagt immer noch das wget an mir, was ja eigentlich nach einer sehr einfachen, aber unvollständigen Lösung aussieht &#8230; Wäre es nicht cool, wenn man wget irgendwie sagen könnte, es soll da weitermachen, wo Selenium aufgehört hat? Man kann!</p>
<h4>Gesamtlösung</h4>
<p>Letztendlich ist die Lösung sehr einfach und elegant, und ich frage mich, warum ich nicht direkt darauf gekommen bin &#8212; vermutlich ein Anzeichen dafür, dass die Lösung wirklich sehr einfach ist. </p>
<p>Wie kann man wget also sagen, es soll an dem Punkt weitermachen, an dem Selenium gerade aufgehört hat? Woher weiß ein Webserver, wer da überhaupt den Request stellt: über die aktuelle Session! Man kann wget über Cookies und Header-Parametern die Session-ID mitgeben, um dann auf die Datei zugreifen zu können. Das ganze ist als Keyword implementiert ein Zweizeiler!</p>
<p><strong>Keyword &quot;Download File&quot;</strong></p>

<div class="wp_syntax"><div class="code"><pre class="txt" style="font-family:monospace;">Download File  [Arguments]  ${COOKIE}  ${URL}  ${FILENAME}
  ${COOKIE_VALUE} =  Call Selenium API  get_cookie_by_name  ${COOKIE}
  Run and Return RC  wget --cookies=on --header &quot;Cookie: ${COOKIE}=${COOKIE_VALUE}&quot; -O ${OUTPUT_DIR}${/}${FILENAME} ${URL}</pre></div></div>

<p>Zuerst wird also über einen direkten Aufruf einer Methode der Selenium API ein bestimmtes Cookie ausgelesen und dessen Wert zwischengespeichert. Im zweiten Schritt wird ein neuer Prozess gestartet und so lange gewartet, bis dieser Prozess terminiert. Das ist der Fall, wenn die Datei erfolgreich mit wget heruntergeladen werden konnte. Dazu muss wget natürlich irgendwo im Pfad liegen, ansonsten wird der Test nicht funktionieren. Über den Headerparameter &#8220;Cookie:&#8221; arbeitet wget in der gleichen Session weiter wie Selenium, und hat somit Zugriff auf die Datei. Voilà <img src='http://blog.codecentric.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Das neue Keyword nimmt drei Parameter entgegen</p>
<ol>
<li><strong>COOKIE</strong> Das Cookie wird vorher über Selenium ausgelesen und dann an wget weitergegeben. Das ist üblicherweise ein Indikator für die laufende Session</li>
<li><strong>URL</strong> Der Link zu der Datei die heruntergeladen werden soll</li>
<li><strong>FILENAME</strong> Der Name unter dem die Datei in Robots Outputverzeichnis abgelegt werden soll</li>
</ol>
<p><strong>Gebrauch des neuen Keywords</strong></p>
<p>Der Gebrauch des neuen Keywords ist jetzt schon fast trivial, trotzdem hier der Vollständigkeit halber der Download eines PDFs, das als &#8220;file.pdf&#8221; in das Ausgabeverzeichnis gelegt wird (d.h. dort, wo auch die Reports landen). Das Cookie mit der Session-ID ist JSESSION.</p>

<div class="wp_syntax"><div class="code"><pre class="txt" style="font-family:monospace;">Download File  JSESSIONID    http://&lt;...&gt;/web/pdf?id=4711  file.pdf</pre></div></div>

<p><strong><br />
Dateidownloads mit Selenium &#8211; einfach möglich!</strong></p>
<div id="crp_related"><ul><li><a href="http://blog.codecentric.de/2010/02/selenium-und-ssl-zertifikate/" rel="bookmark" class="crp_title">Selenium und SSL-Zertifikate</a></li><li><a href="http://blog.codecentric.de/2010/02/remote-screenshots-mit-selenium-und-dem-robot-framework/" rel="bookmark" class="crp_title">Remote Screenshots mit Selenium und dem Robot Framework</a></li><li><a href="http://blog.codecentric.de/2009/08/eclipse-resource-is-out-of-sync-no-more/" rel="bookmark" class="crp_title">Eclipse: Resource is out of Sync (no more)</a></li><li><a href="http://blog.codecentric.de/2009/08/fitnesse-vs-robot-framework-%e2%80%93-agile-testing-tools/" rel="bookmark" class="crp_title">FitNesse vs. Robot Framework – Agile Testing Tools</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://blog.codecentric.de/2010/07/dateidownloads-mit-selenium-einfach-unmoglich/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
