<?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>Just about .Net &#187; DotNetGerman Bloggers</title>
	<atom:link href="http://www.just-about.net/category/community/dotnetgerman-bloggers/feed" rel="self" type="application/rss+xml" />
	<link>http://www.just-about.net</link>
	<description>It&#039;s just a blog about .Net...</description>
	<lastBuildDate>Thu, 17 May 2012 10:49:39 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Dotnet Developers Conference 2012 – Eine subjektive Zusammenfassung</title>
		<link>http://www.just-about.net/dotnet-developers-conference-2012-eine-subjektive-zusammenfassung</link>
		<comments>http://www.just-about.net/dotnet-developers-conference-2012-eine-subjektive-zusammenfassung#comments</comments>
		<pubDate>Tue, 15 May 2012 22:05:21 +0000</pubDate>
		<dc:creator>Hendrik Lösch</dc:creator>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[DotNetGerman Bloggers]]></category>
		<category><![CDATA[MS Test]]></category>
		<category><![CDATA[Test]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[Vorträge]]></category>
		<category><![CDATA[NUnit]]></category>
		<category><![CDATA[Pattern]]></category>
		<category><![CDATA[Veranstalltungen]]></category>

		<guid isPermaLink="false">http://www.just-about.net/?p=2263</guid>
		<description><![CDATA[Zwei Tage DDC liegen hinter mir. Übermüdet und voller neuer Eindrücke sitze ich nun in einem Regionalexpress nach Dresden der hoffentlich auch irgendwann einmal ankommt, vielen Dank Deutsche Bahn für die bescheidene Anbindung. Gefühlte 95% der Zeit war ich dabei als üblicher Teilnehmer unterwegs. Die einzigen Unterscheidungsmerkmale gegenüber der Allgemeinheit waren das rote Bändchen am [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.just-about.net/wp-content/uploads/2012/05/DDC-2012_BannerSpeaker.jpg" rel="lightbox[2263]"><img class="alignleft  wp-image-2266" title="DDC-2012_BannerSpeaker" src="http://www.just-about.net/wp-content/uploads/2012/05/DDC-2012_BannerSpeaker.jpg" alt="" width="200" height="120" /></a> Zwei Tage DDC liegen hinter mir. Übermüdet und voller neuer Eindrücke sitze ich nun in einem Regionalexpress nach Dresden der hoffentlich auch irgendwann einmal ankommt, vielen Dank Deutsche Bahn für die bescheidene Anbindung.</p>
<p>Gefühlte 95% der Zeit war ich dabei als üblicher Teilnehmer unterwegs. Die einzigen Unterscheidungsmerkmale gegenüber der Allgemeinheit waren das rote Bändchen am Namensschild und der große Aufdruck „Speaker“ auf meinem Poloshirt. Die Insignien der Konferenzelite wenn man so will, welche schnellere Kontaktaufnahme und einige detailliertere Einblicke in die Organisation garantierten.</p>
<p><span id="more-2263"></span></p>
<p><strong>Die Sicht des Teilnehmers</strong></p>
<p>Bevor ich auf letzteres eingehe sei aber zunächst erst einmal die Infrastruktur gelobt. Die Internetverbindung war schnell und funktionierte fast immer tadellos, nur manchmal bedurfte es einiger Anläufe um zum gewünschten Ziel zu kommen. Das Essen fand ich reichlich und weitestgehend gutschmeckend. Vor allem die Cateringidee bei der OpenNight mit Burgern und Hotdogs zum selber basteln hatte einen hohen Kreativitätsfaktor.</p>
<p>Nur als ich mir am ersten Tag irgendein Wirsing-Matsch-Patsch auf den Teller hievte hätte ich mir zum einen gern einen Schildchen mit kurzer Beschreibung gewünscht und vor allem eine etwas breitere Aufstellung der Tische mit dem Essen. Diese standen in den Stoßzeiten leider zu nahe bei einander, wodurch sich die Schlangen daran gegenseitig im Weg standen, was wiederum die Inbesitznahme der Leckereien beim Mittagessen zu einem kleinen Spießrutenlauf werden ließ an dessen Ende man sich mit irgendwas auf dem Teller zufrieden gab, Hauptsache raus hier.</p>
<p>Von den Vorträgen her bin ich nach wie vor zu großen Teilen begeistert aber leider auch etwas zwiegespallten. So war die Themenauswahl wirklich gut und gliederte sich in acht Kategorien zu je vier Tracks pro Tag, mit denen vom Requirements-Engieneering über die Architektur, automatisierten Tests und Deployment alles abgedeckt wurde, einschließlich Tipps und Tricks fürs Alltagsgeschäft.</p>
<p>Auf der anderen Seite muss ich jedoch auch Kritik üben. So hielt leider nicht jeder Vortrag das was die Ankündigung versprach. Dies lag zum einen an der fehlenden Schwierigkeitsstufe, die schon frühzeitig vor allzu seichten Themen gewarnt hätte, und zum anderen ein paar zu große Versprechungen seitens der Vortragenden.</p>
<p>Positiv hervor zu heben seien jedoch vor allem die Vorträge von Chris Rupp („Spezifizierst du noch oder implementierst du schon?“) die auf beeindruckende Weise die Komplexität der Kommunikation analysierte, Golo Rodens „JavaScript Best Practices“ der mit einfachsten Mitteln die schlimmsten Stolpersteine von JavaScript beschrieb und mir als zuvor Unwissenden dabei genug Futter gab um im Grunde die, leider erst darauf folgende, Einführung in JavaScript im Internet surfend zu verbringen. Weiterhin war die Keynote von Jeff Potter sehr unterhaltsam, auch wenn manche Pointe durch das Raster fiel, weil der Tag doch etwas sehr anstrengend war und somit wenig Platz zum Übersetzen im vollgestopfte Kurzzeitspeicher blieb.</p>
<p>Leider nicht mitnehmen konnte ich „Guck mal – Codereviews in der Praxis“ von Laurin Still und „Gestern Entwickler, heute ScrumMaster“ von Dr. Jürgen Hoffman und Heiko Stapf die mir nachträglich als sehr gut bescheinigt wurden, aber etwas ungünstig zu meiner eigenen Session lagen.</p>
<p><strong>Die Sicht des Sprechers</strong></p>
<p>Damit sind wir auch schon beim eigentlichen Auslöser für meine Teilnahme. In meinem Vortrag „MS Test – Der missverstandene Stiefbruder!?!“ widmete ich mich einer Gegenüberstellung von NUnit und MS Test sowie den unterschiedlichen Teststufen in der Qualitätssicherung und deren Automatisierungsgrad. Ob ich den Nerv meiner Zuhörer dabei traf kann ich leider nicht ganz einschätzen und würde mich hier über Feedback freuen.</p>
<p>Sehr ermutigend war jedoch die große Anzahl der Beteiligten die ich grob auf etwas zwischen 60 und 80 von insgesamt ca. 500 Personen schätzen würde. Dies ist für mich insofern erfreulich, da mein Thema nach eigener Einschätzung ein vergleichsweise umfangreiches Wissen voraussetzte und nicht wenig komplex war, ich anderer seits im Hauptteil aber nie das Gefühl bekam die Zuhörerschaft zu überfordern oder in den Weiten der Langeweile verloren zu haben. Dies zeigte sich zum Beispiel durch beständig in die Höhe gehende Hände auf Fragen meinerseits und interessiertes Nicken oder amüsiertes Kopfschütteln ihrerseits.</p>
<p>Hauptteil, ist hier ein wichtiger Punkt, denn leider habe ich mich im Vorfeld zeitlich ein wenig verschätzt. So habe ich in der Vorbereitung alles in allem für den Vergleich der Frameworks samt Zusammenfassung fast immer etwas über 50 Minuten benötigt. Plus einen Puffer für Fragen und Anekdoten also ein solider Zeitrahmen, der mich dazu bewog den Vergleich der Isolation Frameworks als Backup zu verwenden. Leider war ich jedoch schon nach 40 Minuten fertig und bekam bis auf eine Frage, bei der ich nicht helfen konnte, kein weiteres Futter. Die nun doch gezeigten Backupfolien wirkten daraufhin für mich irgendwie wie angeflanscht, was dem Verständnis sicher nicht dienlich war.</p>
<p>Was lernen wir daraus? Never change a running system! Vor allem nicht einen Tag vor der Konferenz! Dabei war genau diese Devise eigentlich der Grund warum ich bis auf zwei Folien nicht das Layout der Konferenz übernahm. Mit den, für meinen Geschmack, etwas zu großzügigen Rändern samt Begleitinfos hätte ich mir meiner Meinung nach andernfalls den Vortrag gekillt bzw. einen unverhältnismäßig hohen Umbauaufwand gehabt.</p>
<p>Obwohl ich also nicht ohne Fehler bin muss ich auch aus Sicht eines Sprechers Kritik an meinen Kollegen äußern. Ich habe viele erfrischende Ideen und kreative Vorträge gesehen. Es wird auch niemand gezwungen voll gestopfte Powerpoint Monstren mit Myriaden Folien zu produzieren, aber bitte Jungs die Leute zahlen teils nicht gerade wenig Geld für die Veranstaltung also solltet ihr den Inhalt einer Session auch nicht dem Funfactor unterordnen.</p>
<p><strong>Zusammenfassung</strong></p>
<p>Alles in allem bin ich aber sehr zufrieden. Das Hotel war klasse und super gelegen, die Menschen waren nett und gesprächig, der Wissensgewinn war beträchtlich und dank meines Sprecherdaseins war das alles auch fast gänzlich kostenlos. Danke an der Stelle noch mal an meinen Arbeitgeber Saxonia Systems die alle Kosten übernahmen die der Veranstalter nicht trug.</p>
<div class="printfriendly alignright"><a href="http://www.just-about.net/dotnet-developers-conference-2012-eine-subjektive-zusammenfassung?pfstyle=wp" rel="nofollow" ><span class="printfriendly-text"></span></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.just-about.net/dotnet-developers-conference-2012-eine-subjektive-zusammenfassung/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How-To: Private und internal testen mit MS Test</title>
		<link>http://www.just-about.net/private-und-internal-mit-ms-test</link>
		<comments>http://www.just-about.net/private-und-internal-mit-ms-test#comments</comments>
		<pubDate>Tue, 17 Apr 2012 19:47:27 +0000</pubDate>
		<dc:creator>Hendrik Lösch</dc:creator>
				<category><![CDATA[DotNetGerman Bloggers]]></category>
		<category><![CDATA[MS Test]]></category>
		<category><![CDATA[Test]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://www.just-about.net/?p=2110</guid>
		<description><![CDATA[Einer der viel gesprochenen Leitsätze des Testens ist: &#8220;Finger weg von privaten Membern&#8221;. Der Gedanke hinter dieser Aussage ist einleuchtend, denn je mehr Aussagen ich in einem Test über die Implementierung mache, desto höher die Wahscheinlichkeit, dass ich ihn später anpassen muss oder er fehl schlägt. Nichts desto trotz, kann man sich durch den Zugriff [...]]]></description>
			<content:encoded><![CDATA[<p>Einer der viel gesprochenen Leitsätze des Testens ist: &#8220;Finger weg von privaten Membern&#8221;. Der Gedanke hinter dieser Aussage ist einleuchtend, denn je mehr Aussagen ich in einem Test über die Implementierung mache, desto höher die Wahscheinlichkeit, dass ich ihn später anpassen muss oder er fehl schlägt.</p>
<p>Nichts desto trotz, kann man sich durch den Zugriff auf private Member gelegentlich viel Arbeit sparen wenn es darum geht einen Test aufzusetzen und außerdem hilft es manchmal sogar beim Aufspüren von Bugs. Weiterhin ist es teils unumgänglich auch Dinge zu testen die als <em>internal</em> gekennzeichnet sind und demnach theoretisch nicht vom Testprojekt identifiziert werden könnten.<span id="more-2110"></span></p>
<h3>Internal</h3>
<p>Für letzteres Problem gibt es gleich auch die schnellste Lösung, welche selbst über das Testen hinaus nützlich sein kann. So verfügt jedes Projekt einer Solution über eine Datei <em>AssemblyInfo.cs</em>. Darin enthalten sind Informationen wie die Versionsnummer, die eindeutige Guid der Assembly usw., zusammengefasst in einer Attributschreibweise.</p>
<p>In diese Datei kann das Attribut <a href="http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute.aspx" target="_blank">InternalsVissibleTo </a>eingefügt werden welches den kompletten Namen der &#8220;befreundeten&#8221; Dll übergeben wird. Nach dem nächsten Kompilieren sind dann <strong>alle</strong> als <em>internal</em> gekennzeichneten Klassen, Methode etc. auch innerhalb des anderen Projekts abrufbar.</p>
<pre class="brush: csharp; title: ; notranslate">[assembly: InternalsVisibleTo(&quot;[Friendly.Name.Dll]&quot;);</pre>
<p>Leider kann das Attribute immer nur für die gesamte Assembly deklariert werden. Eine selektive Freigabe für einzelne Klassen ist somit nicht möglich.</p>
<h3></h3>
<h3>Private Member</h3>
<p>Auf private Objekte zuzugreifen ist zumindest im Rahmen von Tests nicht viel schwieriger. So kann man natürlich selbst Reflection bemühen um Methoden aufzurufen o.ä. man kann dies aber auch einfach die Klasse <a href="http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.privateobject%28v=vs.100%29.aspx" target="_blank"><em>PrivateObject</em> </a>erledigen lassen. Diese bekommt bei der Instanzierung den Typ oder gleich eine Referenz der zu kapselnden Klasse übergeben und bietet dann den vollen Zugriff auf alle Eigenschaften.</p>
<p>So verfügt sie über diverse <em>Set</em>- bzw. <em>Get</em>-Methoden mit denen Werte auf Eigenschaften und Felder gesetzten oder von ihnen gelesen werden. Darüber hinaus erlauben die zahlreichen Überladungen von <em>Invoke</em> das Ausführen einzelner Methoden oder Auslesen deren Rückgabewerte.</p>
<p>So wird im folgenden Beispiel ein Wrapper um den Testgegenstand (sut) gelegt, mit dem erst ein Pfad zu einer bestimmten Datei hinterlegt wird. Dann rufen wir eine interne Methode zum Laden der Dataen auf um sie danach auf Richtigkeit zu prüfen.</p>
<pre class="brush: csharp; title: ; notranslate">
var accessor = new PrivateObject(sut);
accessor.SetField(&quot;_path&quot;, BindingFlags.SetField, &quot;testdata.xml&quot;);
accessor.Invoke(&quot;Load_Internal&quot;);
IEnumerable&lt;Data&gt; loadedData = accessor.GetProperty(&quot;InternalData&quot;);

Assert.IsNotNull(loadedData);
</pre>
<p>Eine <a href="http://www.just-about.net/missingmethodexception" target="_blank">Einschränkung </a>in Sachen Privatsphäre ergibt sich für <em>PrivateObject</em> in Sachen Vererbung. So ist es nicht möglich auf private Member einer Elternklasse zuzugreifen, weshalb das folgende Beispiel fehlschlägt. Der Wrapper der sich durch die Klasse ergibt, hat immer nur die gleichen Zugriffsrechte wie die Klasse die er kapselt. Würde im Beispiel der String also protected gekennzeichnet werden, ergäbe sich auch das erwünschte Ergebnis.</p>
<pre class="brush: csharp; highlight: [3]; title: ; notranslate">
public class A
{
   private string a = &quot;Hallo&quot;;
}

public class B : A
{ }

[TestClass]
public class Test
{
   [TestMethod]
   public void TestCase()
   {
      var sut = new B();
      var privateObject = new PrivateObject(sut);

      var result = privateObject.GetField(&quot;a&quot;).ToString();
      Assert.AreEqual(&quot;Hallo&quot;, result);
   }
}
</pre>
<h3>Private statische Member</h3>
<p>Einer der Hauptgründe &#8220;klassische&#8221; Singletons nicht zu verwenden, ist das <a href="http://www.just-about.net/der-freundliche-singleton" target="_blank">Hindernis </a>welches sie in Sachen Test darstellen. So führen sie zu Abhängigkeiten die nur schwer erkennbar und noch schwerer aufzubrechen sind.</p>
<p>Eine Klasse die hierbei hilft ist <a href="http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.privatetype%28v=vs.100%29.aspx" target="_blank">PrivateType</a>. Dabei handelt es sich quasi um einen Bruder von <em>PrivateObject</em>, der den Zugriff auf alle privaten statischen Elemente einer Klasse zulässt und dabei dem gleichen Vorgehensmuster folgt wie wie <em>PrivateObject</em>. Zu sehen auch im folgenden Beispiel sieht:</p>
<pre class="brush: csharp; title: ; notranslate">
var accessor = new PrivateObject(StaticSut);

accessor.SetStaticField(&quot;_path&quot;, BindingFlags.SetField, &quot;testdata.xml&quot;);
accessor.InvokeStatic(&quot;Load_Internal&quot;);
IEnumerable&lt;Data&gt; loadedData = accessor.GetStaticProperty(&quot;InternalData&quot;);

Assert.IsNotNull(loadedData);
</pre>
<h3>Accessor-Klassen des Visual Studio</h3>
<p>Ein Nachteil von <em>PrivateObject</em> und <em>PrivateType</em> wird recht schnell bei der ersten Nutzung ersichtlich. Zwar kann man über die <a href="http://msdn.microsoft.com/de-de/library/system.reflection.bindingflags%28v=vs.100%29.aspx" target="_blank">BindingFlags </a>der Methoden einige Probleme ausschließen, dennoch neigt man bei den Angabe in Form von Strings sehr schnell zu Fehlern und das vor allem dann, wenn der Code refaktorisiert wird. Denn Magic-Strings sind bekanntlich nicht typsicher wodurch sie nur schlecht von diversen Tools analysiert werden können.</p>
<p>Aus diesem Grund bietet Visual Studio die Möglichkeit so genannte <em>Accessor</em>-Klassen zu generieren. Sie stellen automatisch alle privaten Member öffentlich zur Verfügung, aktualisieren sich selbst bei Änderungen am Code der eigentlichen Klasse und sind somit gänzlich typsicher, <span style="text-decoration: underline;"><strong>ABER</strong></span> <a href="http://blogs.msdn.com/b/vstsqualitytools/archive/2010/01/18/publicize-and-code-generation-for-visual-studio-2010.aspx" target="_blank">laut Microsoft</a> auch seit spätestens Visual Studio 2011 als <a href="http://connect.microsoft.com/VisualStudio/feedback/details/689018/accessor-files-are-ignored-in-visual-studio-11-dev-preview" target="_blank">deprecated </a>zu betrachten.</p>
<p>Der Grund hierfür ist wohl, dass der dahinter liegende Generator mit dem steten Wandel in .Net nicht Schritt halten konnte/kann und seine Weiterentwicklung zumindest eingefrohren wurde. Das Feature existiert demnach hauptsächlich noch aus Kompatibilitätsgründen und könnte bei Portierungen auf höhere Framework- und VS-Versionen unter Umständen unangenehme Nebeneffekte aufweisen, weshalb sie besser nicht mehr verwendet werden sollten.</p>
<p>Sollen sie dennoch verwendet werden gibt es zwei Möglichkeiten einen Accessor zu erzeugen. So reicht es entweder die entsprechende Klasse im Editor zu öffnen und dort im Kontext-Menü &#8220;Create Private Accessor&#8221; auszuwählen oder sich einen Unit Test über den entsprechenden Wizard zu erzeugen. Letzteres generiert jedoch eine ganze Menge Code den man meist nicht braucht, weshalb ich dies eher ungern nutze.</p>
<p><a href="http://www.just-about.net/wp-content/uploads/2012/04/Unit-Test-Wizard.png" rel="lightbox[2110]"><img class="aligncenter size-medium wp-image-2258" title="Unit Test Wizard" src="http://www.just-about.net/wp-content/uploads/2012/04/Unit-Test-Wizard-300x238.png" alt="" width="300" height="238" /></a></p>
<div class="printfriendly alignright"><a href="http://www.just-about.net/private-und-internal-mit-ms-test?pfstyle=wp" rel="nofollow" ><span class="printfriendly-text"></span></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.just-about.net/private-und-internal-mit-ms-test/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>How-To: Datengetriebene Tests mit MS Test</title>
		<link>http://www.just-about.net/datengetriebene-tests-mit-ms-test</link>
		<comments>http://www.just-about.net/datengetriebene-tests-mit-ms-test#comments</comments>
		<pubDate>Tue, 10 Apr 2012 20:54:47 +0000</pubDate>
		<dc:creator>Hendrik Lösch</dc:creator>
				<category><![CDATA[DotNetGerman Bloggers]]></category>
		<category><![CDATA[MS Test]]></category>
		<category><![CDATA[Test]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://www.just-about.net/?p=2191</guid>
		<description><![CDATA[In einem früheren Post hatte ich einmal beschrieben wie Data-Driven-Tests mit NUnit umgesetzt werden können. Damals habe ich bereits darauf hingewiesen, dass so etwas theoretisch auch mit MS Test und dem Visual Studio möglich ist, was ich nun erläutern möchte. Das Beispielszenario Das Szenario ist im Grunde wie im vorangegangenen Artikel. Es geht darum die [...]]]></description>
			<content:encoded><![CDATA[<p>In einem früheren Post hatte ich einmal beschrieben wie <a href="http://www.just-about.net/lottery-kata-mit-nunit" target="_blank">Data-Driven-Tests mit NUnit</a> umgesetzt werden können. Damals habe ich bereits darauf hingewiesen, dass so etwas theoretisch auch mit MS Test und dem Visual Studio möglich ist, was ich nun erläutern möchte.</p>
<p><span id="more-2191"></span></p>
<h3>Das Beispielszenario</h3>
<p>Das <a href="http://www.just-about.net/lottery-kata-aufgabenstellung" target="_blank">Szenario </a>ist im Grunde wie im vorangegangenen Artikel. Es geht darum die Logik für die Berechnung von Lottoergebnissen zu programmieren. Die dafür verwendeten Klassen unterscheiden sich jedoch, was hauptsächlich darin begründet ist, dass mein Programm mittlerweile ein wenig gewachsen ist und ich zu faul war extra ein Projekt nur für dieses Post hier aufzusetzen.</p>
<p>Grundsätzlich haben wir deshalb eine Klasse <em>LottoTicket</em> die die Ticketdaten des Spielers enthält<em></em>. Dazu gehören alle Tipps die er auf dem Ticket gemacht hat, sowie eine eindeutige Referenznummer aus der sich die Superzahl ergibt. Weiterhin haben wir eine Klasse <em>LottoDrawing</em> mit den Daten der Ziehung.</p>
<p>Last but not least haben wir den <em>PrizeCategoryCalculator</em> den wir auch testen wollen. Er errechnet die Gewinnklassen aller Tipps eines Tickets, damit, wenn die Quoten feststehen, der Gesamtgewinn des Spielscheins errechnet werden kann.</p>
<p>Die Besonderheit ist nun, dass alle möglichen Berechnungen von Gewinnklassen überprüft werden sollen ohne einen allzu großen Aufwand im Test zu induzieren.</p>
<h3>Der erste Wurf</h3>
<p>Ein einzelner Test kann in etwa wie der folgende aussehen. Dabei fällt auf, dass die ersten 18 Zeilen  nur dem Aufsetzen der Testdaten (Arrange) dienen und, abgesehen von den tatsächlich verwendeten Werten, in allen folgenden Tests nahezu gleich bleiben. Hier wäre es also sehr hilfreich, wenn die Testmethode nur ein einziges Mal geschrieben und dann vom entsprechenden Framework mit Testdaten versorgt würde.</p>
<pre class="brush: csharp; highlight: [19]; title: ; notranslate">
var sut = new PrizeCategoryCalculator();
var numbers = new List&lt;int&gt; { 1, 2, 3, 4, 5, 6 };
var givenTipp = new LottoTipp { RegularNumbers = numbers };

var givenDrawing = new LottoDrawing
{
   AdditionalNumber = 11,
   Date = DateTime.Now,
   RegularNumbers = numbers,
   SuperNumber = 9
};

var givenTicket = new LottoTicket
{
   RegistrationNumber = &quot;02132309&quot; + givenDrawing.SuperNumber,
   Tipps = new List&lt;LottoTipp&gt; { givenTipp }
};

var results = sut.Check(givenTicket, givenDrawing);
var result = results.FirstOrDefault();

Assert.IsNotNull(result);
Assert.AreEqual(PrizeCategory.I, result);
</pre>
<h3>Testdaten bereitstellen</h3>
<p>Um Testdaten mit MS Test bereit zu stellen, bedarf es zunächst einer Datenquelle. Diese kann entweder in Form einer Datenbank oder einer CSV bzw. XML Datei vorliegen. Bei CVS-Dateien ist es wichtig, dass alle Werte durch Kommas separiert sind was mit Excel nicht immer der Fall ist.</p>
<p><a href="http://www.just-about.net/wp-content/uploads/2012/04/Testdaten-in-CSV.png" rel="lightbox[2191]"><img class="aligncenter size-medium wp-image-2200" title="Testdaten in im CSV Format" src="http://www.just-about.net/wp-content/uploads/2012/04/Testdaten-in-CSV-300x177.png" alt="" width="300" height="177" /></a></p>
<p>Um diese Datei einzubinden muss nun die Test View im Visual Studio über das Menü Tests -&gt; Windows -&gt; Test View geöffnet werden. Darin sind alle Tests zu sehen die aktuell verfügbar sind, desweiteren kann über F4 das Property Window des entsprechenden Tests geöffnet werden in dem zusätzliche Einstellungen verfügbar sind.</p>
<p><a href="http://www.just-about.net/wp-content/uploads/2012/04/Test-View.png" rel="lightbox[2191]"><img class="aligncenter size-medium wp-image-2201" title="Die Test View" src="http://www.just-about.net/wp-content/uploads/2012/04/Test-View-300x75.png" alt="" width="300" height="75" /></a></p>
<p>In genau diesem Eigenschaftsfenster ist danach der Wert <em>Data Connection String</em> auszuwählen, der leer sein müsste. Erst wenn er ausgewählt wurde erscheint auf der rechten Seite ein Button mit drei Punkten über diesen startet man einen Wizard zum Auswählen der tatsächlichen Daten.</p>
<p><a href="http://www.just-about.net/wp-content/uploads/2012/04/Eigenschaften-eines-Tests.png" rel="lightbox[2191]"><img class="aligncenter size-medium wp-image-2202" title="Eigenschaften eines Tests" src="http://www.just-about.net/wp-content/uploads/2012/04/Eigenschaften-eines-Tests-297x300.png" alt="" width="297" height="300" /></a></p>
<p>Stimmt die Formatierung der Daten, sollte der letzte Dialog im Wizard in etwa wie folgt aussehen. Befinden sich alle Daten in nur einer Spalte, wurden bei CSV Dateien keine Kommas zum Trennen der Werte und bei XML eine ungünstige oder nicht wohl geformte Sturktur genutzt. Ein Klick auf <em>Finish</em> fügt anschließend die entsprechenden Attribute an den jeweiligen Test.</p>
<p><a href="http://www.just-about.net/wp-content/uploads/2012/04/Auswählen-einer-Testdatenquelle.png" rel="lightbox[2191]"><img class="aligncenter size-medium wp-image-2203" title="Auswählen einer Testdatenquelle" src="http://www.just-about.net/wp-content/uploads/2012/04/Auswählen-einer-Testdatenquelle-300x259.png" alt="" width="300" height="259" /></a></p>
<p>Bei diesen Attributen handelt es sich zum einen um <a href="http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.datasourceattribute.aspx" target="_blank"><em>DataSource</em> </a>mit welchem die Datenquelle beschrieben und dem, neben Informationen über den Typ der Quelle, auch deren Pfad und eine etwas sinnlos wirkende Angabe eines Tabellennamens übergeben wird. Darüber hinaus bedaruf es der Spezifizierung einer Datenzugriffsmethode, welche theoretisch entweder sequenziell oder zufällig geschehen kann. Praktisch funktioniert bei Dateien als Quelle, meines Wissens aber nur sequenziell&#8230;</p>
<pre class="brush: csharp; title: ; notranslate">
[DataSource(&quot;Microsoft.VisualStudio.TestTools.DataSource.CSV&quot;,
            &quot;|DataDirectory|\\WinCheck.csv&quot;,
            &quot;WinCheck#csv&quot;,
            DataAccessMethod.Sequential)]
[DeploymentItem(&quot;MS_Test\\UnitTests\\WinCheck.csv&quot;)]
</pre>
<p>Das zweite Attribut, das automatisch angelegt wurde, ist das <a href="http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.deploymentitemattribute.aspx" target="_blank"><em>DeploymentItem</em></a>. Über dieses werde ich sicher noch ein weiteres Post schreiben, denn es wir immer dann genutzt wenn automatisch Dateien oder andere Arten von Ressourcen deployt werden sollen. Darüber hinaus hat es einige Macken die man kennen sollte. Im aktuellen Fall reicht es aber zu wissen, dass die als Parameter angegebene Datei automatisch von Framework in das Ausgabeverzeichnis des Tests kopiert wird.</p>
<h3>Testdaten verwenden</h3>
<p>Nun werden die Daten vom Framework geliefert, doch wie greift man darauf zu? Hierzu braucht unsere Testklasse die Property <em>TestContext</em> vom gleichnamigen Typ. Diese enthält wiederum eine Reihe von Informationen die während eines Testdurchlaufs von Interesse sein könnte wie zum Beispiel das Verzeichnis in dem die Programmdaten liegen und eben auch die Daten aus unserer Quelle.</p>
<p>Auf jene wird dann in der eigentlichen Testmethode durch die <em>Row</em> Property des Contexts zugegriffen. Eine solche Row ist mit einer Zeile in den Testdaten gleich zu setzen, wobei die einzelnen Spaltenwerte über ihren Titel identifiziert werden.</p>
<pre class="brush: csharp; title: ; notranslate">
var drawing = new LottoDrawing();
drawing.AdditionalNumber = Convert.ToInt32(this.TestContext.DataRow[&quot;Additional Number&quot;]);
drawing.SuperNumber = Convert.ToInt32(this.TestContext.DataRow[&quot;Super Number&quot;]);
</pre>
<p>Das zeilenweise Auslesen der Daten übernimmt MS Test für uns, welches die Test-Methode für jede Zeile erneut aufruft. Schlägt der Test für eine Zeile fehlt, werden alle anderen dennoch ausgeführt und gehen auch jeweils einzeln mit ihren Ergebnissen in die Auswertung ein. Zumindest wenn man den Testrunner von Visual Studio nutzt. Ist man, wie ich, überzeugter Nutzer des Resharpers erhält man von diesem nur das Gesamtergebnis aller Testfälle und darüber hinaus <strong>keine</strong> aufgeschlüsselte Fehlerbeschreibung falls etwas schief geht.</p>
<p><a href="http://www.just-about.net/wp-content/uploads/2012/04/Ergebnisse-eines-daten-getriebenen-Tests.png" rel="lightbox[2191]"><img class="aligncenter size-medium wp-image-2207" title="Ergebnisse eines datengetriebenen Tests" src="http://www.just-about.net/wp-content/uploads/2012/04/Ergebnisse-eines-daten-getriebenen-Tests-300x244.png" alt="" width="300" height="244" /></a></p>
<p>Die gesamte Testklasse sieht anschließend wie folgt aus, wobei jedes Ticket nur einen einzelnen Tipp enthält um die Komplexität an Testdaten möglichst gering zu halten.</p>
<pre class="brush: csharp; title: ; notranslate">
public TestContext TestContext { get; set; }

[DataSource(&quot;Microsoft.VisualStudio.TestTools.DataSource.CSV&quot;,
            &quot;|DataDirectory|\\WinCheck.csv&quot;,
            &quot;WinCheck#csv&quot;,
            DataAccessMethod.Sequential)]
[DeploymentItem(&quot;MS_Test\\UnitTests\\WinCheck.csv&quot;)]
[TestMethod]
public void PrizeCategoryCalculator_shall_give_correct_prize_category_for_each_tipp()
{
   var ticketNumbers = new List&lt;int&gt;();
   var drawingNumbers = new List&lt;int&gt;();
   for (var i = 1; i &lt; 7; i++)
   {
      var number = Convert.ToInt32(this.TestContext.DataRow[&quot;Ticket Number &quot; + i]);
      ticketNumbers.Add(number);

      number = Convert.ToInt32(this.TestContext.DataRow[&quot;Drawing Number &quot; + i]);
      drawingNumbers.Add(number);
   }

   var tipp = new LottoTipp { RegularNumbers = ticketNumbers };
   var ticket = new LottoTicket
   {
      Tipps = new List&lt;LottoTipp&gt; { tipp },
      RegistrationNumber = this.TestContext.DataRow[&quot;Registration Number&quot;].ToString()
   };

   var drawing = new LottoDrawing();
   drawing.AdditionalNumber = Convert.ToInt32(this.TestContext.DataRow[&quot;Additional Number&quot;]);
   drawing.SuperNumber = Convert.ToInt32(this.TestContext.DataRow[&quot;Super Number&quot;]);
   drawing.RegularNumbers = drawingNumbers;

   var expectedResult = (PrizeCategory)Enum.Parse(
           typeof(PrizeCategory), this.TestContext.DataRow[&quot;Expected Result&quot;].ToString());

   this.ActualTestImplementation(ticket, drawing, expectedResult);
}

public void ActualTestImplementation(LottoTicket givenTicket, LottoDrawing givenDrawing,
                                         PrizeCategory expectedResult)
{
   var sut = new PrizeCategoryCalculator();

   var results = sut.Check(givenTicket, givenDrawing);
   var result = results.FirstOrDefault();

   Assert.IsNotNull(result);
   Assert.AreEqual(expectedResult, result);
}
</pre>
<p><strong>Fazit</strong></p>
<p>Aus Entwicklersicht ist die Auslagerung der Daten in eine Datei sehr unangenehm. Während dies in reinen Testabteilungen sicher der Konsulidierung von Testdaten dient, ist es für Unit Tests reichlich kompliziert, unübersichtlich und entzieht sie jeder Art von automatischem Refaktoring. Darüber hinaus ist es außerdem fehleranfällig da die Daten nicht typischer vorliegen sondern erst konvertiert werden müssen und der Zugriff auf die Spalten in Form von Magic Strings geschieht.</p>
<div class="printfriendly alignright"><a href="http://www.just-about.net/datengetriebene-tests-mit-ms-test?pfstyle=wp" rel="nofollow" ><span class="printfriendly-text"></span></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.just-about.net/datengetriebene-tests-mit-ms-test/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vortrag zu automatisierten Tests auf der .Net Dev Con 2012</title>
		<link>http://www.just-about.net/vortrag-dotnet-dev-con-2012</link>
		<comments>http://www.just-about.net/vortrag-dotnet-dev-con-2012#comments</comments>
		<pubDate>Wed, 25 Jan 2012 20:40:24 +0000</pubDate>
		<dc:creator>Hendrik Lösch</dc:creator>
				<category><![CDATA[DotNetGerman Bloggers]]></category>
		<category><![CDATA[Test]]></category>
		<category><![CDATA[Vorträge]]></category>
		<category><![CDATA[Veranstalltungen]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://www.just-about.net/?p=2118</guid>
		<description><![CDATA[In meinem Neujahrspost habe ich schon angedeutet, dass ich dieses Jahr wohl viel unterwegs sein werde und so steht jetzt fest, dass ich im Mai auf der .Net Dev Con zu MS Test sprechen werde. Dort werde ich unter dem Titel: &#8220;MS Test -  der missverstandene Stiefbruder&#8221; im Grunde das auseinander nehmen, was ich die [...]]]></description>
			<content:encoded><![CDATA[<p>In meinem Neujahrspost habe ich schon angedeutet, dass ich dieses Jahr wohl viel unterwegs sein werde und so steht jetzt fest, dass ich im Mai auf der .Net Dev Con zu MS Test sprechen werde.</p>
<p style="text-align: center;"><a href="http://www.dotnet-developer-conference.de/" target="_blank"><img class="aligncenter" src="http://www.dotnet-developer-conference.de/content/download/6793/45541/file/DDC%202012_Banner570x72.gif" alt="" width="570" height="72" /></a></p>
<p>Dort werde ich unter dem Titel: &#8220;<a href="http://www.dotnet-developer-conference.de/Programm/MS-Test-der-missverstandene-Stiefbruder" target="_blank">MS Test -  der missverstandene Stiefbruder</a>&#8221; im Grunde das auseinander nehmen, was ich die letzten zwei Jahre im Umgang mit der Visual Studio Test Integration und weitestgehend freien Alternativen erlebt habe. Genauer geht es mir dabei um die Lücke zwischen Unit Tests mit NUnit, Moq und Resharper, gegenüber den System- und Integrationstests mit Visual Studio, samt Pex und Moles.</p>
<p>Ich habe dabei nicht vor auf irgend welchen Designschwächen von was auch immer welchen Tools herum zu hacken. Viel mehr geht es mir darum die unterschiedlichen Sichtweisen gegenüber zu stellen die hinter den einzelnen Frameworks stehen, deren wichtigste Features zu erläutern und die Gründe zu nennen warum sie verwendet werden. Ob sie ihre Arbeit gut machen muss dann jeder selbst entscheiden.</p>
<p>Ich hoffe also auf eine rege Teilnahme und freue mich auf jeden den ich am 15. Mai willkommen heißen darf.</p>
<div class="printfriendly alignright"><a href="http://www.just-about.net/vortrag-dotnet-dev-con-2012?pfstyle=wp" rel="nofollow" ><span class="printfriendly-text"></span></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.just-about.net/vortrag-dotnet-dev-con-2012/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How-To: UserControls in ItemsControl mit Überschriften trennen</title>
		<link>http://www.just-about.net/itemscontrol-mit-ueberschriften</link>
		<comments>http://www.just-about.net/itemscontrol-mit-ueberschriften#comments</comments>
		<pubDate>Thu, 19 Jan 2012 20:02:27 +0000</pubDate>
		<dc:creator>Hendrik Lösch</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[DotNetGerman Bloggers]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Prism]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://www.just-about.net/?p=1970</guid>
		<description><![CDATA[Eine der wichtigsten Gründe Prism einzusetzen ist die Möglichkeit die GUI in Regionen aufzuteilen. Jede dieser Regionen wird als Content-, Items- o.ä. Control repräsentiert und kann dann zur Laufzeit mit 1 (ContentControl) bis n (Items- oder TabControl) UserControls bestückt werden. Auf diese Weise wird die eigentliche Benutzeroberfläche lose gekoppelt und kann ohne größeren Aufwand an [...]]]></description>
			<content:encoded><![CDATA[<p>Eine der wichtigsten Gründe Prism einzusetzen ist die Möglichkeit die GUI in Regionen aufzuteilen. Jede dieser Regionen wird als Content-, Items- o.ä. Control repräsentiert und kann dann zur Laufzeit mit 1 (<em>ContentControl</em>) bis n (<em>Items</em>- oder <em>TabControl</em>) <em>UserControls</em> bestückt werden. Auf diese Weise wird die eigentliche Benutzeroberfläche lose gekoppelt und kann ohne größeren Aufwand an neue Anforderungen angepasst werden.</p>
<p>Ein immer wiederkehrendes Problem stellt für mich dabei die Nutzung des <em>ItemsControl</em> dar. Jenes zeigt die einzelnen Views in Form einer Liste an, was unter Umständen etwas langweilig und verwirrend wirken kann. Aus diesem Grund bietet es sich an, jene Views durch Überschriften oder Abgrenzungen voneinander zu trennen, aber wie kriegt man das hin? Kann man es evtl. auch ohne Prism verwenden? Und vor allem wie schafft man es mit möglichst wenig Aufwand?<img title="Weiterlesen..." src="http://www.just-about.net/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif" alt="" /><span id="more-1970"></span></p>
<h3>Erst einmal völlig statisch&#8230;</h3>
<p><a href="http://www.just-about.net/wp-content/uploads/2012/01/ItemsControl-ohne-Header.png" rel="lightbox[1970]"><img class="alignright size-full wp-image-2054" title="ItemsControl ohne Header" src="http://www.just-about.net/wp-content/uploads/2012/01/ItemsControl-ohne-Header.png" alt="" width="255" height="128" /></a>Bevor wir uns Prism zu wenden, noch einmal kurz beschrieben was wir eigentlich tun wollen. Das grundlegende Ziel ist zunächst das Anzeigen mehrerer <em>Controls</em> in einer Liste. Dies kann wie folgt geschehen, wobei der Einfachheit halber Rechtecke statt <em>UserControls</em> verwendet wurden.</p>
<p>Der Vorteil eines <em>ItemsControls</em> gegenüber z.B. einer <em>ListBox</em> ist hierbei vor allem, dass keine Selektierung statt findet  sobald eines der enthalten <em>UserControls</em> den Fokus erhält, denn für den Anwender darf nicht ersichtlich sein, dass es sich tatsächlich um verschiedene Bestandteile handelt.</p>
<pre class="brush: xml; title: ItemsControl ohne Headern; notranslate">
&lt;ItemsControl&gt;
   &lt;Rectanlge Height=&quot;20&quot; Fill=&quot;Red&quot; /&gt;
   &lt;Rectanlge Height=&quot;20&quot; Fill=&quot;Blue&quot; /&gt;
   &lt;Rectanlge Height=&quot;20&quot; Fill=&quot;Green&quot; /&gt;
&lt;/ItemsControl&gt;
</pre>
<p><a href="http://www.just-about.net/wp-content/uploads/2012/01/ItemsControl-mit-HeaderedContentControl.png" rel="lightbox[1970]"><img class="alignright" title="ItemsControl mit HeaderedContentControl" src="http://www.just-about.net/wp-content/uploads/2012/01/ItemsControl-mit-HeaderedContentControl.png" alt="" width="126" height="148" /></a>Wie man im obigen Bild schon sieht, ist das etwas verwirrend da alle Controls dicht an dicht aufgereiht sind und somit die logische Gruppierung fehlt. Dies wird um so schlimmer je mehr Inhalt sie haben. Also wäre es doch besser sie untereinander abzugrenzen.</p>
<p>Dazu kann man entweder vor jedem Control einen entsprechend gestylten TextBlock einfügen oder wie folgt das <em>HeaderedContentControl</em> nutzen. Letzteres hat  den Vorteil, dass man die Einträge im Xaml besser unterscheiden und vor allem leichter stylen kann.</p>
<pre class="brush: xml; title: ItemsControl mit Headern; notranslate">
&lt;ItemsControl&gt;
   &lt;HeaderedContentControl Header=&quot;Red&quot; Style=&quot;{StaticResource ItemHeaderStyle}&quot;&gt;
     &lt;Rectanlge Height=&quot;20&quot; Fill=&quot;Red&quot; /&gt;
   &lt;/HeaderedContentControl&gt;

   &lt;HeaderedContentControl Header=&quot;Blue&quot; Style=&quot;{StaticResource ItemHeaderStyle}&quot;&gt;
     &lt;Rectanlge Height=&quot;20&quot; Fill=&quot;Blue&quot; /&gt;
   &lt;/HeaderedContentControl&gt;

   &lt;HeaderedContentControl Header=&quot;Green&quot; Style=&quot;{StaticResource ItemHeaderStyle}&quot;&gt;
      &lt;Rectanlge Height=&quot;20&quot; Fill=&quot;Green&quot; /&gt;
   &lt;/HeaderedContentControl&gt;
&lt;/ItemsControl&gt;
</pre>
<h3></h3>
<h3>&#8230;dann etwas dynamisch&#8230;</h3>
<p>Im dynamischen Fall werden die anzuzeigenden Controls nicht mehr fest angegeben, sondern aus einer Datenquelle bezogen. Hier ist die Abgrenzung über einen allgemeinen Style noch wichtiger als im statischen Fall, denn in diesem hat man wesentlich geringeren Einfluss darauf wie die geladenen Controls intern aufgebaut sind.</p>
<pre class="brush: xml; title: dynamisch befülltes ItemsControl; notranslate">
&lt;ItemsControl ItemsSource=&quot;{Binding ControlSource}&quot; /&gt;
</pre>
<p>Nun hat man zunächst aber ein weiteres Problem. Denn man muss irgend wie die Überschrift ermitteln die zuvor noch statisch angegeben werden konnten. Hier bietet sich die Nutzung eines Interfaces an, dass genau jene Property vorschreibt auf die der Header sich dann bindet.</p>
<pre class="brush: csharp; title: ; notranslate">
public interface IHeaderedView
{
   string Header { get; }
}
</pre>
<p>Als nächstes müssen wir nun noch das Aussehen unseres Headers festlegen. Diesmal verwende ich kein <em>HeaderedContentControl</em> sondern überschreibe das <em>ControlTemplate</em> des <em>ContentControls</em> eines jeden Items. Sieht man sich den Code genauer an, merkt man sehr schnell, dass ich jetzt genau das tue, was ich im statischen Fall zu vermeiden versucht habe.</p>
<pre class="brush: xml; highlight: [6,7,8]; title: ; notranslate">
&lt;Style x:Key=&quot;ItemHeaderStyle&quot;&gt;
   &lt;Setter Property=&quot;Control.Template&quot;&gt;
     &lt;Setter.Value&gt;
         &lt;ControlTemplate TargetType=&quot;{x:Type ContentControl}&quot;&gt;
            &lt;StackPanel&gt;
               &lt;TextBlock Text=&quot;{Binding Path=Header,
                    RelativeSource={RelativeSource TemplatedParent}}&quot; /&gt;
               &lt;ContentPresenter /&gt;
            &lt;/StackPanel&gt;
         &lt;/ControlTemplate&gt;
      &lt;/Setter.Value&gt;
   &lt;/Setter&gt;
&lt;/Style&gt;
</pre>
<p>Der <em>ContentPresenter</em> spiegelt hierbei das tatsächlich hinzugefügte Element wieder, welches von einem <em>StackPanel</em> umgeben und dessen Header von einem <em>TextBlock</em> dargestellt wird. Der Text des <em>TextBlocks</em> ergibt sich nun aus der von <em>IHeaderedView</em> vorgeschriebenen Property. Damit diese Bindung funktioniert muss das Interface jedoch im CodeBehind der View umgesetzt werden.</p>
<pre class="brush: xml; title: Dynamisch befülltes ItemsControl mit Headern; notranslate">
&lt;ItemsControl ItemsSource=&quot;{Binding ControlSource}&quot;
              ItemContainerStyle=&quot;{StaticResource ItemHeaderStyle}&quot;/&gt;
</pre>
<p>Damit es aber nun wirklich wie gewünscht aussieht, muss der Style noch verwendet werden. Hierzu ist dieser dem <em>ItemContainerStyle</em> des <em>ItemsControl</em> zuzuweisen.</p>
<p><strong>&#8230;zuletzt dann auch mit Prism.</strong></p>
<p>Tja, das war eigentlich schon alles. Um Prism hier ins Spiel zu bringen muss man nun eigentlich nur das Binding auf die Liste der Controls entfernen und das <em>ItemControl</em> als Region bekannt machen. Wie so etwas aussehen kann, zeigt der folgende Code und das entsprechende Bild.</p>
<pre class="brush: xml; title: ItemsControl mit RegionManager; notranslate">
&lt;ItemsControl Prism:RegionManager.RegionName=&quot;DiagramRegion&quot;
              ItemContainerStyle=&quot;{StaticResource ItemHeaderStyle}&quot;/&gt;
</pre>
<p style="text-align: center;"><a href="http://www.just-about.net/wp-content/uploads/2012/01/Item-Control-Mit-Headern.png" rel="lightbox[1970]"><img class="aligncenter" title="ItemsControl mit Überschriften" src="http://www.just-about.net/wp-content/uploads/2012/01/Item-Control-Mit-Headern-245x300.png" alt="" width="245" height="300" /></a></p>
<p style="text-align: left;">Wen es interessiert: Als Ausgangspunkt für den Style im Bild wurde das <a href="http://wpf.codeplex.com/wikipage?title=WPF%20Themes" target="_blank">Shiny Red Theme</a> verwendet.</p>
<p style="text-align: left;"><strong>Weitere Infos</strong></p>
<p style="text-align: left;">- <a href="http://msdn.microsoft.com/de-de/library/bb613548.aspx" target="_blank">WPF Content Model in der MSDN </a></p>
<p style="text-align: left;">- sehr gute <a href="http://drwpf.com/blog/2008/03/25/itemscontrol-i-is-for-item-container/" target="_blank">Beschreibung </a>zu Items Containern &amp; Co.</p>
<div class="printfriendly alignright"><a href="http://www.just-about.net/itemscontrol-mit-ueberschriften?pfstyle=wp" rel="nofollow" ><span class="printfriendly-text"></span></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.just-about.net/itemscontrol-mit-ueberschriften/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pattern, Clean Code &amp; Prism &#8211; Vortrag an der HTW-Dresden vom 16.01.2012</title>
		<link>http://www.just-about.net/vortrag-htw-pattern-clean-code-prism</link>
		<comments>http://www.just-about.net/vortrag-htw-pattern-clean-code-prism#comments</comments>
		<pubDate>Tue, 17 Jan 2012 20:02:32 +0000</pubDate>
		<dc:creator>Hendrik Lösch</dc:creator>
				<category><![CDATA[DotNetGerman Bloggers]]></category>
		<category><![CDATA[Grundlagen]]></category>
		<category><![CDATA[Vorträge]]></category>
		<category><![CDATA[CCD]]></category>
		<category><![CDATA[Pattern]]></category>
		<category><![CDATA[Prism]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://www.just-about.net/?p=2068</guid>
		<description><![CDATA[Das Semester neigt sich dem Ende, die Vorlesungen sind fast alle gehalten und so ist jetzt eine gute Möglichkeit den Studenten ein wenig Wissen abseits des eigentlichen Lehrplans zu vermitteln. Dank Professor Nestler hatte ich auf diese Weise wieder die Möglichkeit einen Spezialvorlesung an der HTW-Dresden zu halten. Nach dem ich mich beim letzten Mal [...]]]></description>
			<content:encoded><![CDATA[<p>Das Semester neigt sich dem Ende, die Vorlesungen sind fast alle gehalten und so ist jetzt eine gute Möglichkeit den Studenten ein wenig Wissen abseits des eigentlichen Lehrplans zu vermitteln.</p>
<p>Dank Professor Nestler hatte ich auf diese Weise wieder die Möglichkeit einen Spezialvorlesung an der HTW-Dresden zu halten. Nach dem ich mich beim letzten Mal im Juni vor allem der agilen Entwicklung und dem automatisierten Test gewidmet hatte, ging es dieses Mal um Pattern, Clean Code und Prism. <span id="more-2068"></span></p>
<p>Für alle Anwesenden muss ich an der Stelle zugeben, dass die Vorlesung zunächst eigentlich zu MVVM und Prism geplant war und im Rahmen einer Lehrveranstalltung zum Thema WPF stattfinden sollte. Im Verlauf der letzten Wochen hat sich dies dann aber in eine etwas andere Richtung verschoben, so das Patterns allgemein und Clean Code mehr ins Zentrum gerückt sind.</p>
<p>Ziel war es daher auch nicht mehr so sehr, einen Einblick in die Praxis mit genanntem Framework und Patten zu geben, sondern eine Art Wegweiser zu errichten der Ideen geben sollte wie bestimmte Probleme umgangen werden können bzw. warum diese überhaupt erst auftauchen.</p>
<p>Für mich persönlich war es erneut eine Herausforderung die Informationen möglichst interessant und verständlich aufzubereiten. Immerhin sprechen wir hier über Themen deren Umfang und Komplexität auch so manchen erfahrenen Entwickler vor Probleme stellt.</p>
<p>Dass man dabei nicht alle Sachen die in diesem Rahmen gesagt und gezeigt wurden gänzlich in Form von Folien verfügbar machen kann, ist sicher einleuchtend. Ich hoffe aber das möglichst viele der Informationen noch immer in der Präsentation enthalten sind, zumal ich eine ganze Reihe von Bildern entfernen musste weil ich mich nicht sicher bin ob die von mir erworbenen Lizenzen eine Veröffentlichung im Internet einschließen.</p>
<p>Viel Spaß also mit den Folien und viel Erfolg bei zukünftigen Projekten.</p>
<div id="__ss_11115131" style="width: 425px;"><object id="__sse11115131" width="425" height="355" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="wmode" value="transparent" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=htw-clean-code-und-pattern-kurz-120117130624-phpapp02&amp;stripped_title=clean-code-pattern-htw-dresden&amp;userName=HendrikLsch" /><param name="allowscriptaccess" value="always" /><param name="allowfullscreen" value="true" /><embed id="__sse11115131" width="425" height="355" type="application/x-shockwave-flash" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=htw-clean-code-und-pattern-kurz-120117130624-phpapp02&amp;stripped_title=clean-code-pattern-htw-dresden&amp;userName=HendrikLsch" allowFullScreen="true" allowScriptAccess="always" wmode="transparent" allowscriptaccess="always" allowfullscreen="true" /></object></div>
<div style="width: 425px;"><strong>Links</strong></div>
<div style="width: 425px;">- Gute Übersicht zu den Pattern der <a href="http://wwwswt.informatik.uni-rostock.de/deutsch/Infothek/Entwurfsmuster/patterns/" target="_blank">GOF</a></div>
<div style="width: 425px;">- <a href="http://martinfowler.com/" target="_blank">Martin Fowler</a></div>
<div style="width: 425px;">- Linksammlung zu <a href="https://sites.google.com/site/unclebobconsultingllc/" target="_blank">Robert C. Martin</a></div>
<div style="width: 425px;">- <a href="http://clean-code-developer.de/" target="_blank">Clean Code Developer</a></div>
<div class="printfriendly alignright"><a href="http://www.just-about.net/vortrag-htw-pattern-clean-code-prism?pfstyle=wp" rel="nofollow" ><span class="printfriendly-text"></span></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.just-about.net/vortrag-htw-pattern-clean-code-prism/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Visual Studio für Individualisten</title>
		<link>http://www.just-about.net/vs-color-styles</link>
		<comments>http://www.just-about.net/vs-color-styles#comments</comments>
		<pubDate>Sun, 20 Nov 2011 15:58:00 +0000</pubDate>
		<dc:creator>Hendrik Lösch</dc:creator>
				<category><![CDATA[DotNetGerman Bloggers]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[Links]]></category>

		<guid isPermaLink="false">http://www.just-about.net/?p=1919</guid>
		<description><![CDATA[Sind wir doch mal ehrlich, dass Einheitsblau von Visual Studio ist auf Dauer schon recht trist. Dabei bietet das Studio, allein schon durch die Tatsache das es WPF nutzt, so einige Möglichkeiten der farblichen Anpassung. Zwei Seiten helfen dabei besonders. Bei studiostyl.es kann man Styles für den Code-Editor des Visual Studios austauschen. Wem das nicht [...]]]></description>
			<content:encoded><![CDATA[<p>Sind wir doch mal ehrlich, dass Einheitsblau von Visual Studio ist auf Dauer schon recht trist. Dabei bietet das Studio, allein schon durch die Tatsache das es WPF nutzt, so einige Möglichkeiten der farblichen Anpassung.</p>
<p><span id="more-1919"></span></p>
<p>Zwei Seiten helfen dabei besonders. Bei <a href="http://studiostyl.es/" target="_blank">studiostyl.es</a> kann man Styles für den Code-Editor des Visual Studios austauschen. Wem das nicht reicht, der kann mit dem <a href="http://www.frickinsweet.com/tools/Theme.mvc.aspx" target="_blank">Style-Generator</a> basierend auf  wenigen Eingaben einen entsprechenden Style generieren lassen. Importiert werden die entsprechenden Dateien dann ganz einfach über Tools -> Import and Export Settings&#8230;</p>
<p><a href="http://www.just-about.net/wp-content/uploads/2011/11/Resharper-Color-identifiers.png" rel="lightbox[1919]"><img class="alignleft" title="R# Color Identifiers" src="/wp-content/uploads/2011/11/_d_improd_/Resharper-Color-identifiers-300x165_f_improf_300x165.png" alt="" width="300" height="165" /></a>Einige der Styles sind etwas gewöhnungsbedürftig, andere wirklich gut. Letztendlich kann es aber in Verbindung mit dem Resharper zu ein paar Problemen kommen, weshalb ich empfehlen würde die erweiterten Code Styles auszuschalten.</p>
<p>Außerdem funktionert bei den dunkleren Themes die Anzeige der aktuellen Zeile nicht so recht. Die Farben sind in aller Regel viel zu hell, weshalb man nicht erkennen kann was man gerade schreibt. </p>
<p>Sollte es Farben geben die man ändern möchte, kann man dies über Tools -> Options -> Environment -> Fonts and Colors tun. <a href="http://www.just-about.net/wp-content/uploads/2011/11/moegliches-Ergebnis.png" rel="lightbox[1919]"><img class="alignright size-medium wp-image-1940" title="Visual Studio in Dunkel" src="http://www.just-about.net/wp-content/uploads/2011/11/moegliches-Ergebnis-300x177.png" alt="" width="300" height="177" /></a></p>
<p>Falls jemand außerdem daran interessiert ist das komplette Aussehen des Visual Studios zu verändern, kann er dies mit Hilfe des <a href="http://visualstudiogallery.msdn.microsoft.com/20cd93a2-c435-4d00-a797-499f16402378" target="_blank">Visual Studio Color Theme Editors</a> tun. Dieser &#8220;klingt&#8221; sich als eigener Eintrag in die Menüleiste ein und kann dann zu Laufzeit zwischen verschienden Farbeinstellungen wechseln bzw. über einen gesonderten Menüeintrag weitere Themes importieren. </p>
<div class="printfriendly alignright"><a href="http://www.just-about.net/vs-color-styles?pfstyle=wp" rel="nofollow" ><span class="printfriendly-text"></span></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.just-about.net/vs-color-styles/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>„Prism spinnt!“ oder “static const vs. static readonly”</title>
		<link>http://www.just-about.net/static-const-vs-static-readonly</link>
		<comments>http://www.just-about.net/static-const-vs-static-readonly#comments</comments>
		<pubDate>Wed, 16 Nov 2011 18:08:35 +0000</pubDate>
		<dc:creator>Hendrik Lösch</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[DotNetGerman Bloggers]]></category>
		<category><![CDATA[3rd Party]]></category>
		<category><![CDATA[Aargh!]]></category>
		<category><![CDATA[Prism]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://www.just-about.net/?p=1855</guid>
		<description><![CDATA[Es gibt diese Bugs über die Entwickler stundenlang philosophieren können und bei deren Erläuterung man reihenweise das Klatschen flacher Hände auf gerunzelten Stirnen vernimmt, weil man es ja eigentlich hätte wissen können. Nachfolgende Schilderungen gehören eindeutig in diese Kategorie&#8230; Dank Dotnetpro und Co. sollte das Framework Prism mittlerweile recht bekannt sein. Es dient dazu WPF [...]]]></description>
			<content:encoded><![CDATA[<p>Es gibt diese Bugs über die Entwickler stundenlang philosophieren können und bei deren Erläuterung man reihenweise das Klatschen flacher Hände auf gerunzelten Stirnen vernimmt, weil man es ja eigentlich hätte wissen können. Nachfolgende Schilderungen gehören eindeutig in diese Kategorie&#8230;</p>
<p><span id="more-1855"></span>Dank Dotnetpro und Co. sollte das Framework Prism mittlerweile recht bekannt sein. Es dient dazu WPF oder Silverlight Applikationen zur Laufzeit dynamisch „zusammen zu stöpseln“. Statt also während der Entwicklung fest zu legen welches UserControl wo hin geladen wird, legt man nur Regionen für die Steuerelemente fest und deren Inhalt wird dann dynamisch beim Start an genau diesen Stellen platziert. Dadurch können sie ohne weiteres ausgetauscht, wieder verwendet oder neu angeordnet werden.</p>
<div class="wp-caption alignleft" style="width: 310px"><a href="http://www.just-about.net/wp-content/uploads/2011/11/Prism-Soll.png" rel="lightbox[1855]"><img title="Soll Zustand" src="http://www.just-about.net/wp-content/uploads/2011/11/Prism-Soll-300x203.png" alt="Soll Zustand der Prism Anwendung" width="300" height="203" /></a><p class="wp-caption-text">Soll Zustand der Prism Anwendung mit einem TabControl in dem dynamisch die Views angeordnet werden.</p></div>
<p>Diese Regionen werden dabei  von einem so genannten <em>RegionManager </em>verwaltet bei dem sie und ihre zugehörigen Views registriert werden. Prism übernimmt dann die Auflösung aller Abhängigkeiten und die  Instanziierung der notwendigen Klassen.</p>
<p>Damit die Views sich aber bei den Regionen registrieren können, müssen jene identifiziert werden und das tut man in aller Regel über Strings. Und weil es natürlich sehr fehleranfällig ist, diese String immer und immer wieder einzugeben gilt es als Best-Practice eine statische Klasse zu schaffen in der all jene gesammelt werden. Somit werden im Xaml oder C# Code dann nur noch Variablen verwendet und die eigentlichen Strings sind völlig egal.</p>
<pre class="brush: xml; title: ; notranslate">
&lt;TabControl p:RegionManager.RegionName=&quot;{x:Static c:Constants.MainRegion}&quot;/&gt;
</pre>
<p>Eigentlich, denn was passiert, wenn man die Strings ändert? Hier kommt es sehr stark darauf an wie man sie in der statischen Klasse hinterlegt hat, denn dafür gibt es zwei bzw. drei Wege. Der übliche und von StyleCop und R# geforderte ist dabei die Verwendung von konstanten Variablen:</p>
<pre class="brush: csharp; title: ; notranslate">
public static class Constants
{
   public static const string ControlRegion = &quot;controlRegion&quot;;
   public static const string MainRegion = &quot;mainContentRegion&quot;;
   public static const string MenuRegion = &quot;menuRegion&quot;;
}
</pre>
<p>Dies hat einen gewissen Vorteil, denn konstante Variablen werden zur Kompilier-Zeit aufgelöst und ihr tatsächlicher Wert wird dann vom Compiler an all jene Stellen geschrieben an denen sie referenziert werden; was auch der Grund ist warum nur die üblichen Wertetypen und Strings als const gekennzeichnet werden können. Auf diese Weise spart man zur Laufzeit das Fitzelchen Rechenzeit was bei einer üblichen statischen Variable verloren geht, weil erst deren Referenz aufgelöst und ihr Wert ausgelesen werden muss.</p>
<div id="attachment_1908" class="wp-caption alignright" style="width: 310px"><a href="http://www.just-about.net/wp-content/uploads/2011/11/Prism-Ist.png" rel="lightbox[1855]"><img class="size-medium wp-image-1908 " title="Ist Zustand" src="http://www.just-about.net/wp-content/uploads/2011/11/Prism-Ist-300x239.png" alt="Ist Zustand mit falscher Namenszuordnung." width="300" height="239" /></a><p class="wp-caption-text">Fehlerhafter Ist-Zustand weil die Region aufgrund des falschen Namens nicht zugeordnet werden kann.</p></div>
<p>Der zweite und dritte Weg besteht dem gegenüber darin, eine statische nur lesbare Variable bzw. statische Property zu verwenden. Hier wird der Wert mit jedem Zugriff erneut ausgelesen, was nicht ganz so performant ist aber den Vorteil hat, dass die Werte nicht in die Aufrufer hinein kompiliert werden.</p>
<p>Ich gebe zu, so wirklich neu ist das für die Meisten sicher nicht. Es wird im Alltag aber schnell vergessen, wodurch dann Situationen entstehen bei denen man sich die Haare rauft.  Denn wenn man zum Beispiel im Zusammenhang mit Prism nicht darauf achtet und einfach mal die Strings der Konstanten ändert ohne alle abhängigen Dlls neu zu kompilieren, wundert man sich recht schnell warum die Views nicht mehr angezeigt werden und das obwohl man doch eigentlich „nichts“ geändert hat.</p>
<p>In dem Fall dann also einfach noch einmal alles komplett kompilieren, die strings nicht const mache oder halt niemals ändern&#8230;</p>
<div class="printfriendly alignright"><a href="http://www.just-about.net/static-const-vs-static-readonly?pfstyle=wp" rel="nofollow" ><span class="printfriendly-text"></span></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.just-about.net/static-const-vs-static-readonly/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Hands-On: Scrum mit dem Team Foundation SERVICE in der Cloud</title>
		<link>http://www.just-about.net/hands-on-tfs</link>
		<comments>http://www.just-about.net/hands-on-tfs#comments</comments>
		<pubDate>Wed, 09 Nov 2011 20:37:00 +0000</pubDate>
		<dc:creator>Hendrik Lösch</dc:creator>
				<category><![CDATA[DotNetGerman Bloggers]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[TFS]]></category>
		<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://www.just-about.net/?p=1861</guid>
		<description><![CDATA[Microsoft geht mit dem Team Foundation Server in die Cloud. Zur Zeit läuft dazu eine Closed Beta in welche wir nun einmal hinein schnuppern wollen um zu sehen was uns das neuste Werkzeug aus dem Hause Microsoft so zu bieten hat.]]></description>
			<content:encoded><![CDATA[<p>Heute habe ich netterweise einen Zugangscode für das Preview des Team Founddation Service bekommen und nun den halben Abend damit rum gespielt um hier mal meine ersten Eindrücke zum Besten zu geben.</p>
<p><span id="more-1861"></span></p>
<p>Der Team Foundation Service ist eine Art Team Foundation Server  in der Cloud und basiert auf Azure. Laut Microsofts Aussagen richtet er sich vor allem an kleine bis mittlere Teams die den Aufwand scheuen einen eigenen TFS, mit dieser DBA hat sich Microsoft keine Freude gemacht, aufzusetzen.</p>
<p>Nachdem man dem Link in der Mail folgt, kommt man auf eine recht übersichtliche Webseite seinen Account einrichten und ein eigenes Teamproject anlegen. Team Projekte sind dabei ähnlich wie die Repositories aus SVN oder Git und bündeln logisch die Versionierung, Workitems und Co.</p>
<p>Zu jedem Projekt gehört auch ein spezielles Template welches bestimmt wie die Benennung der Workitems ist, welche Eingabefelder zur Verfügung stehen und welche anderen Features genutzt werden können. Ich habe mich an der Stelle für Scrum entschieden wodurch die nachfolgenden Beschreibungen auch nur auf dieses bezogen sind.</p>
<p style="text-align: center;"><a href="http://www.just-about.net/wp-content/uploads/2011/11/Anmeldung.png" rel="lightbox[1861]"><img class="size-medium wp-image-1866 aligncenter" title="Anmeldung" src="http://www.just-about.net/wp-content/uploads/2011/11/Anmeldung-300x191.png" alt="Anmeldung beim Closed Preview der Team Foundation Services" width="300" height="191" /></a></p>
<p>Nach etwa 5 Minuten ist das Projekt eingerichtet und es kann darauf zugegriffen werden. Danach kann man auch schon loslegen und die erste User Story anlegen. Denn bevor man etwas tut, sollte man auch wissen warum man es macht. Die dafür notwendigen Eingaben kann man komplett über den Browser tätigen.</p>
<p><a href="http://www.just-about.net/wp-content/uploads/2011/11/User-Story-anlegen.png" rel="lightbox[1861]"><img class="aligncenter size-medium wp-image-1867" title="User Story anlegen" src="http://www.just-about.net/wp-content/uploads/2011/11/User-Story-anlegen-300x173.png" alt="Die Eingabemaske einer User Story" width="300" height="173" /></a></p>
<p>Wer schon mit dem TFS und dem agilen Template gearbeitet hat wird die Eingabemaske weitestgehend kennen. Darin kann man typische Werte wie Aufwand und Business Value angeben, eine Person bestimmen die es umsetzen soll und evtl. weitere Arbeitspakete oder Tests damit verlinken. Letzteres erlaubt das gleiche Vorgehen wie beim großen Bruder wodurch ganze Abhängigkeitsbäume möglich sind.</p>
<p><a href="http://www.just-about.net/wp-content/uploads/2011/11/Verlinkung1.png" rel="lightbox[1861]"><img class="aligncenter size-medium wp-image-1893" title="Verlinkung" src="http://www.just-about.net/wp-content/uploads/2011/11/Verlinkung1.png" alt="Verlinkung von Task und Test" width="300" height="250" /></a></p>
<p>Nachdem nun das Product-Backlog aufgebaut ist, fehlt noch die Iterationsplanung. Dazu muss zunächst festgelegt werden in welchem Zeitraum der erste Sprint läuft und anschließend welche Stories darin zu bearbeiten sind. Die Übersicht zur zeitlichen Planung der Sprints wirkt an der Stelle noch recht spartanisch.</p>
<p><a href="http://www.just-about.net/wp-content/uploads/2011/11/Sprint.png" rel="lightbox[1861]"><br />
<img class="aligncenter size-medium wp-image-1869" title="Sprint" src="http://www.just-about.net/wp-content/uploads/2011/11/Sprint-300x197.png" alt="Sprintplanung" width="300" height="197" /></a></p>
<p>Zur Planung der User Stories und Tasks bietet sich das Taskboard an. Dieses ist eine weitaus übersichtlichere Möglichkeit um die einzelnen Aufgaben einer Story zu verwalten. So sieht man in der Standardfilterung auf der linken Seite die jeweils geplante Story und rechts daneben die zu ihr gehörigen Aufgaben. Diese können über einen Klick auf das Plus direkt aus dem Board heraus erstellt und entsprechend verlinkt werden. Ihren Status kann man dann per Drag-and-Drop wechseln, in dem man sie von einer Spalte in die nächste zieht.</p>
<p><a href="http://www.just-about.net/wp-content/uploads/2011/11/Taskboard.png" rel="lightbox[1861]"><img class="aligncenter size-medium wp-image-1870" title="Taskboard" src="http://www.just-about.net/wp-content/uploads/2011/11/Taskboard-300x139.png" alt="Das Taskboard" width="300" height="139" /></a></p>
<p>Leider habe ich keine Möglichkeit gefunden den Aufbau des Boards zu verändern. So wollte ich vor <em>done</em> noch einen Status <em>Review</em> einfügen. Dies ginge wahrscheinlich nur durch Anpassung des Templates, da sich der Aufbau des Boards implizit von den definierten Stati der Tasks ableitet.</p>
<p>Rechts in der Ecke des Boards gibt es einen kleinen Burndown-Chart, der auf Klick vergrößert dargestellt wird. In diesem wird jeweils die noch zu leistende Arbeit eingetragen und somit kann darauf geschlossen werden ob alle Features eines Sprints rechtzeitig fertig werden. Im Beispiel ist davon nicht viel zu sehen, weil ja auch noch nicht viel passiert ist.</p>
<p><a href="http://www.just-about.net/wp-content/uploads/2011/11/Burndown.png" rel="lightbox[1861]"><img class="size-medium wp-image-1871 aligncenter" title="Burndown" src="http://www.just-about.net/wp-content/uploads/2011/11/Burndown-300x192.png" alt="Der Burndown Chart" width="300" height="192" /></a></p>
<p>&#8220;Leider&#8221;, wird anscheinend aktuell nur ein Burndown des Aufwands und nicht der Tasks angeboten. Da sich bei sowas gern verschätzt wird und die Verwaltung aufwändiger ist, würde ich ein Task-Burndown bevorzugen.</p>
<p>Nun haben wir die Arbeit, also fehlt noch das Vergnügen. Um den passenden Code  einchecken zu können, braucht man erstmal das <a href="http://www.microsoft.com/download/en/details.aspx?id=23691">SP1</a> und ein <a href="http://go.microsoft.com/fwlink/?LinkID=212065">Hotfix</a> für das Visual Studio. Danach kann man über den Team Explorer und mit Eingabe der eigenen Life-ID per Visual Studio auf den Service zugreifen, als wäre es ein &#8220;normaler&#8221; TFS. Dies bedeutet, dass man alle Workitems auch über das Visual Studio verwalten, Code aus- und einchecken aber nicht zum Beispiel die einfache Ansicht des Taskboards aufrufen kann.</p>
<p><a href="http://www.just-about.net/wp-content/uploads/2011/11/Integration.png" rel="lightbox[1861]"><img class="aligncenter size-medium wp-image-1872" title="Integration" src="http://www.just-about.net/wp-content/uploads/2011/11/Integration-300x162.png" alt="TFS Integration im Visual Studio" width="300" height="162" /></a></p>
<p>Über den Team-Explorer kann man dann auch einfach seine Projekte hinzufügen, wobei sich das Tool recht schlau anstellt was eingecheckt wird und was nicht. Den Status der  einzelnen Dateien (neu, eingecheckt, ausgecheckt,&#8230;) kann man im Solution Explorer an einem kleinen Icon erkennen. Das Einchecken selbst passiert mit rechter Maustaste und über einen Dialog, in dem die Änderungen mit einem Kommentar versehen und mit den entsprechenden Aufgaben verlinkt werden können, alles genau so wie mit dem &#8220;echten&#8221; TFS.</p>
<p>Das nun entstandene Changeset, kann man sich im Portal genauer ansehen. Dabei ist es möglich sich über die damit verbundenen Änderungen genauer zu informieren, direkt durch den Code zu browsen und, das finde ich absolut Klasse, die Versionen einzelner Dateien direkt im Browser vergleichen.</p>
<p><a href="http://www.just-about.net/wp-content/uploads/2011/11/source-compare.png" rel="lightbox[1861]"><img class="aligncenter size-medium wp-image-1873" title="Datei Vergleich" src="http://www.just-about.net/wp-content/uploads/2011/11/source-compare-300x154.png" alt="Zwei Dateien direkt im Browser mit einander vergleichen" width="300" height="154" /></a></p>
<p>Hat man Code, will man diesen auch bauen und so kämen wir jetzt eigentlich zum Build. Tatsächlich wird dieser aber (noch) nicht integriert angeboten. Vielmehr muss man einen eigenen Buildserver aufbauen und kann diesen dann mit dem Service verbinden. Welchen Aufwand das macht kann ich an der Stelle nicht sagen.</p>
<p>Letztendlich wirkt die Sache auf mich aber etwas eigenartig. Immerhin hat man jetzt seinen Code und alle Daten bei Microsoft liegen aber die tatsächlich rechenintensive Arbeit muss man immer noch selbst machen. Gerade in Zeiten von Continous Integration und Nightly Builds wäre eine Cloud-Lösung hier absolut wünschenswert.</p>
<p>Bleibt abschließend noch die Verwaltung und Benutzerführung zu erwähnen. Obwohl vieles durch das verwendete Template festgelegt wird, hat man noch eine ganze Menge Knöpfe an denen man drehen kann. Leider ist dabei nicht jeder Dialog so übersichtlich gestaltet wie die Benutzerverwaltung. Als Administrator kam ich mir gelegentlich doch recht verloren vor, wobei man sagen muss, dass ich auch zu keiner Zeit die Hilfe gelesen habe.</p>
<p><a href="http://www.just-about.net/wp-content/uploads/2011/11/Nutzerverwaltung.png" rel="lightbox[1861]"><img class="aligncenter size-medium wp-image-1898" title="Benutzerverwaltung" src="http://www.just-about.net/wp-content/uploads/2011/11/Nutzerverwaltung-300x180.png" alt="" width="300" height="180" /></a></p>
<p>Alle anderen Projektteilnehmer werden mit einer einfachen Menüführung über 4 Hauptpunkte am oberen Rand verwöhnt und sollten sich schnell zu recht finden. Einzig bei der Suche nach den Backlogs war ich auch hier anfangs etwas verwirrt.</p>
<h3>Fazit</h3>
<p>Bis auf den letzten Punkt und bin ich vom Stand der Sache richtig gehend begeistert. OK, das Beta Preview läuft schon seit September aber die Stabilität, der technische Umfang und die Möglichkeiten die sich ergeben finde ich schon sehr gut. Lässt man einige Probleme außen vor, nutze ich den TFS an sich gern und könnte mich rein aus dem Bauch heraus für einen Umstieg begeistern. Ob dies aber wirklich geschieht hängt nicht zuletzt davon ab was es für Projekte damit entwickelt werden sollen (Thema Datenschutz und Compliance) und wie viel es letztendlich kostet.</p>
<div class="printfriendly alignright"><a href="http://www.just-about.net/hands-on-tfs?pfstyle=wp" rel="nofollow" ><span class="printfriendly-text"></span></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.just-about.net/hands-on-tfs/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ein Tag Leipzig – Resümee des Netopenspace 2011</title>
		<link>http://www.just-about.net/netopenspace-2011</link>
		<comments>http://www.just-about.net/netopenspace-2011#comments</comments>
		<pubDate>Wed, 26 Oct 2011 20:17:50 +0000</pubDate>
		<dc:creator>Hendrik Lösch</dc:creator>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[DotNetGerman Bloggers]]></category>
		<category><![CDATA[netos]]></category>
		<category><![CDATA[Veranstalltungen]]></category>

		<guid isPermaLink="false">http://www.just-about.net/?p=1832</guid>
		<description><![CDATA[Letztes Wochenende war eines der größten Community Events in der deutschen .Net-Hemisphäre. In Leipzig trafen sich etwa 170 begeisterte Entwickler um über Trends, alltägliche Sorgen und die Verfehlungen von Microsoft zu beratschlagen oder philosophieren. Für mich als Ex-Leipziger und Exil-Dresdner natürlich ein Muss. Und so kam es, dass ich schon begeistert der Anmeldung harrte bevor [...]]]></description>
			<content:encoded><![CDATA[<p>Letztes Wochenende war eines der größten<a href="http://netopenspace.de/2011/" target="_blank"> Community Events</a> in der deutschen .Net-Hemisphäre. In Leipzig trafen sich etwa 170 begeisterte Entwickler um über Trends, alltägliche Sorgen und die Verfehlungen von Microsoft zu beratschlagen oder philosophieren. Für mich als Ex-Leipziger und Exil-Dresdner natürlich ein Muss. Und so kam es, dass ich schon begeistert der Anmeldung harrte bevor diese überhaupt freigeschaltet wurde.<span id="more-1832"></span></p>
<p>Als der Termin dann jedoch endlich da war, gab es für mich das typische Problem aller Leistungsträger: Zu viel zu tun und zu wenig <a href="http://netopenspace.de/2011/" target="_blank"><img class="alignright size-full wp-image-1847" title="Netopenspace" src="http://www.just-about.net/wp-content/uploads/2011/10/Netopenspace.png" alt="" width="120" height="120" /></a>Zeit. Weshalb ich statt zwei nur einen Tag vor Ort sein konnte und leider auch die anschließende Party verpasst habe. Dennoch konnte ich an dem einen Tag weit mehr lernen und weit mehr interessante Menschen treffen als bei so mancher kommerziellen Veranstaltung.</p>
<p>Dies ging schon mit der Organisation und den einfachen Regeln des Tages los, die sinngemäß lauteten:</p>
<ul>
<li>Eine Session kann ein Vortrag sein, eine Diskussion oder Live Coding, es hängt komplett davon ab was gewünscht wird.</li>
<li>Jede Session lebt von ihren Beteiligten und geht maximal eine Stunde.</li>
<li>Vorbei ist vorbei, nicht vorbei ist nicht vorbei. Fragen also gleich stellen, sonst ist es vielleicht zu spät.</li>
<li>Niemand muss in einer Session bleiben. Wenn es wo anders schöner ist, geht man halt da hin.</li>
</ul>
<p>Darauf basierend, wurden dann entsprechende Themen gesammelt. Welche jeweils zunächst auf einen Zettel geschrieben und dann allen Beteiligten vorgestellt wurden. Jeder der sich dafür interessierte hob anschließend die Hand damit eingeschätzt werden konnte welche Raumgröße benötigt wird, bevor die Session dann grob in ein Zeitraster eingeplant wurde. Dieser Plan wurde dann, nachdem alle Sessions fest standen, von allen Beteiligten nach Belieben sortiert bevor es in die ersten Räume ging.</p>
<p>Letzteres sehe ich gewissermaßen als notwendiges Übel. Es ist verständlich, dass bei einer so agilen Veranstaltung keine Agenda existieren kann und demnach eine Raumplanung im Vorfeld unmöglich wird. Aber irgendwie hatte  ich das dumpfe Gefühl, dass die Räume über den Tag hin weg gern mal wieder umsortiert wurden. Zumindest ist es mir mehr als einmal passiert, dass ich in einem Raum saß in den ich zumindest anfangs gar nicht wollte. Naja, zumindest so lange bis ich gemerkt hatte, dass mich das „neue“ Thema auch interessierte.</p>
<p>Genau bei dem Punkt muss ich der Veranstaltung ein großes Lob aussprechen. Obwohl es viele Leute gab die, wie ich, wohl eher zum Konsumieren gekommen sind, gab es sehr viele sehr gute Sessions. Nach meinem Gefühl gab es genau die richtige Mischung aus typischen Wiederholungstätern, Technologiegurus und begeisterten Brötchen-Verdien-Programmierern. Auf diese Weise konnte ich gelegentlich eigene Erfahrungen zum besten geben und musste mich an anderer Stelle nicht ganz so tief verkriechen weil ich vom Thema noch nicht viel gehört hatte.</p>
<p>Mein Tagesablauf sah dann auch so aus (über die Reihenfolge bin ich mir nicht mehr sicher):</p>
<p><strong>Windows Phone 7</strong></p>
<p>Eigentlich wohl zum Live Coding gedacht artete es schnell in eine Marktanalyse aus, mit meinem späteren Entschluss auf Webapps umzusatteln bevor ich überhaupt mit WP7 anfange&#8230;</p>
<p><strong>Mittagessen</strong></p>
<p>Gesponserte Hühnerschenkel und dazu Diskussionen zum Praxiseinsatz von Specflow, UI-Testing und wo im V-Model sich Techniken wie BDD und TDD finden.</p>
<p><strong>Für mich wichtigste Feststellung:</strong> V ist als Vorgehensmodell vielleicht nicht so hip wie Scrum und Co. aber es zeigt uns sehr einfach die Abstraktionsebenen der Software und gibt uns eine eindeutige Definition der Testarten wie man sie in der typischen online Literatur oft schmerzlich vermisst. (Man vergleiche nur mal die missverständlichen Betrachtungen in Blogs darüber was ein Unit-, Integrations-, System- und Akzeptanztest ist…)</p>
<p><strong>WTF is a Type Provider?</strong></p>
<p>Steffen Forkman zeigte wie man mit F# 3.0 Typen während der Programmierzeit(!!!) dynamisch und ohne Kompilierung aus einer Beschreibung eines Webservices oder anderen Quellen erstellen kann, wodurch typsicheres Programmieren ohne großen Aufwand möglich wird.</p>
<p>Neben dem Microsoft Bashing eindeutig mein Highlight des Tages.</p>
<p><strong>[Session Hopping]</strong></p>
<p>Eine Stunde lang von einer Session zur anderen hüpfen und irgendwie überall mal rein schnuppern, auf dem Gang mit Leuten reden und ungestört das Buffet plündern. Wunderbar!</p>
<p><strong>Event Based Components und Flow Design</strong></p>
<p>Man baut sich für jede grundlegende Funktionalität eine Klasse mit nur einer Methode. In „Platinen“ oder „Controller“-Klassen stöpselt man diese dann zusammen und erreicht damit eine bessere Austausch- und Testbarkeit.</p>
<p>Auch wenn Björn Rochel und Stefan Lieser mir in der Session das Brett vor dem Kopf entfernt haben, kann ich ehrlich gesagt dennoch nicht ganz so viel Begeisterung dafür entwickeln. Was wohl auch an meinen schrecklichen Erfahrungen mit graphischen Editoren für flussgesteurte Systeme liegt.</p>
<p><strong>Feature Toggeling</strong></p>
<p>Mit Feature Toggels schaltet man vor, beim oder nach dem Release Features aus bzw. ein. Dabei handelt es sich in aller Regel um modifizierte If-Statements die jeweils den Abarbeitungspfad ändern.</p>
<p>Hier habe ich still in meiner Ecke gesessen weil ich einfach nicht mitreden konnte. Ich bin Desktopentwickler und unsere einmonatigen Releasezyklen haben wir uns vor allem deshalb auferlegt um schnell fest zu stellen wenn es irgendwo hakt. Für mich war die Diskussion aus einem anderen Grund interessant: Sie erlaubte einen Einblick in die Arbeitsweise mit sehr kurzen Releasezyklen und den damit verbundenen Problemen aber auch Vorteilen.</p>
<p><strong>Bash Microsoft<br />
</strong></p>
<p>Wie beschreibt man so etwas für Leute die nicht da waren? Sagen wir mal so: Die beiden Microsoft Evangelisten haben mit Sternburg Export ausgerechnet das Bier ausgegeben was ich in dem Zusammenhang eher mit SEHR fußballbegeisterten Mitbürgern in Verbindung bringen würde, die sich gerade beim Heimspiel gegen ihren verhassten Erzrivalen befinden. Ob sie das beabsichtigen weiß ich nicht, ich weiß aber auch nicht was sie mit der gesamten Diskussion bezweckten.</p>
<p>Natürlich ist es verständlich, dass sie uns Entwicklern die Firma und ihre Produkte näher bringen wollen. Aber aus meiner Sicht kann es lediglich der Unterhaltung der Anwesenden gedient haben als des ernsthaften Informationsaustausches. Und so wurden die beiden von der geballten Kompetenz der .Net-Community auseinander genommen ohne, dass es am Ende ernsthaft neue Erkenntnisse gegeben hätte.</p>
<p>Dank des Biers und Popcorns war die Situation aber dermaßen schräg, dass ich mich die ganze Zeit in einer Sitcom wähnte und unterbewusst auf die eingespielten Lacher wartete. Wobei diese gar nicht nötig waren weil sich der Humorlevel konstant auf hohem Niveau befand.</p>
<p><strong>Fazit</strong></p>
<p>Zusammenfassend lässt sich also noch einmal sagen: Die Organisation war klasse, der Spaßfaktor riesig und nächstes Jahr werde ich versuchen wirklich 2 Tage da zu sein. Vielleicht gewinne ich dann auch mal was…</p>
<div class="printfriendly alignright"><a href="http://www.just-about.net/netopenspace-2011?pfstyle=wp" rel="nofollow" ><span class="printfriendly-text"></span></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.just-about.net/netopenspace-2011/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

