<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>codeweavers.net Developers</title>
	<atom:link href="http://codeweavers.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://codeweavers.wordpress.com</link>
	<description>Developers&#039; Blog</description>
	<lastBuildDate>Sat, 21 Jan 2012 22:51:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='codeweavers.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>codeweavers.net Developers</title>
		<link>http://codeweavers.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://codeweavers.wordpress.com/osd.xml" title="codeweavers.net Developers" />
	<atom:link rel='hub' href='http://codeweavers.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Write Unit Tests? Start deleting them.</title>
		<link>http://codeweavers.wordpress.com/2012/01/21/write-unit-tests-start-deleting-them/</link>
		<comments>http://codeweavers.wordpress.com/2012/01/21/write-unit-tests-start-deleting-them/#comments</comments>
		<pubDate>Sat, 21 Jan 2012 20:12:12 +0000</pubDate>
		<dc:creator>Shaun Finglas</dc:creator>
				<category><![CDATA[TDD]]></category>
		<category><![CDATA[refactoring]]></category>
		<category><![CDATA[unit testing]]></category>

		<guid isPermaLink="false">http://codeweavers.wordpress.com/?p=1167</guid>
		<description><![CDATA[A recent blog post by Steve Klabnik concluded with a statement about tossing unit tests if you have end to end tests covering the code in question. Don&#8217;t be afraid to change the tests! As soon as you&#8217;ve verified that &#8230; <a href="http://codeweavers.wordpress.com/2012/01/21/write-unit-tests-start-deleting-them/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeweavers.wordpress.com&amp;blog=11842070&amp;post=1167&amp;subd=codeweavers&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>A recent <a href="http://blog.steveklabnik.com/posts/2011-09-22-extracting-domain-models-a-practical-example">blog post by Steve Klabnik</a> concluded with a statement about tossing unit tests if you have end to end tests covering the code in question. </p>
<blockquote><p>
Don&#8217;t be afraid to change the tests! As soon as you&#8217;ve verified that you&#8217;ve transcribed the code correctly, don&#8217;t be afraid to just nuke things and start again. Especially if you have integration level tests that confirm that your features actually work, your unit tests are expendable. If they&#8217;re not useful, kill them!</p></blockquote>
<p>A few people on Twitter found this odd, and I&#8217;d have included myself in this statement a while back.</p>
<blockquote class='twitter-tweet'><p>@<a href="https://twitter.com/isaacsanders">isaacsanders</a> @<a href="https://twitter.com/avdi">avdi</a> seeing @<a href="https://twitter.com/KentBeck">KentBeck</a> delete unit tests during his screencasts changed my TDD process forever.&mdash; <br />Shaun Finglas (@F1nglas) <a href='http://twitter.com/#!/F1nglas/status/160776765353111552' data-datetime='2012-01-21T17:32:22+00:00'>January 21, 2012</a></p></blockquote>
<p><a href="http://pragprog.com/screencasts/v-kbtdd/test-driven-development">Kent Beck&#8217;s TDD screencasts</a> changed my view on deleting unit tests however. During the later videos, he actually deleted some tests. Pretty much all TDD resources don&#8217;t really mention this. One of the key points beginners learn is that if you break any tests, you&#8217;ve introduced a regression. This is not always the case. If you follow the rule of never deleting ANY tests you encounter you are going to be stuck with someone else&#8217;s implementation forever. Likewise unit tests are there to drive design, not enforce how something works. I remember discussing deleting unit tests with my work  colleagues and finding Kent&#8217;s videos pretty shocking at the time. I mean deleting unit tests!?</p>
<p>The more I do TDD, the less this statement becomes so jarring. For example.</p>
<p><pre class="brush: csharp;">
public Result DoSomething()
{
    // Implementation here.
    // Pretty straightforward.
    return result;
}
</pre></p>
<p>Consider a test for the above behavior, such as we get the result back in a particular state. Pretend the logic is rather simple, and it does not warrant a separate object. Any other developer should be free to come along and change the internals of this method. As long as we get a result back in the correct state, the test should be valid. The test should not care that we are using strings, lists or whatever internally. </p>
<p>Occasionally I find tests like this hard to pass. In other words, I feel like the logic is correct yet the test fails. Maybe I&#8217;m using a new language feature, or a language feature that seems to be not working as I expected. If so I&#8217;ll break out a new unit test that tests the implementation. Such tests are often refereed to as <a href="http://blog.thecodewhisperer.com/2011/12/14/when-to-write-learning-tests/">learning tests</a>. Here with a smaller focus I often become aware of what I&#8217;m doing wrong. Following Kent Becks example, I ditch the test after and move on. </p>
<p>I feel this sums up my feelings nicely.</p>
<blockquote class='twitter-tweet'><p>@<a href="https://twitter.com/elliottcable">elliottcable</a> @<a href="https://twitter.com/F1nglas">F1nglas</a> @<a href="https://twitter.com/isaacsanders">isaacsanders</a> @<a href="https://twitter.com/kentbeck">kentbeck</a> let them guide you to a design but don&#039;t let them hold you to a design.&mdash; <br />Avdi Grimm (@avdi) <a href='http://twitter.com/#!/avdi/status/160780747827974145' data-datetime='2012-01-21T17:48:12+00:00'>January 21, 2012</a></p></blockquote>
<p>I and others are not saying bin every unit test you have that is covered by end to end tests. Unit tests are great, you can run hundreds in a matter of seconds. They have their place as part of the development process, but do not find yourself working against them. However I am saying you should delete any test which relies on implementation details. I am saying bin any test which does not make sense. I am also saying bin tests as part of a refactoring session as long as you have test coverage higher up. If you don&#8217;t have test coverage such as acceptance tests, you cannot be sure you have not broke anything after the refactor.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codeweavers.wordpress.com/1167/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codeweavers.wordpress.com/1167/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codeweavers.wordpress.com/1167/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codeweavers.wordpress.com/1167/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/codeweavers.wordpress.com/1167/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/codeweavers.wordpress.com/1167/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/codeweavers.wordpress.com/1167/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/codeweavers.wordpress.com/1167/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codeweavers.wordpress.com/1167/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codeweavers.wordpress.com/1167/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codeweavers.wordpress.com/1167/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codeweavers.wordpress.com/1167/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codeweavers.wordpress.com/1167/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codeweavers.wordpress.com/1167/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeweavers.wordpress.com&amp;blog=11842070&amp;post=1167&amp;subd=codeweavers&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://codeweavers.wordpress.com/2012/01/21/write-unit-tests-start-deleting-them/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1ad37fda093fd5c84db8d9beeb36f5e0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">shaunfinglas</media:title>
		</media:content>
	</item>
		<item>
		<title>LOG EVERYTHING</title>
		<link>http://codeweavers.wordpress.com/2012/01/20/log-everything/</link>
		<comments>http://codeweavers.wordpress.com/2012/01/20/log-everything/#comments</comments>
		<pubDate>Fri, 20 Jan 2012 13:47:28 +0000</pubDate>
		<dc:creator>Shaun Finglas</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[retrospective]]></category>
		<category><![CDATA[debugging]]></category>
		<category><![CDATA[logging]]></category>

		<guid isPermaLink="false">http://codeweavers.wordpress.com/?p=1142</guid>
		<description><![CDATA[This post was originally conceived back in mid 2011, starting a new project made me think back to this event, hence the post. Any developer worth their salt will know what logging is. You could argue there are two types &#8230; <a href="http://codeweavers.wordpress.com/2012/01/20/log-everything/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeweavers.wordpress.com&amp;blog=11842070&amp;post=1142&amp;subd=codeweavers&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><em>This post was originally conceived back in mid 2011, starting a new project made me think back to this event, hence the post.</em></p>
<p><img src="http://i.imgur.com/R7VD4.png" alt="Printf all the things" title="The best debugging technique" style="float:right;width:40%;height:40%;padding:20px;"></p>
<p>Any developer worth their salt will know what logging is. You could argue there are two types of logging, either developer logging or auditing. Developer logging would be what we log when something goes wrong. Using the results of this logging we can track down what went wrong, and put fixes in place to stop this event from occurring again. If this logging fails, or logs the incorrect thing it is not the end of the world. Due to this, I generally do not care for testing such scenarios. The code should behave the same with our without this logging.</p>
<p>Auditing would come under logging which as part of the application needs to be carried out at all times. Consider visiting a cash machine. When withdrawing fifty pounds, you want to make sure your bank logs this in case anything goes wrong. This sort of logging is crucial, and must work and must log the correct data. This is considered a feature, therefore this should be tested as it is part of the behavior of the application.</p>
<p>When I think back to my first few years of programming my code was littered with logging. In the early days after each statement, variable and function I would print out what happened, along with any errors that happened. In fact I&#8217;d say that everyone starts out like this. The strange thing is as we get better, the logging becomes less and less. Rather than the first class citizen we relied on in the early days, logging is seen as boring. The problem with treating logging code as a second class citizen is that when things go wrong, it can be very difficult or near impossible to track down what has happened. When you realise you need logging, its often too late. You will need to redeploy the application and wait for the problem to expose itself again.</p>
<p>Back in 2011 we had a difficult problem to track down. The dreaded &#8220;<code>OutOfMemoryException</code>&#8220;. Being the cocky developers we were, we decided to add the logging last. After all, it was there for when things went wrong. We never planned things would go wrong, after all it &#8220;<em>worked on my machine</em>&#8220;. After redeploying the application with logging we managed to track down roughly what was going wrong, and in turn began to resolve the problem. Had we added this logging initially, we could have resolved this problem in half the time.</p>
<p>The lesson I learned here was simple. Any time you have an error, log it. If the logging is not in place, we add it. Creating a new application? In the first iteration(s) make sure some form of logging is in place. I believe by following this simple rule any future issues can be handled easier. Logging should be a first class citizen regardless of purpose.</p>
<p><em>Around the same day I had this revelation, the image above popped into my Twitter feed. Image via <a href="https://twitter.com/#!/olafurw">@olafurw</a></em></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codeweavers.wordpress.com/1142/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codeweavers.wordpress.com/1142/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codeweavers.wordpress.com/1142/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codeweavers.wordpress.com/1142/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/codeweavers.wordpress.com/1142/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/codeweavers.wordpress.com/1142/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/codeweavers.wordpress.com/1142/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/codeweavers.wordpress.com/1142/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codeweavers.wordpress.com/1142/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codeweavers.wordpress.com/1142/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codeweavers.wordpress.com/1142/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codeweavers.wordpress.com/1142/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codeweavers.wordpress.com/1142/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codeweavers.wordpress.com/1142/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeweavers.wordpress.com&amp;blog=11842070&amp;post=1142&amp;subd=codeweavers&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://codeweavers.wordpress.com/2012/01/20/log-everything/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1ad37fda093fd5c84db8d9beeb36f5e0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">shaunfinglas</media:title>
		</media:content>

		<media:content url="http://i.imgur.com/R7VD4.png" medium="image">
			<media:title type="html">The best debugging technique</media:title>
		</media:content>
	</item>
		<item>
		<title>6 Ways To Speed up Selenium Tests</title>
		<link>http://codeweavers.wordpress.com/2011/12/19/6-ways-to-speed-up-selenium-tests/</link>
		<comments>http://codeweavers.wordpress.com/2011/12/19/6-ways-to-speed-up-selenium-tests/#comments</comments>
		<pubDate>Mon, 19 Dec 2011 09:57:33 +0000</pubDate>
		<dc:creator>Shaun Finglas</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Experiences]]></category>
		<category><![CDATA[Process Updates]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[acceptance]]></category>
		<category><![CDATA[IIS]]></category>
		<category><![CDATA[regression]]></category>
		<category><![CDATA[selenium webdriver]]></category>

		<guid isPermaLink="false">http://codeweavers.wordpress.com/?p=1059</guid>
		<description><![CDATA[Having finally achieved more stable end to end tests via Selenium, we figured it would be worth while sharing how we achieved this. The following are six steps we&#8217;ve found that you can do to make Selenium tests more stable. &#8230; <a href="http://codeweavers.wordpress.com/2011/12/19/6-ways-to-speed-up-selenium-tests/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeweavers.wordpress.com&amp;blog=11842070&amp;post=1059&amp;subd=codeweavers&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://wp.me/pNGF8-gW">Having finally achieved more stable end to end tests</a> via Selenium, we figured it would be worth while sharing how we achieved this. The following are six steps we&#8217;ve found that you can do to make Selenium tests more stable.</p>
<ol>
<li>Turn off automatic updates for your browser/plugins</li>
<li>Set your IIS (or equivalent) app timeouts to zero</li>
<li>Create a base Selenium Fixture for use in your tests</li>
<li>Update to the latest version of Selenium</li>
<li>Warm up your apps prior to testing</li>
<li>Ditch Selenium &#8211; test at the API level</li>
</ol>
<p>Turning off automatic updates seems like a no brainer, but after a fresh install we forgot to do this once and spent some time figuring out why Firefox would not load on the CI server. It turns out that the &#8220;You&#8217;ve just updated&#8221; window was blocking the test from continuing as it had stole focus.</p>
<p>The second point is with regards caching and the general responsiveness of your application. We have a few applications that take about thirty seconds to fully warm up due to the huge data set they rely on. If we can build this cache once, then store it for as long as possible, subsequent hits to the app should be instant. In other words, we try to mirror our live environment as much as possible.</p>
<p>Our custom test fixture attribute enables the ability to modify all Selenium tests in one go. We found that from 3am to 5am our databases undergo maintenance, therefore we do not run our regression tests during this time. All this took was one change within the attribute to apply to all tests. For example:</p>
<p><pre class="brush: csharp;">
public class RegressionTestFixture : TestFixtureAttribute
{
    public RegressionTestFixture()
    {
        Category = &quot;Regression&quot;;        
        OnlyRunTestsWhenDatabaseIsActive();
        // Etc...
    }
}
</pre></p>
<p>We simply inherit from <a href="http://www.nunit.org/index.php?p=testFixture&amp;r=2.5.10">NUnit&#8217;s TestFixtureAttribute</a> and use this custom attribute rather than the standard TestFixture attribute. The inheritance is required to ensure that third party tools such as test runners still work as expected.</p>
<p>Previously we were using Selenium 1.x with Sauce RC. Having ditched this and <a href="http://seleniumhq.org/docs/appendix_migrating_from_rc_to_webdriver.html#migrating-to-webdriver-reference">upgraded to Selenium 2.x</a> we&#8217;ve been able to update our browsers to the latest versions, in turn this allows improved speed and stability when runing the tests.</p>
<p>On our local development machines the application you are working on is often in memory, meaning subsequent hits should be much faster after all dependencies are loaded and cached. The issue we discovered on our CI server was that after a fresh build of the whole codebase, the initial hits to the applications would be very slow. To combat this we added a warm up step to our build. Just before the tests are run we would perform a HTTP GET to invoke our applications start up processes. This added somewhere in the region of thirty seconds to the build, but the increase in stability is staggering. No longer will Selenium report timeouts.</p>
<p>Finally the fastest end to end tests come from not using Selenium. Ditching the browser completely and testing as high up in your API is the quickest, and most stable solution. Combining this thinking, with a handful of dumb Selenium tests that just check for the likes of 404s seems to be the most optimal solution currently.</p>
<p>Having done these at some point over the past few months we&#8217;re starting to get to a more stable point with our Selenium tests. We&#8217;ll be looking to take this forward with future tests and hope to enjoy continued stability.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codeweavers.wordpress.com/1059/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codeweavers.wordpress.com/1059/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codeweavers.wordpress.com/1059/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codeweavers.wordpress.com/1059/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/codeweavers.wordpress.com/1059/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/codeweavers.wordpress.com/1059/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/codeweavers.wordpress.com/1059/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/codeweavers.wordpress.com/1059/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codeweavers.wordpress.com/1059/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codeweavers.wordpress.com/1059/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codeweavers.wordpress.com/1059/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codeweavers.wordpress.com/1059/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codeweavers.wordpress.com/1059/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codeweavers.wordpress.com/1059/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeweavers.wordpress.com&amp;blog=11842070&amp;post=1059&amp;subd=codeweavers&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://codeweavers.wordpress.com/2011/12/19/6-ways-to-speed-up-selenium-tests/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1ad37fda093fd5c84db8d9beeb36f5e0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">shaunfinglas</media:title>
		</media:content>
	</item>
		<item>
		<title>How to Achieve More Stable End to End Tests</title>
		<link>http://codeweavers.wordpress.com/2011/12/19/how-to-achieve-more-stable-end-to-end-tests/</link>
		<comments>http://codeweavers.wordpress.com/2011/12/19/how-to-achieve-more-stable-end-to-end-tests/#comments</comments>
		<pubDate>Mon, 19 Dec 2011 09:56:50 +0000</pubDate>
		<dc:creator>Shaun Finglas</dc:creator>
				<category><![CDATA[Experiences]]></category>
		<category><![CDATA[Information]]></category>
		<category><![CDATA[Process Updates]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[acceptance testing]]></category>
		<category><![CDATA[regression testing]]></category>
		<category><![CDATA[selenium webdriver]]></category>

		<guid isPermaLink="false">http://codeweavers.wordpress.com/?p=1050</guid>
		<description><![CDATA[Recently myself and another colleague wrote an acceptance test for a feature that had yet to be implemented. For this end to end test we used Selenium, after all we wanted to test the whole feature so this made sense. &#8230; <a href="http://codeweavers.wordpress.com/2011/12/19/how-to-achieve-more-stable-end-to-end-tests/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeweavers.wordpress.com&amp;blog=11842070&amp;post=1050&amp;subd=codeweavers&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><img src="http://farm4.staticflickr.com/3664/3623114929_f46deae6e9_m.jpg" alt="iceberg" style="float:right;padding:15px;" title="The UI should mirror the tip of an iceberg. Most of your logic should be hidden behind the scenes, with your UI as thin as possible." /></p>
<p>Recently myself and another colleague wrote an <a href="http://en.wikipedia.org/wiki/Acceptance_testing">acceptance test</a> for a feature that had yet to be implemented. For this end to end test we used <a href="http://seleniumhq.org/">Selenium</a>, after all we wanted to test the whole feature so this made sense. Our test performed some simple user input, performed a calculation and checked the response. The problem with the test was it was very brittle. If the application had not recently been used, the massive data set the application relied on would not be cached.</p>
<p>To get around this we added a few <a href="http://msdn.microsoft.com/en-us/library/d00bd51t.aspx">Thread.Sleep()</a> statements into the test. This worked rather well for the majority of test runs, but sometimes these pauses were not long enough. On the other hand sometimes the data was cached, meaning these sleeps would be unnecessary. One resource which has recently done the rounds was regarding useful <a href="http://www.bonitasoft.org/blog/tutorial/how-to-get-faster-selenium-test-cases-execution/">advice about using WaitForPageLoad() and WaitForCondition()</a>. WaitForCondition will only execute once a condition has been met, such as a element becoming visible. This meant that for the times when the dataset was in memory the test would be executed immediately, while the times when the data was being loaded, the test would simply wait until the test was ready to move on. This was a very simple, yet highly effective tweak to our tests. The execution time went from roughly thirty seconds, to just less than ten seconds in one case.</p>
<p>This was not the end of the battle to achieve more stable Selenium tests. Some of our tests were still rather flaky. Some mornings we would enter work, notice the red build and discover that the several failed tests were down to Selenium timeouts. During the daytime however, we rarely had these issues. In order to fix these problems I increased the frequency of builds. The idea being the more we run our builds the more chance we have of spotting the errors. After all, if something was to fail at 2am, I am unlikely to care. 2pm however, and the team will be all over it. By making the problem more visible, we would be forced to fix the outstanding issues.</p>
<p>The aim was to make the tests as fast as possible, while maintaining stability. One thing the excellent <a href="http://www.amazon.co.uk/Growing-Object-Oriented-Software-Guided-Signature/dp/0321503627">Growing Object-Oriented Software (Goos)</a> touches on is the aspect of not needing to perform end to end testing at the GUI all the time. The benefit of not touching the UI is huge. Your tests are faster, they&#8217;re more stable and a heck of lot easier to write. The other nice benefit of testing from an API point of view, rather than the browser is it forces you to decouple your app from the views. If you&#8217;re not writing <a href="http://weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model">fat models and skinny controllers</a>, you&#8217;ll have adapt in order to test as much of your application as possible without hitting the UI.</p>
<p>What about the remaining part of your feature that is not covered by the application? I like to imagine this part as the tip of an iceberg. As this area is small enough the actual UI testing you need should be minimal. So here we can let Selenium do what it is good at. Click things. Selenium is great at this. All you need to do at this level is check for 404s, incorrect page titles and a few other mundane aspects of the UI. There should be no need to check if your actual application is correct at this level. For correctness, you should have a large suite of fast, isolated, unit tests. </p>
<p>Another point to consider is how often your view actually changes, in comparison to your actual underlying API. A designer should be free to move things, rename content, add images and so forth without breaking tests. As long as there is a calculate button somewhere on the page, and said button takes you to a result page, who cares about everything else? Likewise the code underneath can be consistently changing behind the scenes, as long as the API remains constant, our tests should always be valid.</p>
<p><em>For the technical low down on some of the ways we are achieving more stable end to end tests, check out <a href="http://wp.me/pNGF8-h5">six tips to speed up Selenium tests</a>.</em></p>
<p><em>Image courtesty of <a href="http://www.flickr.com/photos/natalielucier/3623114929/">Natalie Lucier</a></em></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codeweavers.wordpress.com/1050/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codeweavers.wordpress.com/1050/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codeweavers.wordpress.com/1050/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codeweavers.wordpress.com/1050/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/codeweavers.wordpress.com/1050/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/codeweavers.wordpress.com/1050/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/codeweavers.wordpress.com/1050/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/codeweavers.wordpress.com/1050/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codeweavers.wordpress.com/1050/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codeweavers.wordpress.com/1050/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codeweavers.wordpress.com/1050/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codeweavers.wordpress.com/1050/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codeweavers.wordpress.com/1050/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codeweavers.wordpress.com/1050/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeweavers.wordpress.com&amp;blog=11842070&amp;post=1050&amp;subd=codeweavers&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://codeweavers.wordpress.com/2011/12/19/how-to-achieve-more-stable-end-to-end-tests/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1ad37fda093fd5c84db8d9beeb36f5e0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">shaunfinglas</media:title>
		</media:content>

		<media:content url="http://farm4.staticflickr.com/3664/3623114929_f46deae6e9_m.jpg" medium="image">
			<media:title type="html">The UI should mirror the tip of an iceberg. Most of your logic should be hidden behind the scenes, with your UI as thin as possible.</media:title>
		</media:content>
	</item>
		<item>
		<title>Postcode District Kata</title>
		<link>http://codeweavers.wordpress.com/2011/11/18/postcode-district-kata/</link>
		<comments>http://codeweavers.wordpress.com/2011/11/18/postcode-district-kata/#comments</comments>
		<pubDate>Fri, 18 Nov 2011 13:44:05 +0000</pubDate>
		<dc:creator>Shaun Finglas</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Kata]]></category>
		<category><![CDATA[challenge]]></category>
		<category><![CDATA[Dojo]]></category>
		<category><![CDATA[program challenge]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[programming contest]]></category>

		<guid isPermaLink="false">http://codeweavers.wordpress.com/?p=995</guid>
		<description><![CDATA[We&#8217;ve recently had a task of importing some new data to one of our insurance related applications. Without boring you with the technical details, the algorithm relies on the postcode district to apply a rating factor to the overall insurance &#8230; <a href="http://codeweavers.wordpress.com/2011/11/18/postcode-district-kata/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeweavers.wordpress.com&amp;blog=11842070&amp;post=995&amp;subd=codeweavers&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>We&#8217;ve recently had a task of importing some new data to one of our insurance related applications. Without boring you with the technical details, the algorithm relies on the <a href="http://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom">postcode district</a> to apply a rating factor to the overall insurance premium. The change came when our customer asked to alter premiums based on areas.</p>
<p>To get to this point we decided to auto generate a <a href="http://msdn.microsoft.com/en-us/library/xfhwa508.aspx">C# dictionary (hashtable)</a> of postcode districts that would be used during compilation and stored in memory. The file we were provided came from a Word document that in turn went through Google docs, and finally Open Office. The end result was something similar to the snippet below. Please note the inconsistent tabs and spaces, as well as upper/lower case conditions.</p>
<p>The task is simple. Write some code that will parse a file containing lines of text in the format of district, condition and value. The code should accept a string representing each individual line and return a string representation of a C# dictionary. For example given the first line in the input file below, the output would correspond to the first dictionary underneath. </p>
<ul>
<li>Column 1 contains the district, either one or two characters.</li>
<li>Column 2 contains the condition, either &#8220;All&#8221; or &#8220;Ex Below&#8221;. Exclusions apply to the district that was last processed. Exclusions should be stored as areas e.g. in the form {DISTRICT}{AREA} while conditions that apply to all should be stored in the form {DISTRICT}.
<li>Values that are linked to a district/area are in the range one to five</li>
</ul>
<p><strong>Rules</strong></p>
<ol>
<li>Copy &amp; paste the input file to maintain the &#8220;formatting&#8221;</li>
<li>Handle any number of tabs between columns.</li>
<li>Handle any number of spaces between columns.</li>
<li>Handle any number of tabs and spaces between columns.</li>
<li>Handle any case of conditions, eg. Ex below or EX below</li>
<li>Handle empty lines &#8211; no tabs/spaces</li>
<li>Must be able to read the whole input file in one go.</li>
</ol>
<h2>Input File</h2>
<pre>
AB		All				1

AB		4				2

ST		3-5			5

ST		ex below			4
		26				3

S	Ex below	        4
	26/30			3

B		Ex below			2
		45-47				3

C		EX BELOW			4
		26/28-31			3

DY		1/2/4				5

DY    1/2/4                             5
      5-6                               3

DY		1/2/4				5
		5-6				3
		10-12				2
</pre>
<h2>Output Per Line</h2>
<p><pre class="brush: plain;">

{{&quot;AB&quot;, 1},}

{{&quot;AB4&quot;, 2},} 

{{&quot;ST3&quot;, 5}, {&quot;ST4&quot;, 5}, {&quot;ST5&quot;, 5},} 

{{&quot;ST&quot;, 4}, {&quot;ST26&quot;, 3},}

{{&quot;S&quot;, 4}, {&quot;S26&quot;, 3}, {&quot;S30&quot;, 3},}

{{&quot;B&quot;, 2}, {&quot;B45&quot;, 3}, {&quot;B46&quot;, 3}, {&quot;B47&quot;, 3},} 

{{&quot;C&quot;, 4}, {&quot;C26&quot;, 3}, {&quot;C28&quot;, 3}, {&quot;C29&quot;, 3}, {&quot;C30&quot;, 3}, {&quot;C31&quot;, 3},} 

{{&quot;DY1&quot; 5}, {&quot;DY2&quot;, 5}, {&quot;DY4&quot;, 5},}

{{&quot;DY1&quot; 5}, {&quot;DY2&quot;, 5}, {&quot;DY4&quot;, 5}, {&quot;DY5&quot;, 3}, {&quot;DY6&quot;, 3},}

{{&quot;DY1&quot; 5}, {&quot;DY2&quot;, 5}, {&quot;DY4&quot;, 5}, {&quot;DY5&quot;, 3}, {&quot;DY6&quot;, 3}, {&quot;DY10&quot;, 2}, {&quot;DY11&quot;, 2}, {&quot;D12&quot;, 2},}
</pre></p>
<h2>File Output</h2>
<p>The final test will be to process the whole file in one go. In the programming language of your choice this would be a case of reading all lines within the input file and invoking the code you wrote for each line. The end result should be:</p>
<pre>
{{"AB",1},{"AB4",2},{"ST3",5},{"ST4",5},{"ST5",5},{"ST",4},{"ST26",3},{"S",4},{"S26",3},{"S30",3},{"B",2},{"B45",3},{"B46",3},{"B47",3},{"C",4},{"C26",3},{"C28",3},{"C29",3},{"C30",3},{"C31",3},{"DY1",5},{"DY2",5},{"DY4",5},{"DY1",5},{"DY2",5},{"DY4",5},{"DY5",3},{"DY6",3},{"DY1",5},{"DY2",5},{"DY4",5},{"DY5",3},{"DY6",3},{"DY10",2},{"DY11",2},{"DY12",2},}
</pre>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codeweavers.wordpress.com/995/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codeweavers.wordpress.com/995/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codeweavers.wordpress.com/995/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codeweavers.wordpress.com/995/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/codeweavers.wordpress.com/995/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/codeweavers.wordpress.com/995/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/codeweavers.wordpress.com/995/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/codeweavers.wordpress.com/995/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codeweavers.wordpress.com/995/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codeweavers.wordpress.com/995/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codeweavers.wordpress.com/995/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codeweavers.wordpress.com/995/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codeweavers.wordpress.com/995/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codeweavers.wordpress.com/995/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeweavers.wordpress.com&amp;blog=11842070&amp;post=995&amp;subd=codeweavers&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://codeweavers.wordpress.com/2011/11/18/postcode-district-kata/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1ad37fda093fd5c84db8d9beeb36f5e0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">shaunfinglas</media:title>
		</media:content>
	</item>
		<item>
		<title>The Best Looking Visual Studio Theme</title>
		<link>http://codeweavers.wordpress.com/2011/11/09/the-best-looking-visual-studio-theme/</link>
		<comments>http://codeweavers.wordpress.com/2011/11/09/the-best-looking-visual-studio-theme/#comments</comments>
		<pubDate>Wed, 09 Nov 2011 13:49:38 +0000</pubDate>
		<dc:creator>Shaun Finglas</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[theme]]></category>
		<category><![CDATA[visual studio 2010]]></category>
		<category><![CDATA[vs2010]]></category>

		<guid isPermaLink="false">http://codeweavers.wordpress.com/?p=982</guid>
		<description><![CDATA[One of the most popular posts we have was our customised Visual Studio theme. Here is the new theme updated for Visual Studio 2010. There&#8217;s always lots of buzz around whether or not like or dark themes are better. Some &#8230; <a href="http://codeweavers.wordpress.com/2011/11/09/the-best-looking-visual-studio-theme/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeweavers.wordpress.com&amp;blog=11842070&amp;post=982&amp;subd=codeweavers&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p style="text-align:left;">One of the most <a href="http://codeweavers.wordpress.com/2010/05/27/a-better-colour-scheme-for-visual-studio/">popular posts</a> we have was our customised Visual Studio theme. Here is the new theme updated for Visual Studio 2010.</p>
<div id="attachment_985" class="wp-caption alignright" style="width: 310px"><a href="http://codeweavers.files.wordpress.com/2011/11/theme.png"><img class="size-medium wp-image-985" title="theme" src="http://codeweavers.files.wordpress.com/2011/11/theme.png?w=300&#038;h=280" alt="Example of Codeweavers Theme" width="300" height="280" /></a><p class="wp-caption-text">Our current VS theme</p></div>
<p style="text-align:left;">There&#8217;s always <a href="http://www.codinghorror.com/blog/2006/09/is-your-ide-hot-or-not.html">lots of buzz</a> around whether or not like or dark themes are better. Some people claim that darker backgrounds are easier on the eyes, and I personally agree with this statement.</p>
<p style="text-align:left;">That being said, if you know of a better looking theme let us know in the comments.</p>
<p style="text-align:left;"><a href="http://dl.dropbox.com/u/48540970/CodeweaversTheme.zip">Download the updated theme</a>  <em>(minus all other VS settings)</em><a href="http://dl.dropbox.com/u/48540970/CodeweaversTheme.zip"><br />
</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codeweavers.wordpress.com/982/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codeweavers.wordpress.com/982/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codeweavers.wordpress.com/982/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codeweavers.wordpress.com/982/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/codeweavers.wordpress.com/982/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/codeweavers.wordpress.com/982/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/codeweavers.wordpress.com/982/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/codeweavers.wordpress.com/982/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codeweavers.wordpress.com/982/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codeweavers.wordpress.com/982/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codeweavers.wordpress.com/982/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codeweavers.wordpress.com/982/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codeweavers.wordpress.com/982/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codeweavers.wordpress.com/982/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeweavers.wordpress.com&amp;blog=11842070&amp;post=982&amp;subd=codeweavers&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://codeweavers.wordpress.com/2011/11/09/the-best-looking-visual-studio-theme/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1ad37fda093fd5c84db8d9beeb36f5e0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">shaunfinglas</media:title>
		</media:content>

		<media:content url="http://codeweavers.files.wordpress.com/2011/11/theme.png?w=300" medium="image">
			<media:title type="html">theme</media:title>
		</media:content>
	</item>
		<item>
		<title>Red, Green, Refactor, Beer</title>
		<link>http://codeweavers.wordpress.com/2011/10/28/red-green-refactor-beer/</link>
		<comments>http://codeweavers.wordpress.com/2011/10/28/red-green-refactor-beer/#comments</comments>
		<pubDate>Fri, 28 Oct 2011 16:31:41 +0000</pubDate>
		<dc:creator>Shaun Finglas</dc:creator>
				<category><![CDATA[Experiences]]></category>
		<category><![CDATA[retrospective]]></category>
		<category><![CDATA[agile methodologies]]></category>
		<category><![CDATA[agile methodology]]></category>

		<guid isPermaLink="false">http://codeweavers.wordpress.com/?p=974</guid>
		<description><![CDATA[Having just begun the process of moving our CI builds to use Team City instead of Cruise Control.NET we decided on the the following rule. For every twenty four hours of green we have, the team gets a beer on &#8230; <a href="http://codeweavers.wordpress.com/2011/10/28/red-green-refactor-beer/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeweavers.wordpress.com&amp;blog=11842070&amp;post=974&amp;subd=codeweavers&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div id="attachment_976" class="wp-caption alignright" style="width: 132px"><a href="http://codeweavers.files.wordpress.com/2011/10/beer.jpg"><img class="size-medium wp-image-976" title="beer" src="http://codeweavers.files.wordpress.com/2011/10/beer.jpg?w=122&#038;h=300" alt="" width="122" height="300" /></a><p class="wp-caption-text">Our reward, even with optional fruit</p></div>
<p>Having just begun the process of moving our CI builds to use <a href="http://www.jetbrains.com/teamcity/">Team City</a> instead of <a href="http://www.cruisecontrolnet.org/projects/ccnet/wiki">Cruise Control.NET </a>we decided on the the following rule.</p>
<p>For every twenty four hours of green we have, the team gets a beer on Friday during the weekly retrospective.</p>
<p>This rule is not only to enable the team to have a cheeky beer every now and then but to encourage more responsibility with regards the build being broken for too long. Hopefully the times for broken builds will begin to decrease over the coming weeks.</p>
<p>Regardless of the future, today we hit our target of the build being green for over twenty four hours, will we hit the target of forty eight hours for the following retro? Only time will tell.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codeweavers.wordpress.com/974/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codeweavers.wordpress.com/974/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codeweavers.wordpress.com/974/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codeweavers.wordpress.com/974/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/codeweavers.wordpress.com/974/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/codeweavers.wordpress.com/974/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/codeweavers.wordpress.com/974/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/codeweavers.wordpress.com/974/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codeweavers.wordpress.com/974/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codeweavers.wordpress.com/974/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codeweavers.wordpress.com/974/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codeweavers.wordpress.com/974/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codeweavers.wordpress.com/974/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codeweavers.wordpress.com/974/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeweavers.wordpress.com&amp;blog=11842070&amp;post=974&amp;subd=codeweavers&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://codeweavers.wordpress.com/2011/10/28/red-green-refactor-beer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1ad37fda093fd5c84db8d9beeb36f5e0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">shaunfinglas</media:title>
		</media:content>

		<media:content url="http://codeweavers.files.wordpress.com/2011/10/beer.jpg?w=122" medium="image">
			<media:title type="html">beer</media:title>
		</media:content>
	</item>
		<item>
		<title>The Best Code is Written Twice</title>
		<link>http://codeweavers.wordpress.com/2011/10/27/the-best-code-is-written-twice/</link>
		<comments>http://codeweavers.wordpress.com/2011/10/27/the-best-code-is-written-twice/#comments</comments>
		<pubDate>Thu, 27 Oct 2011 12:48:22 +0000</pubDate>
		<dc:creator>Shaun Finglas</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[source code]]></category>

		<guid isPermaLink="false">http://codeweavers.wordpress.com/?p=937</guid>
		<description><![CDATA[Recently myself and two colleges completed a new feature in an afternoon&#8217;s programming session. Despite this we ended up binning the feature after all agreeing it was horribly complicated and in turn would cause far more problems down the road &#8230; <a href="http://codeweavers.wordpress.com/2011/10/27/the-best-code-is-written-twice/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeweavers.wordpress.com&amp;blog=11842070&amp;post=937&amp;subd=codeweavers&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" src="http://farm1.static.flickr.com/178/446311023_1b1fe536f4.jpg" alt="Paintbrush" width="NaN" height="95" />Recently myself and two colleges completed a new feature in an afternoon&#8217;s programming session. Despite this we ended up binning the feature after all agreeing it was horribly complicated and in turn would cause far more problems down the road than it would solve.</p>
<p>We decided to rewrite the feature again, but applying all the lessons we had learned from the first attempt. A recent <a href="http://www.redcode.nl/blog/2011/10/great-code-is-written-twice-or-more/">blog post by royvanrijn</a> on this very topic made me appreciate what we had done. He points out that the best code occurs from several attempts, and unlike what people may expect, the repeat attempts need not take the same amount of time to deliver as the initial attempt.</p>
<blockquote><p>&#8220;The second time you write the code, it’ll only take a fraction of the time it took initially.&#8221;</p></blockquote>
<p>This principle of repeating a task made me think of when I was decorating my old bedroom. I helped partake in the difficult task of wallpapering the ceiling. Prior to this I had experience wallpapering before, and would have no trouble repeating this exercise again. However, wallpapering a ceiling was something completely new. Me and my dad were reluctant to start, until I had a rather devious plan. We would decorate my brothers room first, followed by mine. That way, if our first attempt was a disaster I would not be the one living with the dodgy ceiling.</p>
<p>It turned out that our first efforts were not too bad. Granted it took a while, there was the odd rough patch and several obscenities were used, but we got the job done. For the second room we completed the task much quicker and with practically no problems.</p>
<p>The process of wallpapering the second ceiling was the DIY equivalent of scrapping our feature and rewriting the code. We never stripped the first ceiling afterwards, we just took everything we learned from the first round and used it to make the process of papering the second ceiling much easier. The interesting point to bare in mind with scrapping code and rewriting is the rewrite will not take the same amount of time to get back up to speed. Just because it takes <em>n</em> to implement a feature, the second time around you can often complete the feature in less time, at much higher quality.</p>
<p>I&#8217;m not suggesting all code should be rewritten multiple times. <a href="http://www.extremeprogramming.org/rules/spike.html">Spike solutions</a> are often a more suitable process to ease the development process, but in certain cases practice makes perfect, even if it means you wait that little bit longer for the perfect ceiling.</p>
<h6>Image courtesy of <a href="http://www.flickr.com/photos/napfisk/">Nils Geylen</a></h6>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codeweavers.wordpress.com/937/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codeweavers.wordpress.com/937/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codeweavers.wordpress.com/937/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codeweavers.wordpress.com/937/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/codeweavers.wordpress.com/937/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/codeweavers.wordpress.com/937/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/codeweavers.wordpress.com/937/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/codeweavers.wordpress.com/937/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codeweavers.wordpress.com/937/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codeweavers.wordpress.com/937/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codeweavers.wordpress.com/937/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codeweavers.wordpress.com/937/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codeweavers.wordpress.com/937/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codeweavers.wordpress.com/937/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeweavers.wordpress.com&amp;blog=11842070&amp;post=937&amp;subd=codeweavers&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://codeweavers.wordpress.com/2011/10/27/the-best-code-is-written-twice/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1ad37fda093fd5c84db8d9beeb36f5e0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">shaunfinglas</media:title>
		</media:content>

		<media:content url="http://farm1.static.flickr.com/178/446311023_1b1fe536f4.jpg" medium="image">
			<media:title type="html">Paintbrush</media:title>
		</media:content>
	</item>
		<item>
		<title>Smalltalk Conversion Mapped to C#</title>
		<link>http://codeweavers.wordpress.com/2011/10/14/smalltalk-conversion-mapped-to-c/</link>
		<comments>http://codeweavers.wordpress.com/2011/10/14/smalltalk-conversion-mapped-to-c/#comments</comments>
		<pubDate>Fri, 14 Oct 2011 14:19:04 +0000</pubDate>
		<dc:creator>Shaun Finglas</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Experiences]]></category>
		<category><![CDATA[best practice patterns]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[smalltalk]]></category>

		<guid isPermaLink="false">http://codeweavers.wordpress.com/?p=867</guid>
		<description><![CDATA[Lately the team has been making some rather drastic changes and re-designs to our codebase in an attempt to minimise friction to change. In other words, we&#8217;ve identified areas that are painful or tedious to work in and have hopefully &#8230; <a href="http://codeweavers.wordpress.com/2011/10/14/smalltalk-conversion-mapped-to-c/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeweavers.wordpress.com&amp;blog=11842070&amp;post=867&amp;subd=codeweavers&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Lately the team has been making some rather drastic changes and re-designs to our codebase in an attempt to minimise friction to change. In other words, we&#8217;ve identified areas that are painful or tedious to work in and have hopefully rectified them by re-writing the code. The proof of this should be felt as we begin adding new features, the newly improved code is certainly faster and more optimised.</p>
<p>Regardless, one area that remains troublesome in my opinion is object mapping (or the correct term of conversion) code. While I&#8217;ve not personally been involved with this reworking of the codebase, I have recently just finished reading Kent Beck&#8217;s &#8211; <a href="http://www.amazon.co.uk/Smalltalk-Best-Practice-Patterns-Kent/dp/013476904X">Smalltalk Best Practice Patterns</a>. Many of the developers I follow on Twitter have been blogging about this book and I figured it was time to give it a go. After all it gets massive praise whether or not you use <a href="http://en.wikipedia.org/wiki/Smalltalk">Smalltalk</a>. While reading this book a few key points regarding object conversion are discussed and I found them incredibly relevant.</p>
<p>So should you read the book? I would say yes. I don&#8217;t program in Smalltalk. I don&#8217;t plan on programming Smalltalk. Nor had I read a line of Smalltalk before. But you should still read this book. The first half is incredibly relevant to any OO programming language. Granted I found the second half is less useful, but the gems I&#8217;ve picked up in the first half more than make up for this. In fact, pages 28 to 30 are so good I figured it would be worth sharing.</p>
<p>I&#8217;ve been convinced for a while that creating separate objects to convert objects is unnecessary, and in fact adds to the amount of code you need to write and maintain, thus increasing resistance for change. So if we remove this unecesary, intermediate object, how do we create a new object from another object? The answer is conversion. This answer strangely comes from a book all about Smalltalk. The answer also strangely comes from a book over ten years old. Pages 28 &#8211; 30 cover the topic of conversion. The following is quoted heavily from the book, but I recommend reading the pages in full.</p>
<h2><strong>Conversion</strong></h2>
<blockquote><p><strong>Question </strong>- How do you convert information from one object&#8217;s format to another&#8217;s?</p></blockquote>
<blockquote><p><strong>Answer </strong>- Convert from one ojbect to another rather than overwhelm any one object&#8217;s protocol.</p></blockquote>
<p>What this is getting at is we could using <a href="http://msdn.microsoft.com/en-us/library/bb383977.aspx">C# extension</a> methods do the following to the String class.</p>
<p><pre class="brush: csharp;">
&quot;B74 BH2&quot;.ToPostcode();
&quot;01215435643&quot;.ToTelephoneNumber();
&quot;AD3KDK1-2121K2A&quot;.QuoteReference();
&quot;Hello&quot;.MoreConversion();
</pre></p>
<p>This would be abusing the String class. If we want a postcode from a string, we should have the Postcode object create us a Postcode from a string, not the other way around. There could be hundreds of conversions from strings to a new object, but we would violate the string class if we did this. In turn, Kent goes on to say &#8220;<em>Conversions that return similar responsibilities should use a Convert Method. To convert to an object with different protocol use a Converter Constructor Method</em>&#8220;.</p>
<h2><strong>Converter Method</strong></h2>
<blockquote><p><strong>Question</strong> &#8211; How do you represent simple conversion of an object to another object with the same protocol but different format?</p></blockquote>
<blockquote><p><strong>Answer</strong> &#8211; Provide a method in the object to be converted that converts to the new object. Name the method by pre-appending &#8220;as&#8221; to the class of the object returned.</p></blockquote>
<p>Smalltalk examples<br />
<pre class="brush: plain;">
Collection&lt;&lt;asSet
Number&lt;&lt;asFloat
</pre></p>
<p>In C# these would be:<br />
<pre class="brush: csharp;">
Collection.ToSet()
Number.ToFloat();
</pre></p>
<p>In C# the convention is to use <code>To</code> rather than <code>As</code> for converter methods. For example we could do quotes.ToArray() on a List of Quotes. We still have the same protocol, a collection of quotes, we are just storing them in a different format. The rule for adding such methods is that there should only be one sensible way to perform this conversion, and the source and destination share the same protocol.</p>
<h2><strong>Converter Constructor Method</strong></h2>
<blockquote><p><strong>Question</strong> &#8211; How do you represent the conversion of an object to another with different protocol?</p></blockquote>
<blockquote><p><strong>Answer</strong> &#8211; Make a constructor method that takes the object to be converted as an argument</p></blockquote>
<p>Smalltalk example:<br />
<pre class="brush: plain;">
Date class&lt;&lt;fromString
</pre></p>
<p>In C# this would be:<br />
<pre class="brush: csharp;">
class Date
{
    public Date(string date) { ... }
}
</pre></p>
<p>In our codebase we have a <code>RegistrationDate </code>object. We have a constructor that takes a string representation of the date (from the outside world) and constructs a <code>RegistrationDate </code>. This very same principle can be applied to other, more complex objects. For example consider an active record style approach below. Here <code>QuoteRecord </code>represents our database object, with <code>Quote </code>representing a domain object. The following would be the converter constructor method. In other words, we create (or convert) our quote from the quote record. No separate mapper. No intermediate object. Less resistance for change.</p>
<p><pre class="brush: csharp;">
class Quote
{
    public Quote(QuoteRecord record)
    {
          // Code...
    }
}
</pre></p>
<p>The benefit here is that we have minimised friction. If the requirements for this code changes we will need up to update at worst, the record and the domain object. Had we used a separate object to perform the mapping we would end up with a third place to maintain if we decided to add a new property to our <code>QuoteRecord</code>.</p>
<p>I&#8217;ll admit to having only used this technique for a week or so, though so far it has worked a treat and I expect it to continue working considering these techniques have stood the test of time.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codeweavers.wordpress.com/867/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codeweavers.wordpress.com/867/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codeweavers.wordpress.com/867/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codeweavers.wordpress.com/867/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/codeweavers.wordpress.com/867/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/codeweavers.wordpress.com/867/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/codeweavers.wordpress.com/867/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/codeweavers.wordpress.com/867/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codeweavers.wordpress.com/867/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codeweavers.wordpress.com/867/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codeweavers.wordpress.com/867/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codeweavers.wordpress.com/867/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codeweavers.wordpress.com/867/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codeweavers.wordpress.com/867/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeweavers.wordpress.com&amp;blog=11842070&amp;post=867&amp;subd=codeweavers&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://codeweavers.wordpress.com/2011/10/14/smalltalk-conversion-mapped-to-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1ad37fda093fd5c84db8d9beeb36f5e0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">shaunfinglas</media:title>
		</media:content>
	</item>
		<item>
		<title>Assert Migration</title>
		<link>http://codeweavers.wordpress.com/2011/09/05/assert-migration/</link>
		<comments>http://codeweavers.wordpress.com/2011/09/05/assert-migration/#comments</comments>
		<pubDate>Mon, 05 Sep 2011 12:32:32 +0000</pubDate>
		<dc:creator>Shaun Finglas</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Experiences]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[assert]]></category>
		<category><![CDATA[unit test]]></category>
		<category><![CDATA[unit testing]]></category>

		<guid isPermaLink="false">http://codeweavers.wordpress.com/?p=849</guid>
		<description><![CDATA[We try our best to ensure our test code here at Codeweavers is free of duplication. Not only this but I would argue that we give it the same care as the production code, which is a good thing. Despite &#8230; <a href="http://codeweavers.wordpress.com/2011/09/05/assert-migration/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeweavers.wordpress.com&amp;blog=11842070&amp;post=849&amp;subd=codeweavers&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>We try our best to ensure our test code here at Codeweavers is free of duplication. Not only this but I would argue that we give it the same care as the production code, which is a good thing. Despite these best intentions, over time test code can rot. That nicely factored test fixture you wrote a few months ago? Now it&#8217;s a stinking mess of duplication. This can happen for numerous reasons. One of the factors for this degradation occurs when new test fixtures are added.</p>
<p>We often use a test fixture per behavior, so our tests are often grouped by behavior, for example &#8220;<code>GivenASuccessfulQuote</code>&#8221; or &#8220;<code>GivenAUnsuccessfulQuote</code>&#8221; would be test fixtures for testing the quotes behavior. These fixtures would test the happy path of a quote and erroneous behavior respectively. The issue comes when we wish to add a new feature. Imagine we wanted the unsuccessful quotes to return a result with a message explaining why the quote was unsuccessful. We&#8217;d often start by writing a new fixture, adding the required set up and relevant asserts/verifies. <em>You might argue that we should look for similar fixtures to add to at this point, but I prefer duplicating code (intentionally or unintentionally) first to get the feature working.</em></p>
<p>Recently having carried out a similar process mentioned above myself and another developer noticed that there was duplication, albeit slightly different between our new fixture and the unsuccessful quote fixture. We never wrote the other fixture, so we never planned for our new fixture to become so similar. I tried rather unsuccessfully removing the common setup code between the two classes. The revelation came when we took the assert from our new fixture and pushed it up into the unsuccessful quote scenario. This assert failed as we were missing the expected message that was not being set up correctly. After moving this expected message from the new fixture up into the unsuccessful fixture the assert passed. Once this went green, we pushed the assert out of the test we had just migrated to and all was well. The new message fixture could be deleted, after all it was behavior of an unsuccessful quote. Having done this we removed in the region of about twenty lines of code. I was stunned at how well this worked. We had essentially tested our test code worked.</p>
<p>The process was as follows &#8211; <em>Remember, it&#8217;s only worth doing this if the behavior you are testing makes sense in the fixture you wish to migrate to. Putting all your tests into one fixture defeats the purpose of grouping behavior via test fixtures.</em></p>
<p><strong>Steps</strong>:</p>
<ol>
<li>Write new fixture &#8211; make its test(s) pass</li>
<li>Identify duplication between fixtures</li>
<li>Migrate if it makes sense for the behavior you are testing to belong on a new fixture &#8211; otherwise try and remove duplication another way</li>
<li>Push assert into an existing test method</li>
<li>Run tests</li>
<li>If the tests pass you&#8217;re done, <strong>or</strong> if they fail move the required setup from the new fixture into the current fixture</li>
<li>Run tests</li>
<li>If the tests pass &#8211; move assert(s) into separate test method(s) <strong>otherwise</strong> go to step 6</li>
<li>Delete new fixture</li>
<li>Run tests</li>
</ol>
<p>I have to thank <a href="http://bluerezz.wordpress.com/">Paul Shannon</a> for this gem as he was the one who explained how to do this. He plays the process down but the fact that this is a safe way to remove duplication between tests is great.</p>
<p><strong>Pseudo code worked example</strong></p>
<p><strong>Part 1</strong>:<br />
<pre class="brush: csharp;">
class GivenAUnSuccessfulQuote
   Setup()
   ThenItShouldBeInValid()
   ThenItShouldDoOtherStuff()
end
</pre></p>
<p><pre class="brush: csharp;">
class GivenAUnSuccessfulQuotesMessage
   Setup()                             // This is near duplication above
   ThenItShouldReturnAInfoMessage()
   ThenTheMessageShouldDoOtherStuff()
end
</pre></p>
<p><strong>Part 2:</strong><br />
<pre class="brush: csharp;">
class GivenAUnSuccessfulQuote
   Setup()
   ThenItShouldBeInValid()
   ThenItShouldDoOtherStuff()
   ThenItShouldReturnAInfoMessage()    // Moved this from the fixture below
   ThenTheMessageShouldDoOtherStuff()  // Moved this from the fixture below
end
</pre></p>
<p><pre class="brush: csharp;">
class GivenAUnSuccessfulQuotesMessage
   Setup() // This setup is near duplication of the fixture above
end
</pre></p>
<p><strong><br />
Part 3:</strong></p>
<p>Run tests</p>
<p><strong>Part 4:</strong></p>
<p>Move required setup from the <code>GivenAUnSuccessfulQuotesMessage </code>until the <code>GivenAUnSuccessfulQuote </code>fixture is passing.</p>
<p><strong>Part 5</strong></p>
<p>Delete the <code>GivenAUnSuccessfulQuotesMessage </code>fixture.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codeweavers.wordpress.com/849/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codeweavers.wordpress.com/849/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codeweavers.wordpress.com/849/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codeweavers.wordpress.com/849/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/codeweavers.wordpress.com/849/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/codeweavers.wordpress.com/849/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/codeweavers.wordpress.com/849/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/codeweavers.wordpress.com/849/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codeweavers.wordpress.com/849/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codeweavers.wordpress.com/849/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codeweavers.wordpress.com/849/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codeweavers.wordpress.com/849/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codeweavers.wordpress.com/849/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codeweavers.wordpress.com/849/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeweavers.wordpress.com&amp;blog=11842070&amp;post=849&amp;subd=codeweavers&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://codeweavers.wordpress.com/2011/09/05/assert-migration/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1ad37fda093fd5c84db8d9beeb36f5e0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">shaunfinglas</media:title>
		</media:content>
	</item>
	</channel>
</rss>
