<?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>Gojko Adzic &#187; workshop</title>
	<atom:link href="http://gojko.net/tag/workshop/feed/" rel="self" type="application/rss+xml" />
	<link>http://gojko.net</link>
	<description>Building software that matters</description>
	<lastBuildDate>Wed, 04 Aug 2010 11:38:56 +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>Effective .NET Test Driven Development with FitNesse &#8212; Workshop video</title>
		<link>http://gojko.net/2008/04/02/fitnesse-workshop-video/</link>
		<comments>http://gojko.net/2008/04/02/fitnesse-workshop-video/#comments</comments>
		<pubDate>Wed, 02 Apr 2008 15:15:58 +0000</pubDate>
		<dc:creator>gojko</dc:creator>
				<category><![CDATA[fitnesse]]></category>
		<category><![CDATA[presentations]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[acceptance testing]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[skills matter]]></category>
		<category><![CDATA[workshop]]></category>

		<guid isPermaLink="false">http://gojko.net/2008/04/02/fitnesse-workshop-video/</guid>
		<description><![CDATA[Here&#8217;s the video from last week&#8217;s Effective .NET Test Driven Development FitNesse workshop. The workshop focused on introducing agile acceptance testing and working with FitNesse, with best practices and ideas how to use fixtures efficiently. The recording is about two hours long. See also: Key ideas from the workshop Source code and the missing example]]></description>
			<content:encoded><![CDATA[<div style="float:right; border:1px solid black; margin:5px 5px 5px 5px;"><embed style="width:400px; height:326px;" id="VideoPlayback" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=35333892606601234&#038;hl=en-GB" flashvars=""></embed></div>
<p>Here&#8217;s the video from last week&#8217;s <a target="_blank" href="http://www.skillsmatter.com/event/open-source-dot-net/ffective-dot-net-tdd-with-fitnesse">Effective .NET Test Driven Development FitNesse</a> workshop. The workshop focused on introducing agile acceptance testing and working with FitNesse, with best practices and ideas how to use fixtures efficiently. The recording is about two hours long.<br />
See also:</p>
<ul>
<li>
<a href="http://gojko.net/2008/03/28/fitnesse-workshop-mdash-key-ideas/">Key ideas from the workshop</a>
</li>
<li>
<a href="http://gojko.net/2008/03/29/fitnesse-workshop-%e2%80%94-source-code-and-missing-example/">Source code and the missing example</a>
</li>
</ul>
<p><br clear="all" /></p>
]]></content:encoded>
			<wfw:commentRss>http://gojko.net/2008/04/02/fitnesse-workshop-video/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>FitNesse Workshop — source code and missing example</title>
		<link>http://gojko.net/2008/03/29/fitnesse-workshop-%e2%80%94-source-code-and-missing-example/</link>
		<comments>http://gojko.net/2008/03/29/fitnesse-workshop-%e2%80%94-source-code-and-missing-example/#comments</comments>
		<pubDate>Sat, 29 Mar 2008 04:52:22 +0000</pubDate>
		<dc:creator>gojko</dc:creator>
				<category><![CDATA[fitnesse]]></category>
		<category><![CDATA[presentations]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[acceptance testing]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[skills matter]]></category>
		<category><![CDATA[workshop]]></category>

		<guid isPermaLink="false">http://gojko.net/2008/03/29/fitnesse-workshop-%e2%80%94-source-code-and-missing-example/</guid>
		<description><![CDATA[You can download the complete sourcecode for the examples from the SkillsMatter FitNesse workshop from here. Grab the related fitNesse tests from here. For a list of key ideas to take away from the session, click here. Unfortunately, we did not have enough time to finish the example of integrating entity classes into FitNesse for [...]]]></description>
			<content:encoded><![CDATA[<p>You can download the complete sourcecode for the examples from the SkillsMatter FitNesse workshop from <a href="http://gojko.net/FitNesse/smworkshopsource.zip">here</a>. Grab the related fitNesse tests from  <a href="http://gojko.net/FitNesse/smworkshopfitn.zip">here</a>. For a list of key ideas to take away from the session, click <a href="http://gojko.net/2008/03/28/fitnesse-workshop-mdash-key-ideas/">here</a>.</p>
<p>Unfortunately, we did not have enough time to finish the example of integrating entity classes into FitNesse for .NET during the  workshop. So here is the implementation:<span id="more-111"></span></p>
<h2>Integrating FitNesse with Entity objects</h2>
<p>Unlike value classes, where we can add a <code>Parse</code> method without any consequences, for entity classes the situation is not that simple. Entity objects cannot be easily &#8220;parsed&#8221; from a string, but there will typically be a way to find or create entities based on the description that will appear in FIT tables. Of course, the entity class, which is part of the business model, should not depend in any way on FIT classes. The dependency should work the other way round. </p>
<p>A solution that does not require any changes to the entity class code is to implement a cell handler for the entity type. Cell handlers tell FIT how to process the cells, and they are selected by cell text format and underlying object type. In this case, we just create a cell handler by extending <code>AbstractCellHandler</code> for the entity type and override the <code>Parse</code> method. That method should then execute the appropriate finder. </p>
<blockquote>
<pre>
public class PlayerCellHandler : fitnesse.handlers.AbstractCellHandler
{

        public override bool Match(string searchString, Type type)
        {

            return typeof(Player).Equals(type);
        }
        public override object Parse(Fixture theFixture, Parse theCell,
           TypeAdapter theAdapter, object theTarget) {
            return Player.FindByName(theCell.Text);
        }
}
</pre>
</blockquote>
<p>Unline the <code>Parse</code> method in the value class, the handler does not work automatically, it has to be activated using the <code>CellHandlerLoader</code> table (release 1.5 allows you to do this from a configuration file as well). If you want to use it in FitLibrary fixtures, then  specify <code>fitlibrary</code> as the second argument to the <code>load</code> command. Here  is how everything works together:</p>
<blockquote>
<pre>
!|roulette3.PlayerStory|

!|CellHandlerLoader|
|load|roulette3.PlayerCellHandler|fitlibrary|

|Player|John|places|10|chips on|20|

|Player|Paul|places|20|chips on|11|
</pre>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://gojko.net/2008/03/29/fitnesse-workshop-%e2%80%94-source-code-and-missing-example/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>FitNesse Workshop &#8212; key ideas</title>
		<link>http://gojko.net/2008/03/28/fitnesse-workshop-mdash-key-ideas/</link>
		<comments>http://gojko.net/2008/03/28/fitnesse-workshop-mdash-key-ideas/#comments</comments>
		<pubDate>Fri, 28 Mar 2008 05:27:17 +0000</pubDate>
		<dc:creator>gojko</dc:creator>
				<category><![CDATA[fitnesse]]></category>
		<category><![CDATA[presentations]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[acceptance testing]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[skills matter]]></category>
		<category><![CDATA[workshop]]></category>

		<guid isPermaLink="false">http://gojko.net/2008/03/28/fitnesse-workshop-mdash-key-ideas/</guid>
		<description><![CDATA[First of all, here is a big thank you to everyone who attended the FitNesse workshop at skillsmatter today. It was a real pleasure to do the session and I hope that you learned a few new tricks. Here are the key ideas to take away: Agile acceptance testing It&#8217;s not about testing at all [...]]]></description>
			<content:encoded><![CDATA[<p>First of all, here is a big thank you to everyone who attended the FitNesse workshop at <a href="http://www.skillsmatter.com/" target="_blank">skillsmatter</a> today. It was a real pleasure to do the session and I hope that you learned a few new tricks. Here are the key ideas to take away:<span id="more-110"></span></p>
<h2>Agile acceptance testing</h2>
<ul>
<li>It&#8217;s not about testing at all &mdash; it is more about flushing out enough examples before development, and using those examples as a target for work.</li>
<li>It&#8217;s about building a shared understanding and making sure that everyone on the project has the same target in their minds</li>
<li>User stories are the scope for development, (acceptance) story tests are the specifications.</li>
<li>Business people, developers and QA all have different things on their mind, and view the system from different angles. Get them all to work together to produce the best results. Business people will have a better overview of the domain, developers will spot inconsistencies and QA engineers will suggest edge cases that should be verified. </li>
<li><a href="http://www.jamesshore.com/Blog/How-I-Use-Fit.html" target="_blank">Describe-Demonstrate-Develop</a> is a great way to think about the whole process</li>
<li>Unit tests and acceptance tests complement each-other. &#8220;<i>xUnit insures the code is built right, and FitNesse insures the right code is built.</i>&#8221; <a href="http://tech.groups.yahoo.com/group/fitnesse/message/9752" target="_blank">(Andrew Dassing on FitNesse Mailing list)</a></li>
</ul>
<h2>FIT/FitNesse</h2>
<ul>
<li>Tables describe tests &mdash; both inputs and expected outcomes</li>
<li>FitNesse allows you to manage and execute tests easier, build test suites and organise the tests. </li>
<li>FitNesse stores tests into text files, and they can be easily stored in the same version control system as the code. Folder-based systems like SVN might have some issues with refactoring, so don&#8217;t use FitNesse refactoring when you keep files in Subversion. Also, turn off automatic archiving and property updates (<code>-e 0 -o</code>)</li>
</ul>
<h2>Writing FitNesse tests</h2>
<ul>
<li>Start by identifying and analysing the business rules.</li>
<li>For each rule, roughly decide whether it is more like a tabular calculation rule or a story.</li>
<li>For tabular calculation rules, use <a href="http://www.fitnesse.info/fixturegallery:basicfitfixtures:columnfixture">ColumnFixture</a> and <a href="http://www.fitnesse.info/fixturegallery:fitlibraryfixtures:calculatefixture">CalculateFixture</a></li>
<li>For story-like rules, use <a href="http://www.fitnesse.info/fixturegallery:fitlibraryfixtures:dofixture">DoFixture</a> and <a href="http://www.fitnesse.info/fixturegallery:fitlibraryfixtures:sequencefixture">SequenceFixture</a>. Those fixtures can work in <a href="http://www.fitnesse.info/fixturegallery:importantconcepts:flowmode">Flow mode</a> and coordinate other fixtures as well.</li>
<li>Symbols work with FitLibrary in .NET as well, but you have to add this table to the page:<br />
<blockquote>
<pre>
!|Cell Handler Loader|
|load|SymbolSaveHandler|FitLibrary|
|load|SymbolRecallHandler|FitLibrary|
</pre>
</blockquote>
</li>
</ul>
<h2>Writing Fixtures</h2>
<ul>
<li>Fixtures are a very thin integration layer.</li>
<li>Use a <code>public static Parse(string)</code> method to allow FitNesse to automatically bind your domain types to table cells</li>
<li>.NET  version supports <a href="http://www.fitnesse.info/fixturegallery:importantconcepts:targetobject">Target objects</a> that can save a lot of code by not requiring you to re-declare the DTO properties in fixtures.</li>
<li><i>Alternating Target Object pattern</i>: use the first column to initialise the target object. All other columns are bound to the target object. Use <code>Reset()</code> to clean up after a row is executed.<br />
<blockquote>
<pre>
!|Bet placement and payouts|
|fields|bet name?|payoff?|
|30|Straight Up|35|
|11,14|Split Bet|17|
|19,20,21|Street Bet|11|
|25,26,28,29|Corner Bet|8|
|Red|Red Or Black|1|
|3rd 12|Dozen|2|
</pre>
</blockquote>
<blockquote>
<pre>
public class BetPlacementAndPayouts:fit.ColumnFixture
    {
        public Bet fields;
        public override void Reset()
        {
            fields = null;
        }
        public override object GetTargetObject()
        {
            if (fields == null) return this;
            return fields;
        }
}
</pre>
</blockquote>
</li>
<li>Use the <a target="_blank" href="http://www.fitnesse.info/fixturegallery:fitlibraryfixtures:setupfixture">SetUpFixture</a> instead of ColumnFixture to prepare the data or create new objects</li>
<li>Use the <a target="_blank" href="http://www.fitnesse.info/fixturegallery:importantconcepts:systemundertest">System Under Test</a> feature of DoFixture and SequenceFixture to bind tables directly to your business services and classes</li>
</ul>
<p><b>Update: <a href="http://gojko.net/2008/03/29/fitnesse-workshop-%e2%80%94-source-code-and-missing-example/">Download the source code and the missing example</a></b></p>
]]></content:encoded>
			<wfw:commentRss>http://gojko.net/2008/03/28/fitnesse-workshop-mdash-key-ideas/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>FitNesse.NET workshop in London</title>
		<link>http://gojko.net/2008/02/27/fitnessenet-workshop-in-london/</link>
		<comments>http://gojko.net/2008/02/27/fitnessenet-workshop-in-london/#comments</comments>
		<pubDate>Wed, 27 Feb 2008 21:35:49 +0000</pubDate>
		<dc:creator>gojko</dc:creator>
				<category><![CDATA[fitnesse]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[acceptance testing]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[skills matter]]></category>
		<category><![CDATA[workshop]]></category>

		<guid isPermaLink="false">http://gojko.net/2008/02/27/fitnessenet-workshop-in-london/</guid>
		<description><![CDATA[If you live in or near London, come down to Skills Matter on March 27th for an intensive two hour FitNesse workshop to share experiences and discuss best practices. Participation is free (I think that upfront registration is required). See http://skillsmatter.com/net-tdd-fitnesse/pcd/5013 for more details.]]></description>
			<content:encoded><![CDATA[<p>If you live in or near London, come down to Skills Matter on March 27th for an intensive two hour FitNesse workshop to share experiences and discuss best practices. Participation is free (I think that upfront registration is required).</p>
<p>See <a href='http://skillsmatter.com/net-tdd-fitnesse/pcd/5013'>http://skillsmatter.com/net-tdd-fitnesse/pcd/5013</a> for more details.</p>
]]></content:encoded>
			<wfw:commentRss>http://gojko.net/2008/02/27/fitnessenet-workshop-in-london/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
