<?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>Steve Freeman &#187; Test-Driven</title>
	<atom:link href="http://www.higherorderlogic.com/category/things-to-do-with-work/test-driven/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.higherorderlogic.com</link>
	<description>Working software daily</description>
	<lastBuildDate>Mon, 24 Oct 2011 20:24:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Another reason not to log directly in your code</title>
		<link>http://www.higherorderlogic.com/2011/10/another-reason-not-to-log-directly/</link>
		<comments>http://www.higherorderlogic.com/2011/10/another-reason-not-to-log-directly/#comments</comments>
		<pubDate>Sun, 23 Oct 2011 18:13:52 +0000</pubDate>
		<dc:creator>steve.freeman</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Test-Driven]]></category>

		<guid isPermaLink="false">http://www.higherorderlogic.com/?p=815</guid>
		<description><![CDATA[I&#8217;ve been ranting for some time that it&#8217;s a bad idea directly to mix logging with production code. The right thing to do is to introduce a collaborator that has a responsibility to provide structured notifications to the outside world about what&#8217;s happening inside an object. I won&#8217;t go through the whole discussion here but, [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been ranting <a href="http://www.mockobjects.com/2007/04/test-smell-logging-is-also-feature.html" title="logging is alos a feature" target="_blank">for some time</a> that it&#8217;s a bad idea directly to mix logging with production code. The right thing to do is to introduce a collaborator that has a responsibility to provide structured notifications to the outside world about what&#8217;s happening inside an object. I won&#8217;t go through the whole discussion here but, somehow, I don&#8217;t think I&#8217;m winning this one.</p>

<p>Recently, a team I know provided another reason to avoid mixing production logging with code. They have a system that processes messages and have been asked to record all the accepted messages for later reconciliation with an upstream system. They did what most Java teams would do and logged incoming messages in the class that processes them. Then they associated a special appender with that class&#8217;s logger that writes its entries to a file somewhere for later checking. The appenders are configured in a separate <span class="caps">XML </span>file.</p>

<p>One day the inevitable happened and they renamed the message processing class during a refactoring. This broke the reference in the <span class="caps">XML </span>configuration and the logging stopped. It wasn&#8217;t caught for a little while because there wasn&#8217;t a test. So, lesson one is that, if it matters, there should have been a test for it. But this is a pretty rigorous team that puts a lot of effort into doing things right (I&#8217;ve seen much worse), so how did they miss it? </p>

<p>I think part of it is the effort required to test logging. A unit test won&#8217;t do because the structure includes configuration, and acceptance tests run slowly because loggers buffer to improve performance. And part of it is to do with using a side effect of system infrastructure to implement a service. There&#8217;s nothing in the language of the implementation code that describes the meaning of reporting received messages: &ldquo;it&#8217;s just logging&rdquo;.</p>

<p>Once again, if I want my code to do something, I should just say so&hellip;</p>

<p><em>Update:</em> I&#8217;ve had several responses here and on other media about how teams might avoid this particular failure. All of them are valid, and I know there are techniques for doing what I&#8217;m supposed to while using a logging framework.</p>

<p>I was trying to make a different point&mdash;that some code techniques seem to lead me in better directions than others, and that a logging framework isn&#8217;t one of them. Once again I find that the trickiness in testing an example like this is a clue that I should be looking at my design again. If I introduce a collaboration to receive structured notifications, I can separate the concepts of handling messages and reporting progress. Once I&#8217;ve split out the code to support the reconciliation messages, I can test and administer it separately&mdash;with a clear relationship between the two functions.</p>

<p>None of this guarantees a perfect design, but I find I do better if I let the code do the work.</p>]]></content:encoded>
			<wfw:commentRss>http://www.higherorderlogic.com/2011/10/another-reason-not-to-log-directly/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Test-First Development 1968</title>
		<link>http://www.higherorderlogic.com/2011/10/test-first-development-1968/</link>
		<comments>http://www.higherorderlogic.com/2011/10/test-first-development-1968/#comments</comments>
		<pubDate>Wed, 12 Oct 2011 14:06:40 +0000</pubDate>
		<dc:creator>steve.freeman</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Test-Driven]]></category>

		<guid isPermaLink="false">http://www.higherorderlogic.com/?p=808</guid>
		<description><![CDATA[Seeing Kevlin Henney again at the Goto conference reminded me of a quotation he cited at Agile on the Beach last month. In 1968, NATO funded a conference with the then provocative title of Software Engineering. Many people feel that this is the moment when software development lost its way, but the report itself is [...]]]></description>
			<content:encoded><![CDATA[<p>Seeing <a href="https://twitter.com/#!/KevlinHenney" title="Kevlin Henney">Kevlin Henney</a> again at the <a href="http://gotocon.com/" title="Goto conference">Goto conference</a> reminded me of a quotation he cited at <a href="http://agileonthebeach.com/" title="Agile on the Beach">Agile on the Beach</a> last month.</p>

<p>In 1968, <span class="caps">NATO </span>funded a conference with the then provocative title of <em>Software Engineering</em>. Many people feel that this is the moment when software development lost its way, but <a href="http://homepages.cs.ncl.ac.uk/brian.randell/NATO/nato1968.PDF" title="NATO 1968 software engineering report">the report</a> itself is more lively that its title suggests.</p>

<p>It turns out that &#8220;outside in&#8221; development, with early testing is older than we thought. Here&#8217;s a quote from the report by <a href="http://en.wikipedia.org/wiki/Alan_Perlis" title="Alan Perlis">Alan Perlis</a>:</p>

<blockquote>I&#8217;d like to read three sentences to close this issue.
<ol>
 <li>A software system can best be designed if the testing is interlaced with the designing instead of being used after the design.</li>
 <li>A simulation which matches the requirements contains the control which organizes the design of the system.</li>
 <li>Through successive repetitions of this process of interlaced testing and design the model ultimately becomes the software system itself. I think that it is the key of the approach that has been suggested, that there is no such question as testing things after the fact with simulation models, but that in effect the testing and the replacement of simulations with modules that are deeper and more detailed goes on with the simulation model controlling, as it were, the place and order in which these things are done.</li>
</ol></blockquote>

<p>It&#8217;s all out there in our history, we just have to be able to find it.</p>]]></content:encoded>
			<wfw:commentRss>http://www.higherorderlogic.com/2011/10/test-first-development-1968/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Going to Goto (twice)</title>
		<link>http://www.higherorderlogic.com/2011/09/going-to-goto-twice/</link>
		<comments>http://www.higherorderlogic.com/2011/09/going-to-goto-twice/#comments</comments>
		<pubDate>Sun, 04 Sep 2011 20:49:00 +0000</pubDate>
		<dc:creator>steve.freeman</dc:creator>
				<category><![CDATA[Agile Programming]]></category>
		<category><![CDATA[Events]]></category>
		<category><![CDATA[Test-Driven]]></category>

		<guid isPermaLink="false">http://www.higherorderlogic.com/?p=727</guid>
		<description><![CDATA[I&#8217;ll be at Goto Aarhus October 9-14 this year, giving a presentation and workshop on Nat Pryce and my material on using Test-Driven Development at multiple levels, guiding the design of system components as well as the objects within them. If you register with the code free1250, you&#8217;ll get a discount of 1250 DKK and [...]]]></description>
			<content:encoded><![CDATA[<p><img alt="GOTO Conferences" src="/images/goto_logo.png" class="alignright" width="93" height="90" />I&#8217;ll be at Goto <a href="http://gotocon.com/aarhus-2011/" title="Goto Aarhus">Aarhus</a> October 9-14 this year, giving a <a href="http://gotocon.com/aarhus-2011/presentation/Fractal%20TDD.%20Using%20tests%20to%20drive%20system%20design">presentation</a> and <a href="http://gotocon.com/aarhus-2011/presentation/Hands-On%20:%20TDD%20at%20the%20System%20Scale" target="_blank">workshop</a> on <a href="http://www.natpryce.com/" target="_blank">Nat Pryce</a> and my material on using Test-Driven Development at multiple levels, guiding the design of system components as well as the objects within them. </p>

<p>If you register with the code <em>free1250</em>, you&#8217;ll get a discount of 1250 <span class="caps">DKK </span>and Goto will donate the same amount to <a href="http://www.computersforcharities.co.uk/" target="_blank">Computers for Charities</a></p>

<p>Some of us are then rushing to Goto <a href="http://gotocon.com/amsterdam-2011/">Amsterdam</a>, where I&#8217;ll be giving the talk again on Friday. Again the code <em>free1250</em> will do something wonderful, but I&#8217;m not quite sure what.</p>]]></content:encoded>
			<wfw:commentRss>http://www.higherorderlogic.com/2011/09/going-to-goto-twice/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Test-Driven Development and Embracing Failure</title>
		<link>http://www.higherorderlogic.com/2011/04/tdd-embracing-failure/</link>
		<comments>http://www.higherorderlogic.com/2011/04/tdd-embracing-failure/#comments</comments>
		<pubDate>Mon, 25 Apr 2011 22:33:04 +0000</pubDate>
		<dc:creator>steve.freeman</dc:creator>
				<category><![CDATA[Software culture]]></category>
		<category><![CDATA[Test-Driven]]></category>

		<guid isPermaLink="false">http://www.m3p.co.uk/?p=590</guid>
		<description><![CDATA[At the last London XpDay, some teams talked about their &#8220;post-XP&#8221; approach. In particular, they don&#8217;t do much Test-Driven Development because they find it&#8217;s not worth the effort. I visited one of them, Forward, and saw how they&#8217;d partitioned their system into composable actors, each of which was small enough to fit into a couple [...]]]></description>
			<content:encoded><![CDATA[<p>At the last <a href="http://www.xpday.org/">London XpDay</a>, some teams talked about their &#8220;post-XP&#8221; approach. In particular, they don&#8217;t do much Test-Driven Development because they find it&#8217;s not worth the effort. I visited one of them, <a href="http://www.Forward.co.uk">Forward</a>, and saw how they&#8217;d partitioned their system into composable actors, each of which was small enough to fit into a couple of screens of Ruby. They release new code to a single server in their farm, watching the traffic statistics that result. If it&#8217;s successful, they carefully propagate it out to the rest of the farm. If not, they pull it and try something else. In their world, the improvement in traffic statistics, the end benefit of the feature, is what they look for, not the implemented functionality.</p>

<p>I think this fits into Dave Snowden&#8217;s <a href="http://en.wikipedia.org/wiki/Cynefin">Cynefin</a> framework, where he distinguishes between the ordered and unordered domains. In the <em>ordered</em> domain, causes lead to effects. This might be difficult to see and require an expert to interpret, but essentially we expect to see the same results when we repeat an action. In the complex, <em>unordered</em> domain, there is no such promise. For example, we know that flocking birds are driven by three simple rules but we can&#8217;t predict exactly where a flock will go next. Groups of people are even more complex, as conscious individuals can change the structure of a system whilst being part of it. We need different techniques for working with ordered and unordered systems, as anyone who&#8217;s tried to impose order on a gang of unruly programmers will know.</p>

<p>Loosely, we use rules and expert knowledge for ordered systems, the appropriate actions can be decided from outside the system. Much of the software we&#8217;re commissioned to build is about lowering the cost of expertise by encoding human decision-making. This works for, say ticket processing, but is problematic for complex domains where the result of an action is literally unknowable. There, the best we can do to influence a system is to try probing it and be prepared to respond quickly to whatever happens. <a href="http://www.metaprog.com/blogs/2009/10/on-retrospective-coherence-part-1/">Joseph Pelrine</a> uses the example of a house party&mdash;a good host knows when to introduce people, when to top up the drinks, and when to rescue someone from that awful bore from <span class="caps">IT.</span> A party where everyone is instructed to re-enact all the moves from last time is unlikely to be equally successful<sup>1</sup>. Online start-ups are another example of operating in a complex environment: the Internet. Nobody really knows what all those people will do, so the best option is to act, to ship something, and then respond as the behaviour becomes clearer. </p>

<p>Snowden distinguishes between &#8220;fail-safe&#8221; and &#8220;<a href="http://www.cognitive-edge.com/blogs/dave/2007/11/safefail_probes.php">safe-fail</a>&#8221; initiatives. We use use <em>fail-safe</em> techniques for ordered systems because we know what&#8217;s supposed to happen and it&#8217;s more effective to get things right&mdash;we want a build system that just works. We use <em>safe-fail</em> techniques for unordered systems because the best we can do is to try different actions, none of which is large enough to damage the system, until we find something that takes us in the right direction&mdash;with a room full of excitable children we might try playing a video to see if it calms them down.</p>

<p>At the technical level, Test-Driven Development is largely fail-safe. It allows us, amongst other benefits, to develop code that just works (for multiple meanings of &#8220;work&#8221;). We take a little extra time around the writing of the code, which more than pays back within the larger development cycle. At higher levels, <span class="caps">TDD </span>can support safe-fail development because it lowers the cost of changing our mind later. This allows us to take an interim decision now about which small feature to implement next or which design to choose. We can afford to revisit it later when we&#8217;ve seen the result without crashing the whole project.</p>

<p>Continuous deployment environments such as at Forward<sup>2</sup>, on the other hand, emphasize &#8220;safe-fail&#8221;. The system is partitioned up so that no individual change can damage it, and the feedback loop is tight enough that the team can detect and respond to changes very quickly. That said, even the niftiest lean start-up will have fail-safe elements too, a sustained network failure or a data breach could be the end of the company. Start-ups that fail to understand this end up teetering on the edge of disaster.</p>

<p>We&#8217;ve learned a lot over the last ten years about how to tune our development practices. Test-Driven Development is no more &#8220;over&#8221; than Object-Orientation is, it&#8217;s just that we understand better how to apply it. I think our early understanding was coloured by the fact that the original eXtreme Programming project, <a href="http://en.wikipedia.org/wiki/Chrysler_Comprehensive_Compensation_System">C3</a>, was payroll, an ordered system; I don&#8217;t want my pay cheque worked out by trying some numbers and seeing who complains<sup>3</sup>. We learned to Embrace Change, that it&#8217;s a sign of a healthy development environment rather than a problem. As we&#8217;ve expanded into less predictable domains, we&#8217;re also learning to Embrace Failure.</p>

<p><hr/><br />
1) this is a pretty good description of many &#8220;Best Practice&#8221; initiatives<br />
2) Fred George has been documenting safe-fail in the organisation of his development group too, he calls it &#8220;<a href="http://www.infoq.com/presentations/Leaner-Programmer-Anarchy">Programmer Anarchy</a>&#8220;<br />
3) although I&#8217;ve seen shops that come close to this</p>]]></content:encoded>
			<wfw:commentRss>http://www.higherorderlogic.com/2011/04/tdd-embracing-failure/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Speaking and tuting at QCon London. 7-11 March</title>
		<link>http://www.higherorderlogic.com/2011/01/speaking-and-tuting-at-qcon-london-7-11-march/</link>
		<comments>http://www.higherorderlogic.com/2011/01/speaking-and-tuting-at-qcon-london-7-11-march/#comments</comments>
		<pubDate>Sun, 23 Jan 2011 21:19:41 +0000</pubDate>
		<dc:creator>steve.freeman</dc:creator>
				<category><![CDATA[Events]]></category>
		<category><![CDATA[Software culture]]></category>
		<category><![CDATA[Test-Driven]]></category>

		<guid isPermaLink="false">http://www.m3p.co.uk/?p=575</guid>
		<description><![CDATA[Nat and I will be running our &#8220;TDD at the System Scale&#8221; tutorial at QCon London. Sign up soon. I&#8217;ll also be presenting an engaging rant on why we should aspire to living and working in a world where stuff just works. If you quote the promotion code FREE100 when you sign up, QCon will [...]]]></description>
			<content:encoded><![CDATA[<p><img src="/images/speaking-at-qcon-2011.jpg" alt="Speaking at QCon London 2011" style="float:right; margin-left: 5px;"/> <a href="http://www.natpryce.com">Nat</a> and I will be running our <a href="http://qconlondon.com/london-2011/presentation/Hands-On+:+TDD+at+the+System+Scale">&#8220;TDD at the System Scale&#8221; </a> tutorial at <a href="http://qconlondon.com/london-2011/conference/">QCon London</a>. Sign up soon.</p>

<p>I&#8217;ll also be presenting an <a href="http://qconlondon.com/london-2011/presentation/Better+is+Better">engaging rant</a> on why we should aspire to living and working in a world where stuff just works.</p>

<p>If you quote the promotion code <code>FREE100</code> when you sign up, QCon will give you a discount of &pound;100 and the same amount to <a href="http://www.crisis.org.uk/index.php">Crisis Charity</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.higherorderlogic.com/2011/01/speaking-and-tuting-at-qcon-london-7-11-march/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Responding to Brian Marick</title>
		<link>http://www.higherorderlogic.com/2010/01/responding-to-brian-marick/</link>
		<comments>http://www.higherorderlogic.com/2010/01/responding-to-brian-marick/#comments</comments>
		<pubDate>Sun, 17 Jan 2010 22:10:39 +0000</pubDate>
		<dc:creator>steve.freeman</dc:creator>
				<category><![CDATA[Agile Programming]]></category>
		<category><![CDATA[Book]]></category>
		<category><![CDATA[Test-Driven]]></category>

		<guid isPermaLink="false">http://www.m3p.co.uk/?p=385</guid>
		<description><![CDATA[Brian&#8217;s been paying us the compliment of taking our book seriously and working through our extended example, translating it to Ruby. He has a point of contention in that he&#8217;s doubtful about the value of our end-to-end tests. To be more precise, he&#8217;s doubtful about the value of our automated end-to-end tests, a view shared [...]]]></description>
			<content:encoded><![CDATA[<p>Brian&#8217;s been paying us the compliment of taking <a href="http://www.growing-object-oriented-software.com/">our book</a> seriously and working through our extended example, translating it to Ruby. </p>

<p>He has a <a href="http://www.exampler.com/blog/2010/01/08/some-preliminary-thoughts-on-end-to-end-testing-in-growing-object-oriented-software/">point of contention</a> in that he&#8217;s doubtful about the value of our end-to-end tests. To be more precise, he&#8217;s doubtful about the value of our <em>automated</em> end-to-end tests, a view shared by <a href="http://www.jbrains.ca/integration_tests_are_a_scam"><span class="caps">J.B.R</span>ainsberger</a>, and <a href="http://agile2009.agilealliance.org/node/1010">Arlo Belshee and Jim Shore</a>. That&#8217;s a pretty serious group. I think the answer, as always, is &ldquo;it depends&rdquo;. </p>

<p>There are real advantages to writing automated end-to-end tests. As Nat pointed out in <a href="http://groups.google.com/group/growing-object-oriented-software/browse_thread/thread/5525c6acdd143be6">an extended message</a> to the mailing list for the book, </p>

<blockquote>Most significantly to me, however, is the difference between &#8220;testing&#8221; end-to-end or through the <span class="caps">GUI </span>and &#8220;test-driving&#8221;. A lot of people who are evangelical about <span class="caps">TDD </span>for coding do not use end-to-end tests for driving design at the system scale. I have found that writing tests gives useful design feedback, no matter what the scale.</blockquote>

<p>For example, during Arlo and Jim&#8217;s session, I was struck by how many of the &ldquo;failure stories&rdquo; described situations where the acceptance tests were actually doing their job: revealing problems (such as deployment difficulties) that needed to be fixed.</p>

<p>Automating an end-to-end test helps me think more carefully about what <em>exactly</em> I care about in the next feature.  Automating tests for many features encourages me to work out a language to describe them, which clarifies how I describe the system and makes new features easier to test.</p>

<p>And then there&#8217;s scale. Pretty much anything will work for a small system (although Alan Shalloway <a href="http://www.netobjectives.com/blogs/smart-people-xp-scrum-is-there-a-pattern">has a story</a> about how even a quick demonstrator project can get out of hand). For larger systems, things get complicated, people come and go, and the team isn&#8217;t quite as confident as it needs to be about where things are connected. Perhaps these are symptoms of weaknesses in the team culture, but it seems wasteful to me to take the design experience we gained while writing the features not encode it somewhere.</p>

<p>Of course this comes at a price. Effective end-to-end tests take skill, experience, and (most important) commitment. Not every system I&#8217;ve seen has been programmed by people who are as rigorous as Nat about making the test code expressive or allowing testing to drive the design. Worse, a large collection of badly written end-to-end tests (a pattern I&#8217;ve seen a few times) is a huge drag on development. Is that price worth paying? It (ahem) depends, and part of the skill is in finding the right places to test.</p>

<p>So, let me turn Brian&#8217;s final question around. What would it take to make automated end-to-end tests less scary?</p>]]></content:encoded>
			<wfw:commentRss>http://www.higherorderlogic.com/2010/01/responding-to-brian-marick/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Friday 13th, Talking at Skills Matter</title>
		<link>http://www.higherorderlogic.com/2009/10/friday-13th-talking-at-skills-matter/</link>
		<comments>http://www.higherorderlogic.com/2009/10/friday-13th-talking-at-skills-matter/#comments</comments>
		<pubDate>Fri, 30 Oct 2009 15:13:19 +0000</pubDate>
		<dc:creator>steve.freeman</dc:creator>
				<category><![CDATA[Events]]></category>
		<category><![CDATA[Test-Driven]]></category>

		<guid isPermaLink="false">http://www.m3p.co.uk/?p=349</guid>
		<description><![CDATA[Prove you&#8217;re not superstitious! I&#8217;ll be giving my talk on Sustainable TDD at Skills Matter on Friday, 13th November. Sign up here (if you dare). This talk is about the qualities we look for in test code that keep the development &#8220;habitable.&#8221; We want to make sure the tests pull their weight by making them [...]]]></description>
			<content:encoded><![CDATA[<p>Prove you&#8217;re not superstitious! I&#8217;ll be giving my talk on Sustainable <span class="caps">TDD </span>at Skills Matter on Friday, 13th November. <a href="http://skillsmatter.com/podcast/agile-testing/sustainable-test-driven-development">Sign up here</a> (if you dare). </p>

<blockquote>This talk is about the qualities we look for in test code that keep the development &#8220;habitable.&#8221; We want to make sure the tests pull their weight by making them expressive, so that we can tell what&#8217;s important when we read them and when they fail, and by making sure they don&#8217;t become a maintenance drag themselves. We need to apply as much care and attention to the tests as we do to the production code, although the coding styles may differ. Difficulty in testing might imply that we need to change our test code, but often it&#8217;s a hint that our design ideas are wrong and that we ought to change the production code. In practice, these qualities are all related to and support each other. Test-driven development combines testing, specification, and design into one holistic activity.</blockquote>

<p>I just ran it at the <span class="caps">BBC </span>and people seemed to like it.</p>

<p>If you miss this opportunity, you can always see it at <a href="http://www.m3p.co.uk/blog/2009/10/30/qcon-san-francisco/">QCon San Francisco</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.higherorderlogic.com/2009/10/friday-13th-talking-at-skills-matter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>QCon San Francisco</title>
		<link>http://www.higherorderlogic.com/2009/10/qcon-san-francisco/</link>
		<comments>http://www.higherorderlogic.com/2009/10/qcon-san-francisco/#comments</comments>
		<pubDate>Fri, 30 Oct 2009 15:02:22 +0000</pubDate>
		<dc:creator>steve.freeman</dc:creator>
				<category><![CDATA[Events]]></category>
		<category><![CDATA[Test-Driven]]></category>

		<guid isPermaLink="false">http://www.m3p.co.uk/?p=327</guid>
		<description><![CDATA[I&#8217;m running a track at QCon in San Francisco on Friday 20th November. The topic is Technical Skills for Agile Development, and it&#8217;s about some of the technical essentials that Agile teams need to keep moving. I&#8217;ll be presenting a session, based on material from our book, on how to live with your tests over [...]]]></description>
			<content:encoded><![CDATA[<img src="/images/qcon-logo-basic.jpeg" alt="QCon" width="120px" style="float: right; border: none; padding: 5px;"/><p style="text-align: justify;">I&#8217;m running a track at <a href="http://qconsf.com/sf2009/">QCon in San Francisco</a> on Friday 20th November. The topic is <a href="http://qconsf.com/sf2009/tracks/show_track.jsp?trackOID=299">Technical Skills for Agile Development</a>, and it&#8217;s about some of the technical essentials that Agile teams need to keep moving. </p>

<p>I&#8217;ll be presenting <a href="http://qconsf.com/sf2009/presentation/Sustainable+Test-Driven+Development">a session</a>, based on material from <a href="http://www.growing-object-oriented-software.com/">our book</a>, on how to live with your tests over the long term.</p>

<p>See you there?</p>]]></content:encoded>
			<wfw:commentRss>http://www.higherorderlogic.com/2009/10/qcon-san-francisco/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Test-Driven Development is not an elite technique.</title>
		<link>http://www.higherorderlogic.com/2009/10/tdd-is-not-elite/</link>
		<comments>http://www.higherorderlogic.com/2009/10/tdd-is-not-elite/#comments</comments>
		<pubDate>Wed, 21 Oct 2009 11:11:46 +0000</pubDate>
		<dc:creator>steve.freeman</dc:creator>
				<category><![CDATA[Software culture]]></category>
		<category><![CDATA[Test-Driven]]></category>

		<guid isPermaLink="false">http://www.m3p.co.uk/?p=312</guid>
		<description><![CDATA[This &#8220;Darwinian&#8221; post that TDD Is Not For the Weak says that not everyone can cope with TDD, it&#8217;s for &#8220;the Alpha, the strong, the experienced&#8221;. I don&#8217;t want to believe this, because I think that developers who can&#8217;t cope with any level of TDD shouldn&#8217;t be coding at all, so I won&#8217;t. This claim [...]]]></description>
			<content:encoded><![CDATA[<p>This &#8220;Darwinian&#8221; post that <a href="http://blog.typemock.com/2009/10/tdd-is-not-for-weak.html"><span class="caps">TDD</span> Is Not For the Weak</a> says that not everyone can cope with <span class="caps">TDD, </span>it&#8217;s for &#8220;the Alpha, the strong, the experienced&#8221;. I don&#8217;t <em>want</em> to believe this, because I think that developers who can&#8217;t cope with any level of <span class="caps">TDD </span>shouldn&#8217;t be coding at all, so I won&#8217;t. </p>

<p>This claim has been made for every technical innovation I&#8217;ve seen so far (objects, event-driven programming, etc, etc). Sometimes it&#8217;s true, but most of the time it&#8217;s about what people are used to. Michael Feathers pointed out <a href="http://blog.objectmentor.com/articles/2009/07/13/ending-the-era-of-patronizing-language-design">a while ago</a> that the Ruby community is happily exploiting techniques such as meta-programming that were traditionally regarded as needing a safe pair of hands. What&#8217;s changed is that a generation has grown up with meta-programming and doesn&#8217;t regard it as problematic. Of course, there will be a degradation in understanding as an idea rolls out beyond its originators, but there&#8217;s still some value that gets through.</p>

<p>Sure there&#8217;s a role for people to help the generation that is struggling to pick up a new technique, but that doesn&#8217;t mean that <span class="caps">TDD </span>itself will always be beyond the range of mortal developers.</p>]]></content:encoded>
			<wfw:commentRss>http://www.higherorderlogic.com/2009/10/tdd-is-not-elite/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Keep tests concrete</title>
		<link>http://www.higherorderlogic.com/2009/09/keep-tests-concrete/</link>
		<comments>http://www.higherorderlogic.com/2009/09/keep-tests-concrete/#comments</comments>
		<pubDate>Mon, 07 Sep 2009 12:01:07 +0000</pubDate>
		<dc:creator>steve.freeman</dc:creator>
				<category><![CDATA[Agile Programming]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[Test-Driven]]></category>

		<guid isPermaLink="false">http://www.m3p.co.uk/?p=244</guid>
		<description><![CDATA[This popped up on a technical discussion site recently. The original question was how to write tests for code that invokes a method on particular values in a list. The problem was that the tests were messy, and the author was looking for a cleaner alternative. Here&#8217;s the example test, it asserts that the even-positioned [...]]]></description>
			<content:encoded><![CDATA[<p>This popped up on a technical discussion site recently. The original question was how to write tests for code that invokes a method on particular values in a list. The problem was that the tests were messy, and the author was looking for a cleaner alternative. Here&#8217;s the example test, it asserts that the even-positioned elements in the parameters are passed to <code>bar</code> in the appropriate sequence.</p>


<pre>public void testExecuteEven() {
  Mockery mockery = new Mockery();

  final Bar bar = mockery.mock(Bar.class);
  final Sequence sequence = new NamedSequence(&quot;sequence&quot;);

  final List&lt;String&gt; allParameters = new ArrayList&lt;String&gt;();
  final List&lt;String&gt; expectedParameters = new ArrayList&lt;String&gt;();

  for (int i = 0; i &lt; 3; i++) {
    allParameters.add(&quot;param&quot; + i);
    if (i % 2 == 0) {
      expectedParameters.add(&quot;param&quot; + i);
    }
  }
  final Iterator&lt;String&gt; iter = expectedParameters.iterator();

  mockery.checking(new Expectations() {
   {
     while (iter.hasNext()) {
       one(bar).doIt(iter.next());
        inSequence(sequence);
      }
    }
  });

  Foo subject = new Foo();
  subject.setBar(bar);
  subject.executeEven(allParameters);
  mockery.assertIsSatisfied();
}</pre>


<p>The intentions of the test are good, but its most striking feature is that there&#8217;s so much computation going on. This doesn&#8217;t need a new technique to make it more readable, it just needs to be simplified.</p>
<p>A unit test should be small and focussed enough that we don&#8217;t need any general behaviour. It just has to deal with one example, so we can make it as concrete as we like. With that in mind, we can collapse the test to this:</p>


<pre>public void testCallsDoItOnEvenIndexedElementsInList() {
  final Mockery mockery = new Mockery();
  final Bar bar = mockery.mock(Bar.class);
  final Sequence evens = mockery.sequence(&quot;evens&quot;);

  final  List&lt;String&gt; params = 
    Arrays.asList(&quot;param0&quot;, &quot;param1&quot;, &quot;param2&quot;, &quot;param3&quot;);

  mockery.checking(new Expectations() {{
    oneOf(bar).doIt(params.get(0)); inSequence(evens);
    oneOf(bar).doIt(params.get(2)); inSequence(evens);
  }});

  Foo subject = new Foo();
  subject.setBar(bar);
  subject.executeEven(params);
  mockery.assertIsSatisfied();
}</pre>


<p>To me, this is more direct, a simpler statement of the example&mdash;if nothing else, there&#8217;s just less code to understand. I don&#8217;t need any loops because there aren&#8217;t enough values to justify them. The expectations are clearer because they show the indices of the elements I want from the list (an alternative would have been to put in the expected values directly). And if I pulled the common features, such as the mockery and the target object, into the test class, the test would be even shorter.</p>
<p>The short version of this post is: be wary of any general behaviour written into a unit test. The scope should be small enough that values can be coded directly. Be especially wary of anything with an <code>if</code> statement. If the data setup is more complicated, then consider using a <a href="http://nat.truemesh.com/archives/000714.html">Test Data Builder</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.higherorderlogic.com/2009/09/keep-tests-concrete/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java synchronisation bug on OS/X?</title>
		<link>http://www.higherorderlogic.com/2009/03/java-synchronisation-bug-on-osx/</link>
		<comments>http://www.higherorderlogic.com/2009/03/java-synchronisation-bug-on-osx/#comments</comments>
		<pubDate>Wed, 18 Mar 2009 11:06:42 +0000</pubDate>
		<dc:creator>steve.freeman</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Test-Driven]]></category>

		<guid isPermaLink="false">http://www.m3p.co.uk/blog/2009/03/18/java-synchronisation-bug-on-osx/</guid>
		<description><![CDATA[I&#8217;ve come across what might be a synchronisation bug while working on the book. The end-to-end tests for our example application use the WindowLicker framework to drive the Swing user interface. Our test infrastructure starts the application up in another thread (it&#8217;s as close as we can get to running from the command line), then [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve come across what might be a synchronisation bug while working on <a href="http://www.mockobjects.com/book/">the book</a>.</p>

<p>The end-to-end tests for our example application use the <a href="http://code.google.com/p/windowlicker/"> WindowLicker</a> framework to drive the Swing user interface. Our test infrastructure starts the application up in another thread (it&#8217;s as close as we can get to running from the command line), then creates a WindowLicker driver which, eventually, creates a Java <span class="caps">AWT</span> Robot. It turns out (we think) that this means that we have two threads trying to load and initialise the <span class="caps">AWT </span>library in parallel, which hangs. Our workaround is to call a delaying method before creating the WindowLicker Driver:</p>


<pre>private void 
makeSureAwtIsLoadedBeforeStartingTheDriverOnOSXToStopDeadlock() {
  try {
    SwingUtilities.invokeAndWait(
      new Runnable() { public void run() {} });
  } catch (Exception e) {
    throw new Defect(e);
  }
}</pre>



<p>That&#8217;s not really what <code>invokeAndWait()</code> is for, but it solves our problem until we can find a better answer, and we hope that the hack is at least self-explanatory.</p>

<p>Does anyone have a better explanation or fix? OS/X 10.5.6, Java 1.5.0_16, White MacBook 2.4 GHz Intel Core Duo. <a href="http://www.natpryce.com">Nat</a>&#8216;s Linux installation works fine.</p>]]></content:encoded>
			<wfw:commentRss>http://www.higherorderlogic.com/2009/03/java-synchronisation-bug-on-osx/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Mock Roles not Objects, live and in person.</title>
		<link>http://www.higherorderlogic.com/2009/03/mock-roles-not-objects-live-and-in-person/</link>
		<comments>http://www.higherorderlogic.com/2009/03/mock-roles-not-objects-live-and-in-person/#comments</comments>
		<pubDate>Sun, 08 Mar 2009 22:07:51 +0000</pubDate>
		<dc:creator>steve.freeman</dc:creator>
				<category><![CDATA[Agile Programming]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[Test-Driven]]></category>

		<guid isPermaLink="false">http://www.m3p.co.uk/blog/2009/03/08/mock-roles-not-objects-live-and-in-person/</guid>
		<description><![CDATA[At the recent Software Craftsmanship conference in London, Willem and Marc ran a session on Responsibility-Driven Development with Mocks for about 30 people. Nat Pryce and I were sitting at the back watching and occasionally heckling. The first striking thing was that when Willem and Marc asked who was using &#8220;Mock Objects&#8221; most everyone put [...]]]></description>
			<content:encoded><![CDATA[<p>At the recent Software Craftsmanship conference in London, Willem and Marc ran <a href="http://parlezuml.com/softwarecraftsmanship/sessions/responsibility_driven_design_with_mock_objects.htm">a session on Responsibility-Driven Development with Mocks</a> for about 30 people. <a href="http://www.natpryce.com/">Nat Pryce</a> and I were sitting at the back watching and occasionally heckling. </p>

<p>The first striking thing was that when Willem and Marc asked who was using &#8220;Mock Objects&#8221; most everyone put their hand up (which was nice), but then only a handful also said they were thinking about Roles and Responsibilities when they did (which was frustrating). We first wrote up these ideas in our paper <a href="http://www.mockobjects.com/files/mockrolesnotobjects.pdf">&#8220;Mock Roles Not Objects&#8221;</a> and much of the difficulty we see people have with the technique of Mock Objects comes from focussing on classes rather than relationships.</p> 

<p>As it happens, an example popped up in the rest of the session, which was run as a Coding Dojo. What was interesting to me was how the group managed to turn around its design ideas. Here&#8217;s what I can remember about how it worked out.</p>

<p>The domain was some kind of game, with a hero who moves around an environment slaying dragons and so forth. The first couple of stories were to do with displaying the current room, and then moving from one room to another. It was a little difficult getting started because the limitations of the event didn&#8217;t allow enough time to really drive the design from outer-level requirements, but the group managed to get started with something like:</p>



<pre>describe Hero do
  it &quot;should describe its surroundings&quot; do
    hero = Hero.new(room)  
    
    room.stub!(:description).and_return(&quot;a room with twisty passages&quot;)
    
    console.should_receive(:show).with(&quot;in a room with twisty passages&quot;)
    hero.look(console)
  end
end</pre>

<p>  </p>

<p>The expectation here says that when looking, the hero should write a text describing the room to the console. This was a place to start, but it doesn&#8217;t look right. Why is a hero attached to a room? And <code>hero.look(console)</code> just doesn&#8217;t read well, it&#8217;s hard to tell what it means. The tensions became clearer with the next feature, which was to have the hero move from one room to another. If we write</p>



<pre>hero.move_to(other_room)</pre>


  <br />
<p>how can we tell that this has worked? We could ask the hero to <code>look()</code> again, but that means making an extra call for testing, which is not related to the intent of the test. We could ask the hero what his current room is, but that&#8217;s starting to leak into Asking rather than Telling. There may be a need for the hero to hold on to his current location, but we haven&#8217;t seen it yet.</p>

<p>Suddenly, it became clear that the dependencies were wrong. We already have a feature that can be told about the hero&#8217;s situation, which we can build on. If the feature were to be told about what is happening to the hero, we could use <em>that</em> to detect the change in room. So, our example now becomes:</p>



<pre>describe Hero do
  it &quot;should move to a room&quot; do
    hero = Hero.new(console)  
    
    room.stub!(:description).and_return(&quot;a room with twisty passages&quot;)
    
    console.should_receive(:show).with(&quot;in a room with twisty passages&quot;)
    
    hero.move_to(room)
  end
end</pre>



<p>That&#8217;s better, but it&#8217;s not finished. The term Console sounds like an implementation, not a role. Most of the sword-wielding adventurers that I know don&#8217;t know how to work a Console, but they&#8217;re quite happy to tell of their great deeds to, say, a Narrator (as <a href="http://blog.davidpeterson.co.uk/">David Peterson</a> suggested). If we adjust our example we get.</p>



<pre>describe Hero do
  it &quot;should move to a room&quot; do
    hero = Hero.new(narrator)  
    
    room.stub!(:description).and_return(&quot;a room with twisty passages&quot;)
    
    narrator.should_receive(:says).with(&quot;in a room with twisty passages&quot;)
    
    hero.move_to(room)
  end
end</pre>



<p>The whole example now reads as if it&#8217;s in the same domain, in the language of a <span class="caps">D&amp;D </span>game. It doesn&#8217;t refer to implementation details such as a Console&mdash;we might see that code when we get to the detailed implementation of a Narrator. Obviously, there&#8217;s a lot more we could do, for a start I&#8217;d like to see more structured messages between Hero and Narrator, but the session ran out of time at about this point.</p>

<p>Some lessons:</p>
<ol>
<li>Naming, naming, naming. It&#8217;s the most important thing. A coherent unit of code should have a coherent vocabulary, it should <em>read well</em>. If not, I&#8217;m probably mixing concepts which will make the code harder to understand and more brittle to change than it needs to be.</li>
<li>When I&#8217;m about to write a test, I ask &#8220;if this were to work, who would know&#8221;. That&#8217;s the most revealing question in B/TDD. If there&#8217;s no visible effect from an event, except perhaps for changing a field in the target object, then maybe it&#8217;s worth waiting until there is a visible effect, or maybe there&#8217;s a concept missing, or maybe the structure isn&#8217;t quite right. Before writing more code, I try to make sure I understand its motivation.</li>
</ol>

<p>Willem&#8217;s (and many other people&#8217;s) approach is slightly different. He likes to explore a bit further with the code before really sorting out the names, and he&#8217;s right that there&#8217;s a risk of Analysis-Paralysis. I do that occasionally, but my experience is that the effort of being really picky at this stage forces me to be clearer about what I&#8217;m trying to achieve, to ask those questions I really ought to have answers to, before I get in too deep.</p>]]></content:encoded>
			<wfw:commentRss>http://www.higherorderlogic.com/2009/03/mock-roles-not-objects-live-and-in-person/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>This man is corrupting the next generation&#8230;.</title>
		<link>http://www.higherorderlogic.com/2009/03/this-man-is-corrupting-the-next-generation/</link>
		<comments>http://www.higherorderlogic.com/2009/03/this-man-is-corrupting-the-next-generation/#comments</comments>
		<pubDate>Fri, 06 Mar 2009 18:16:51 +0000</pubDate>
		<dc:creator>steve.freeman</dc:creator>
				<category><![CDATA[Grumpy Old Man]]></category>
		<category><![CDATA[Test-Driven]]></category>

		<guid isPermaLink="false">http://www.m3p.co.uk/blog/2009/03/06/this-man-is-corrupting-the-next-generation/</guid>
		<description><![CDATA[Cay Horstmann, Professor of CS at San Jose State University, Sun Java Champion, and consultant in Internet Programming, says I perform an occasional unit test after I&#8217;ve encountered a failure that I don&#8217;t want to have recur, but I rarely write the tests first. If so many experienced developers don&#8217;t write unit tests, what does [...]]]></description>
			<content:encoded><![CDATA[<p>Cay Horstmann, Professor of CS at San Jose State University, Sun Java Champion, and consultant in Internet Programming, <a href="http://java.sun.com/developer/technicalArticles/Interviews/community/horstmann_qa.html">says</a></p>
<blockquote>I perform an occasional unit test after I&#8217;ve encountered a failure that I don&#8217;t want to have recur, but I rarely write the tests first. If so many experienced developers don&#8217;t write unit tests, what does that say? Maybe they would be even better developers if they followed Heinz&#8217;s advice. Maybe they don&#8217;t make many mistakes that unit tests would catch because they&#8217;re already experienced. The truth is probably somewhere in between.</blockquote>

<p>What that says is that we work in a horribly inefficient industry where too many developers spend their time fixing bugs (using the debugger) sent back upstream by the testers, and it <a href="http://www.m3p.co.uk/blog/2008/12/08/tdd-fewer-bugs-to-production-longer-to-write/">looks like there&#8217;s evidence</a> to prove it.</p>

<p style="font-size: 0.8em"><em>via</em> <a href="http://blog.livingroomarchitect.com/2008/10/do-you-write-unit-tests.html">Kerry Jones</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.higherorderlogic.com/2009/03/this-man-is-corrupting-the-next-generation/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Tips on Test-Driven Development</title>
		<link>http://www.higherorderlogic.com/2009/03/tips-on-test-driven-development/</link>
		<comments>http://www.higherorderlogic.com/2009/03/tips-on-test-driven-development/#comments</comments>
		<pubDate>Fri, 06 Mar 2009 11:55:21 +0000</pubDate>
		<dc:creator>steve.freeman</dc:creator>
				<category><![CDATA[Test-Driven]]></category>

		<guid isPermaLink="false">http://www.m3p.co.uk/blog/2009/03/06/tips-on-test-driven-development/</guid>
		<description><![CDATA[Just found this useful guide Anyone new to [TDD] should begin with a partner who is more experienced, not only because it is safer but also because one can learn from the other&#8217;s experience. Before starting the [TDD], it is important to have a general picture of the route and how it should be [TDD]&#8216;d. [...]]]></description>
			<content:encoded><![CDATA[<p>Just found this useful guide</p>

<blockquote>Anyone new to [TDD] should begin with a partner who is more experienced, not only because it is safer but also because one can learn from the other&#8217;s experience.</blockquote>

<blockquote>Before starting the [TDD], it is important to have a general picture of the route and how it should be [TDD]&#8216;d. If the [TDD] is long or has a crux, you should try to pick out in advance suitable spots to rest.</blockquote>

<blockquote>Three-point contact with the [code] is an important rule in [TDD] and should be followed where possible. [&hellip;] You should always have eye contact with your next [refactoring] before you start your move. Scrabbling blindly about for a [refactoring] is a waste of energy. Once started, each move should be short, decisive and smoothly executed. Long moves will tire you out quickly and beginners need to spare strength for the final section of the [TDD].</blockquote>

<p style="font-size: 0.9em">From p. 17 &ldquo;Rock Climbing Basics&rdquo;,  Johnston and Hallden, Stackpole Books, 1995</p>]]></content:encoded>
			<wfw:commentRss>http://www.higherorderlogic.com/2009/03/tips-on-test-driven-development/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>TDD: fewer bugs to production, longer to write</title>
		<link>http://www.higherorderlogic.com/2008/12/tdd-fewer-bugs-to-production-longer-to-write/</link>
		<comments>http://www.higherorderlogic.com/2008/12/tdd-fewer-bugs-to-production-longer-to-write/#comments</comments>
		<pubDate>Sun, 07 Dec 2008 23:55:32 +0000</pubDate>
		<dc:creator>steve.freeman</dc:creator>
				<category><![CDATA[Test-Driven]]></category>

		<guid isPermaLink="false">http://www.m3p.co.uk/blog/2008/12/08/tdd-fewer-bugs-to-production-longer-to-write/</guid>
		<description><![CDATA[This paper1 from Microsoft&#8217;s Empirical Software Measurement group reports that Case studies were conducted with three development teams at Microsoft and one at IBM that have adopted TDD. The results of the case studies indicate that the pre-release defect density of the four products decreased between 40% and 90% relative to similar projects that did [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://research.microsoft.com/en-us/projects/esm/nagappan_tdd.pdf">This paper</a><sup>1</sup> from Microsoft&#8217;s <a href="http://research.microsoft.com/esm/">Empirical Software Measurement</a> group reports that</p>

<blockquote>Case studies were conducted with three development teams at Microsoft and one at <span class="caps">IBM </span>that have adopted <span class="caps">TDD.</span> The results of the case studies indicate that the pre-release defect density of the four products decreased between 40% and 90% relative to similar projects that did not use the <span class="caps">TDD </span>practice. Subjectively, the teams experienced a 15-35% increase in initial development time after adopting <span class="caps">TDD.</span></blockquote>

<p>Reading the small print, these were not &ldquo;pure&rdquo; <span class="caps">TDD </span>teams since they did a lot of the requirement and design up-front. Still, a nice data point that suggests that, taking the cost of fixes into account, it&#8217;s worth taking the time to get it right.</p>

<p style="font-size: 0.9em; margin-left: 1em; text-indent: -1em;">1) &#8220;Realizing quality improvement through test driven development: results and experiences of four industrial teams&#8221; Nachiappan Nagappan, Michael Maximilien, Thirumalesh Bhat, Laurie Williams. <em>Empirical Software Engineering Journal</em>, Volume 13, Number 3, pp. 289-302, Springer 2008</p>]]></content:encoded>
			<wfw:commentRss>http://www.higherorderlogic.com/2008/12/tdd-fewer-bugs-to-production-longer-to-write/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
	</channel>
</rss>

