<?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>Richard Lawrence &#187; BDD</title>
	<atom:link href="http://www.richardlawrence.info/tag/bdd/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.richardlawrence.info</link>
	<description>On making software teams happier and more productive</description>
	<lastBuildDate>Fri, 27 Jan 2012 18:41:27 +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>Cucumber Tip: Key-Value Tables</title>
		<link>http://www.richardlawrence.info/2011/10/27/cucumber-tip-key-value-tables/</link>
		<comments>http://www.richardlawrence.info/2011/10/27/cucumber-tip-key-value-tables/#comments</comments>
		<pubDate>Thu, 27 Oct 2011 21:38:28 +0000</pubDate>
		<dc:creator>Richard Lawrence</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[ATDD]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[Cucumber]]></category>

		<guid isPermaLink="false">http://www.richardlawrence.info/?p=375</guid>
		<description><![CDATA[You may not realize this: Tables in Cucumber steps don&#8217;t have to have a header row. Sometimes it can work really well to use a headerless table of key-value pairs. Let&#8217;s look at an example. Suppose we have a scenario that fills out an advanced search form to search for medical providers matching certain criteria. [...]


Related posts:<ol><li><a href='http://www.richardlawrence.info/2010/01/04/how-to-remove-duplication-in-cucumber-tests-using-scenario-outlines/' rel='bookmark' title='Permanent Link: How to Remove Duplication in Cucumber Tests Using Scenario Outlines'>How to Remove Duplication in Cucumber Tests Using Scenario Outlines</a></li>
<li><a href='http://www.richardlawrence.info/2009/09/19/cuke4nuke-cucumber-for-net-teams/' rel='bookmark' title='Permanent Link: Cuke4Nuke: Cucumber for .NET Teams'>Cuke4Nuke: Cucumber for .NET Teams</a></li>
<li><a href='http://www.richardlawrence.info/2010/07/20/just-enough-regular-expressions-for-cucumber/' rel='bookmark' title='Permanent Link: Just Enough Regular Expressions for Cucumber'>Just Enough Regular Expressions for Cucumber</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p></p><p>You may not realize this: Tables in Cucumber steps don&#8217;t have to have a header row. Sometimes it can work really well to use a headerless table of key-value pairs. </p>
<p>Let&#8217;s look at an example. Suppose we have a scenario that fills out an advanced search form to search for medical providers matching certain criteria. A mockup of the form looks something like this:</p>
<p><img src="/wp-content/uploads/2011/10/medical-provider-advanced-search-form.png" alt="" title="Advanced Provider Search Mock-up" width="358" height="544" class="aligncenter size-full wp-image-378" /></p>
<p>If we were using the <a href="http://aslakhellesoy.com/post/11055981222/the-training-wheels-came-off">recently deprecated web steps</a> generated by cucumber-rails, we might write steps to perform a search like these:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Given I'm on the advanced search page<br />
And I select &quot;Endocrinology&quot; from &quot;Specialty&quot;<br />
And I choose &quot;Yes&quot; within &quot;Accepts Insurance&quot;<br />
And I fill in &quot;ZIP Code&quot; with &quot;90010&quot;<br />
And I select &quot;5 miles&quot; from &quot;Search Radius&quot;<br />
When I press &quot;Search&quot;</div></td></tr></tbody></table></div>
<p>But we know better than to do that, right? After all, we&#8217;re trying to describe how the search logic should work, not how the form should look. <span id="more-375"></span>So we try to write our own steps to do these same thing without talking about the implementation so much, but it&#8217;s really hard to get away from the implementation. Even if we drive out words like select, fill in, and click, we still have a step per form element. </p>
<p>Suppose we try to combine them into a single step for the domain concept of performing a search. We might get something like:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">When I search for an endocrinologist within 5 miles of 90010 who accepts insurance</div></td></tr></tbody></table></div>
<p>The implementation details are gone, but it&#8217;s long and hard to read. Enter the key-value table:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">When I search for a provider with the criteria:<br />
&nbsp;| Provider Type &nbsp; &nbsp; | Doctor &nbsp; &nbsp; &nbsp; &nbsp;|<br />
&nbsp;| Specialty &nbsp; &nbsp; &nbsp; &nbsp; | Endocrinology |<br />
&nbsp;| Accepts Insurance | Yes &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |<br />
&nbsp;| ZIP &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | 90010 &nbsp; &nbsp; &nbsp; &nbsp; |<br />
&nbsp;| Search Radius &nbsp; &nbsp; | 5 miles &nbsp; &nbsp; &nbsp; |</div></td></tr></tbody></table></div>
<p>In the step definition, we can use the <code class="codecolorer ruby default"><span class="ruby">rows_hash</span></code> method on the table object to convert that key-value table to a single hash. There&#8217;s no need to iterate through the rows ourselves. For example, assuming a helper method called <code class="codecolorer ruby default"><span class="ruby">provider_search</span></code> that actually performs the search,</p>
<div class="codecolorer-container ruby default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#9966CC; font-weight:bold;">When</span> <span style="color:#006600; font-weight:bold;">/</span>^I search <span style="color:#9966CC; font-weight:bold;">for</span> a provider with the criteria:$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>table<span style="color:#006600; font-weight:bold;">|</span><br />
&nbsp; criteria = table.<span style="color:#9900CC;">rows_hash</span><br />
&nbsp; provider_search <span style="color:#ff3333; font-weight:bold;">:provider_type</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> criteria<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'Provider Type'</span><span style="color:#006600; font-weight:bold;">&#93;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#ff3333; font-weight:bold;">:specialty</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> criteria<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'Specialty'</span><span style="color:#006600; font-weight:bold;">&#93;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#ff3333; font-weight:bold;">:accepts_insurance</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> criteria<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'Accepts Insurance'</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">to_bool</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#ff3333; font-weight:bold;">:zip_code</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> criteria<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'ZIP'</span><span style="color:#006600; font-weight:bold;">&#93;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#ff3333; font-weight:bold;">:radius</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> criteria<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'Search Radius'</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">to_i</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></td></tr></tbody></table></div>
<p>You may have noticed the call to <code class="codecolorer ruby default"><span class="ruby">to_bool</span></code>. This uses a helper method like the following to allow us to use <em>yes</em> and <em>no</em> instead of <em>true</em> and <em>false</em> to make more readable scenarios. Put this somewhere in the support directory.</p>
<div class="codecolorer-container ruby default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#9966CC; font-weight:bold;">class</span> <span style="color:#CC0066; font-weight:bold;">String</span><br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">def</span> to_bool<br />
&nbsp; &nbsp; !!<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF; font-weight:bold;">self</span> =~ <span style="color:#006600; font-weight:bold;">/</span>^yes<span style="color:#006600; font-weight:bold;">|</span>y<span style="color:#006600; font-weight:bold;">|</span>true<span style="color:#006600; font-weight:bold;">|</span>t<span style="color:#006600; font-weight:bold;">|</span><span style="color:#006666;">1</span>$<span style="color:#006600; font-weight:bold;">/</span>i<span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></td></tr></tbody></table></div>
<p>The call to <code class="codecolorer ruby default"><span class="ruby">to_i</span></code> on the search radius takes advantage of Ruby&#8217;s string to integer conversion behavior—if a string starts with an integer but has other text after the integer, the other text is stripped off during the conversion. Try it: Fire up <code class="codecolorer text default"><span class="text">irb</span></code> (the interactive Ruby console) in a command window and run <code class="codecolorer ruby default"><span class="ruby"><span style="color:#996600;">&quot;5 miles&quot;</span>.<span style="color:#9900CC;">to_i</span></span></code>.</p>
<p>These key-value tables can get long for a complex entity. Not all the details will matter each time. We can make the step read better by introducing a concept of a default provider search. Maybe we have to supply a ZIP code and search radius, but the scenario we&#8217;re working on is really about specialties and insurance. We could say,</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">When I search for a provider with the default criteria and:<br />
&nbsp;| Provider Type &nbsp; &nbsp; | Doctor &nbsp; &nbsp; &nbsp; &nbsp;|<br />
&nbsp;| Specialty &nbsp; &nbsp; &nbsp; &nbsp; | Endocrinology |<br />
&nbsp;| Accepts Insurance | Yes &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |</div></td></tr></tbody></table></div>
<p>In the step definition, we&#8217;ll declare the default values in a hash and merge it with the supplied values.</p>
<div class="codecolorer-container ruby default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br /></div></td><td><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#9966CC; font-weight:bold;">When</span> <span style="color:#006600; font-weight:bold;">/</span>^I search <span style="color:#9966CC; font-weight:bold;">for</span> a provider with the default criteria <span style="color:#9966CC; font-weight:bold;">and</span>:$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>table<span style="color:#006600; font-weight:bold;">|</span><br />
&nbsp; default_criteria = <span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; &nbsp; <span style="color:#996600;">'Provider Type'</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'Doctor'</span>,<br />
&nbsp; &nbsp; <span style="color:#996600;">'Specialty'</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'General'</span>,<br />
&nbsp; &nbsp; <span style="color:#996600;">'Accepts Insurance'</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'Yes'</span>,<br />
&nbsp; &nbsp; <span style="color:#996600;">'ZIP'</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006666;">90010</span>,<br />
&nbsp; &nbsp; <span style="color:#996600;">'Search Radius'</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'5 miles'</span><br />
&nbsp; <span style="color:#006600; font-weight:bold;">&#125;</span><br />
<br />
&nbsp; criteria = default_criteria.<span style="color:#9900CC;">merge</span><span style="color:#006600; font-weight:bold;">&#40;</span>table.<span style="color:#9900CC;">rows_hash</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; provider_search <span style="color:#ff3333; font-weight:bold;">:provider_type</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> criteria<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'Provider Type'</span><span style="color:#006600; font-weight:bold;">&#93;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#ff3333; font-weight:bold;">:specialty</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> criteria<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'Specialty'</span><span style="color:#006600; font-weight:bold;">&#93;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#ff3333; font-weight:bold;">:accepts_insurance</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> criteria<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'Accepts Insurance'</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">to_bool</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#ff3333; font-weight:bold;">:zip_code</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> criteria<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'ZIP'</span><span style="color:#006600; font-weight:bold;">&#93;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#ff3333; font-weight:bold;">:radius</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> criteria<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'Search Radius'</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">to_i</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></td></tr></tbody></table></div>
<p>If the defaults are well known, this is enough. If they need to be documented, one way I like to do it is as executable documentation with a scenario like this:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Scenario: Default Search Criteria<br />
&nbsp; When I search for a provider with the default criteria<br />
&nbsp; Then the search criteria should include:<br />
&nbsp; &nbsp;| Provider Type &nbsp; &nbsp; | Doctor &nbsp; &nbsp; &nbsp; &nbsp;|<br />
&nbsp; &nbsp;| Specialty &nbsp; &nbsp; &nbsp; &nbsp; | General &nbsp; &nbsp; &nbsp; |<br />
&nbsp; &nbsp;| Accepts Insurance | Yes &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |<br />
&nbsp; &nbsp;| ZIP &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | 90010 &nbsp; &nbsp; &nbsp; &nbsp; |<br />
&nbsp; &nbsp;| Search Radius &nbsp; &nbsp; | 5 miles &nbsp; &nbsp; &nbsp; |</div></td></tr></tbody></table></div>
<p>If you do this, you&#8217;ll want to move the default criteria hash into a helper method or constant to make sure it&#8217;s the same hash used in the real scenario and the documentation scenario.</p>
<p>We could make the step definition read better by separating the key and value conversions from the use of the data. Cucumber&#8217;s table object has <code class="codecolorer ruby default"><span class="ruby">map_headers!</span></code> and <code class="codecolorer ruby default"><span class="ruby">map_column!</span></code>. Unfortunately, those don&#8217;t work for <code class="codecolorer ruby default"><span class="ruby">rows_hash</span></code> at this time. I recently submitted a pull request to make it work. Hopefully, we&#8217;ll see that in a Cucumber release soon.</p>


<p>Related posts:<ol><li><a href='http://www.richardlawrence.info/2010/01/04/how-to-remove-duplication-in-cucumber-tests-using-scenario-outlines/' rel='bookmark' title='Permanent Link: How to Remove Duplication in Cucumber Tests Using Scenario Outlines'>How to Remove Duplication in Cucumber Tests Using Scenario Outlines</a></li>
<li><a href='http://www.richardlawrence.info/2009/09/19/cuke4nuke-cucumber-for-net-teams/' rel='bookmark' title='Permanent Link: Cuke4Nuke: Cucumber for .NET Teams'>Cuke4Nuke: Cucumber for .NET Teams</a></li>
<li><a href='http://www.richardlawrence.info/2010/07/20/just-enough-regular-expressions-for-cucumber/' rel='bookmark' title='Permanent Link: Just Enough Regular Expressions for Cucumber'>Just Enough Regular Expressions for Cucumber</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.richardlawrence.info/2011/10/27/cucumber-tip-key-value-tables/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>The Future of Cucumber on .NET</title>
		<link>http://www.richardlawrence.info/2011/10/21/the-future-of-cucumber-on-net/</link>
		<comments>http://www.richardlawrence.info/2011/10/21/the-future-of-cucumber-on-net/#comments</comments>
		<pubDate>Fri, 21 Oct 2011 17:56:14 +0000</pubDate>
		<dc:creator>Richard Lawrence</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[ATDD]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[Cucumber]]></category>
		<category><![CDATA[Cuke4Nuke]]></category>
		<category><![CDATA[SpecFlow]]></category>

		<guid isPermaLink="false">http://www.richardlawrence.info/?p=371</guid>
		<description><![CDATA[Beginning just over two years ago, I worked with some great developers to create Cuke4Nuke as a way to bring Cucumber to .NET. Shortly after the first releases of Cuke4Nuke, TechTalk released SpecFlow, a native .NET tool inspired by Cucumber. As a pure .NET solution without Ruby dependencies, SpecFlow seemed to be easier for Microsoft [...]


Related posts:<ol><li><a href='http://www.richardlawrence.info/2011/03/05/cuke4nuke-needs-your-help/' rel='bookmark' title='Permanent Link: Cuke4Nuke Needs Your Help'>Cuke4Nuke Needs Your Help</a></li>
<li><a href='http://www.richardlawrence.info/2009/09/19/cuke4nuke-cucumber-for-net-teams/' rel='bookmark' title='Permanent Link: Cuke4Nuke: Cucumber for .NET Teams'>Cuke4Nuke: Cucumber for .NET Teams</a></li>
<li><a href='http://www.richardlawrence.info/2009/12/30/the-latest-on-cuke4nuke/' rel='bookmark' title='Permanent Link: The Latest on Cuke4Nuke'>The Latest on Cuke4Nuke</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p></p><p>Beginning just over two years ago, I worked with some great developers to create <a href="https://github.com/richardlawrence/Cuke4Nuke">Cuke4Nuke</a> as a way to bring <a href="http://cukes.info/">Cucumber</a> to .NET. Shortly after the first releases of Cuke4Nuke, TechTalk released <a href="http://www.specflow.org/">SpecFlow</a>, a native .NET tool inspired by Cucumber. As a pure .NET solution without Ruby dependencies, SpecFlow seemed to be easier for Microsoft shops to adopt. But Cuke4Nuke had (to me) enough advantages that I kept it going. </p>
<p>By this summer, however, it was clear that SpecFlow had made up for most of Cuke4Nuke&#8217;s advantages and had more momentum in the .NET community and was under much more active development. <span id="more-371"></span>There were just a few gaps SpecFlow needed to overcome (in my opinion), mostly related to better harmonization with the other Cucumber projects. (With the pure Java Cucumber-JVM under active development as a Cuke4Duke replacement, there was no longer as compelling an argument for shared code between Cucumber versions, Cuke4Nuke&#8217;s biggest remaining advantage.)</p>
<p>At AA-FTT and later in the week at Agile 2011, my colleague <a href="http://www.virtual-genius.com">Paul Rayner</a> and I met with Christian Hassa and Gaspar Nagy from the SpecFlow team. We discussed the few things that needed to change in SpecFlow to make it behave more like the other Cucumbers. </p>
<p>This week, most of those changes were released as part of SpecFlow 1.8. With that release, I&#8217;m letting Cuke4Nuke die. I won&#8217;t be maintaining or extending Cuke4Nuke. My Cucumber classes and book will cover SpecFlow rather than Cuke4Nuke. </p>
<p>I&#8217;ve had a great time getting to know the SpecFlow guys, and I look forward to collaborating with them in the future to help bring Cucumber to more and more teams in the Microsoft world.</p>


<p>Related posts:<ol><li><a href='http://www.richardlawrence.info/2011/03/05/cuke4nuke-needs-your-help/' rel='bookmark' title='Permanent Link: Cuke4Nuke Needs Your Help'>Cuke4Nuke Needs Your Help</a></li>
<li><a href='http://www.richardlawrence.info/2009/09/19/cuke4nuke-cucumber-for-net-teams/' rel='bookmark' title='Permanent Link: Cuke4Nuke: Cucumber for .NET Teams'>Cuke4Nuke: Cucumber for .NET Teams</a></li>
<li><a href='http://www.richardlawrence.info/2009/12/30/the-latest-on-cuke4nuke/' rel='bookmark' title='Permanent Link: The Latest on Cuke4Nuke'>The Latest on Cuke4Nuke</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.richardlawrence.info/2011/10/21/the-future-of-cucumber-on-net/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Just Enough Regular Expressions for Cucumber</title>
		<link>http://www.richardlawrence.info/2010/07/20/just-enough-regular-expressions-for-cucumber/</link>
		<comments>http://www.richardlawrence.info/2010/07/20/just-enough-regular-expressions-for-cucumber/#comments</comments>
		<pubDate>Tue, 20 Jul 2010 21:38:50 +0000</pubDate>
		<dc:creator>Richard Lawrence</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[ATDD]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[Cucumber]]></category>
		<category><![CDATA[Cuke4Nuke]]></category>
		<category><![CDATA[regular expressions]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://www.richardlawrence.info/?p=261</guid>
		<description><![CDATA[Jon Archer wrote last week about how Cucumber makes knowledge of regular expressions important. He&#8217;s right: Regular expressions are the key to Cucumber&#8217;s flexibility. Well-crafted regular expressions let you reuse step definitions, avoiding duplication and keeping your tests maintainable. But even experienced developers find them mysterious and overwhelming. Fortunately, you don&#8217;t need regular expressions like [...]


Related posts:<ol><li><a href='http://www.richardlawrence.info/2009/09/19/cuke4nuke-cucumber-for-net-teams/' rel='bookmark' title='Permanent Link: Cuke4Nuke: Cucumber for .NET Teams'>Cuke4Nuke: Cucumber for .NET Teams</a></li>
<li><a href='http://www.richardlawrence.info/2010/01/12/debugging-cuke4nuke-step-definitions/' rel='bookmark' title='Permanent Link: Debugging Cuke4Nuke Step Definitions'>Debugging Cuke4Nuke Step Definitions</a></li>
<li><a href='http://www.richardlawrence.info/2010/01/04/how-to-remove-duplication-in-cucumber-tests-using-scenario-outlines/' rel='bookmark' title='Permanent Link: How to Remove Duplication in Cucumber Tests Using Scenario Outlines'>How to Remove Duplication in Cucumber Tests Using Scenario Outlines</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p></p><p>Jon Archer wrote last week about how <a href="http://www.jonarcher.com/2010/07/cucumbers-and-why-it-suddenly-matters.html">Cucumber makes knowledge of regular expressions important</a>. He&#8217;s right: Regular expressions are the key to Cucumber&#8217;s flexibility. Well-crafted regular expressions let you reuse step definitions, avoiding duplication and keeping your tests maintainable. But even experienced developers find them mysterious and overwhelming.</p>
<p>Fortunately, you don&#8217;t need regular expressions like this one to wield the power of Cucumber:</p>
<div class="codecolorer-container text default" style="border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">(?:[a-z0-9!#$%&amp;'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&amp;'*+/=?^_`{|}~-]+)*|&quot;(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*&quot;)@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])</div></td></tr></tbody></table></div>
<p>In fact, if you use regular expressions like this in your step definitions, you&#8217;ve gone too far. (This regular expression, in case you&#8217;re wondering, matches the official spec for valid email addresses.)</p>
<p>As with most things, the 80/20 rule applies. There are a handful of useful patterns that are sufficient to make you a Cucumber power user. <span id="more-261"></span></p>
<h3>Anchors</h3>
<p>The regular expression <code class="codecolorer text default"><span class="text">I'm logged in</span></code> matches <code class="codecolorer text default"><span class="text">I'm logged in</span></code> and <code class="codecolorer text default"><span class="text">I'm logged in as an admin</span></code>. To avoid ambiguous matches, use <code class="codecolorer text default"><span class="text">^I'm logged in$</span></code>.</p>
<p>The caret at the beginning anchors to the beginning of the string. The dollar at the end does the same with the end of the string. Use these with all your step definitions and you won&#8217;t have surprise matches.</p>
<h3>Wildcards and quantifiers</h3>
<p>Matching specific words is fine. But you often want flexibility to match a variety of strings. Here are some common patterns for non-exact matches.</p>
<table border="0">
<tr>
<td><code class="codecolorer text default"><span class="text">.*</span></code></td>
<td>matches anything (or nothing), literally &#8220;any character (except a newline) 0 or more times&#8221;</td>
</tr>
<tr>
<td><code class="codecolorer text default"><span class="text">.+</span></code></td>
<td>matches at least one of anything</td>
</tr>
<tr>
<td nowrap="true" style="padding-right:1em;"><code class="codecolorer text default"><span class="text">[0-9]*</span></code> or <code class="codecolorer text default"><span class="text">\d*</span></code></td>
<td>matches a series of digits (or nothing)</td>
</tr>
<tr>
<td><code class="codecolorer text default"><span class="text">[0-9]+</span></code> or <code class="codecolorer text default"><span class="text">\d+</span></code></td>
<td>matches one or more digits</td>
</tr>
<tr>
<td><code class="codecolorer text default"><span class="text">&quot;[^\&quot;]*&quot;</span></code></td>
<td>matches something (or nothing) in double quotes</td>
</tr>
<tr>
<td><code class="codecolorer text default"><span class="text">an?</span></code></td>
<td>matches <em>a</em> or <em>an</em> (the question mark makes the <em>n</em> optional)</td>
</tr>
</table>
<p>&nbsp;</p>
<h3>Capturing and not capturing</h3>
<p>When you put part of a regular expression in parentheses, whatever it matches gets captured for use later. This is known as a &#8220;capture group.&#8221; In Cucumber, captured strings become step definition parameters. Typically, if you&#8217;re using a wildcard, you probably want to capture the matching value for use in your step definition. Here&#8217;s a Cuke4Nuke example,</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #008000;">&#91;</span>Given<span style="color: #008000;">&#40;</span><span style="color: #666666;">@&quot;^I'm logged in as an? (.*)$&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#93;</span><br />
<span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> ImLoggedInAsA<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span> role<span style="color: #008000;">&#41;</span><br />
<span style="color: #008000;">&#123;</span><br />
&nbsp; <span style="color: #008080; font-style: italic;">// log in as the given role</span><br />
<span style="color: #008000;">&#125;</span></div></td></tr></tbody></table></div>
<p>If your step is <code class="codecolorer text default"><span class="text">Given I'm logged in as an admin</span></code>, then the step definition gets passed <code class="codecolorer csharp default"><span class="csharp"><span style="color: #666666;">&quot;admin&quot;</span></span></code> for <code class="codecolorer csharp default"><span class="csharp">role</span></code>.</p>
<p>Cuke4Nuke converts captured strings to the step definition parameter type, which is handy for step definitions like this:</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #008000;">&#91;</span>Given<span style="color: #008000;">&#40;</span><span style="color: #666666;">@&quot;^I have (\d+) cukes$&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#93;</span><br />
<span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> IHaveNCukes<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">int</span> cukeCount<span style="color: #008000;">&#41;</span><br />
<span style="color: #008000;">&#123;</span><br />
&nbsp; <span style="color: #008080; font-style: italic;">// set up the given number of cukes</span><br />
<span style="color: #008000;">&#125;</span></div></td></tr></tbody></table></div>
<p>The step <code class="codecolorer text default"><span class="text">Given I have 42 cukes</span></code> means the step definition gets called with <code class="codecolorer csharp default"><span class="csharp"><span style="color: #FF0000;">42</span></span></code> (as an integer) for <code class="codecolorer csharp default"><span class="csharp">cukeCount</span></code>.</p>
<p>Sometimes, you have to use parentheses to get a regular expression to work, but you don&#8217;t want to capture the match.</p>
<p>For example, suppose I want to be able to match both <code class="codecolorer text default"><span class="text">When I log in as an admin</span></code> and <code class="codecolorer text default"><span class="text">Given I'm logged in as an admin</span></code>. After all, both step definitions do the same thing. There&#8217;s no reason to have duplicated automation code in my step definitions simply because one is a Given and one is a When.</p>
<p>I might write something like this:</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #008000;">&#91;</span>When<span style="color: #008000;">&#40;</span><span style="color: #666666;">@&quot;^(I'm logged|I log) in as an? (.*)$&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#93;</span><br />
<span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> LogInAs<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span> role<span style="color: #008000;">&#41;</span><br />
<span style="color: #008000;">&#123;</span><br />
&nbsp; <span style="color: #008080; font-style: italic;">// log in as the given role</span><br />
<span style="color: #008000;">&#125;</span></div></td></tr></tbody></table></div>
<p>The parentheses and pipe indicate a logical OR, just what I need to match two different strings.</p>
<p>This will fail to run, though. My regular expression is capturing two strings, but my step definition method only takes one. I need to designate the first group as non-capturing like this:</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #008000;">&#91;</span>When<span style="color: #008000;">&#40;</span><span style="color: #666666;">@&quot;^(?:I'm logged|I log) in as an? (.*)$&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#93;</span><br />
<span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> LogInAs<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span> role<span style="color: #008000;">&#41;</span><br />
<span style="color: #008000;">&#123;</span><br />
&nbsp; <span style="color: #008080; font-style: italic;">// log in as the given role</span><br />
<span style="color: #008000;">&#125;</span></div></td></tr></tbody></table></div>
<p>Now, with the addition of <code class="codecolorer text default"><span class="text">?:</span></code> at the beginning of the group, it will perform as I expect.</p>
<p>By the way: You may be wondering how the attribute can be When and still match <code class="codecolorer text default"><span class="text">Given I'm logged in as an admin</span></code>. It turns out that in Cuke4Nuke, just like in Cucumber for Ruby, it doesn&#8217;t matter whether you use Given, When, or Then to define a step definition. They&#8217;re all step definitions and are interchangeable. It&#8217;s fairly common for today&#8217;s When to be tomorrow&#8217;s Given, so this is a nice feature.</p>
<h3>Just enough</h3>
<p>This is only the tip of the regular expression iceberg. Here&#8217;s a <a href="http://www.amazon.com/exec/obidos/ASIN/0596520689">book</a> and <a href="http://www.regular-expressions.info/">website</a> if you&#8217;re interested in going deeper. But for day-to-day work with Cucumber, anchors, simple wildcards and quantifiers, and capturing and non-capturing groups are all you need.</p>


<p>Related posts:<ol><li><a href='http://www.richardlawrence.info/2009/09/19/cuke4nuke-cucumber-for-net-teams/' rel='bookmark' title='Permanent Link: Cuke4Nuke: Cucumber for .NET Teams'>Cuke4Nuke: Cucumber for .NET Teams</a></li>
<li><a href='http://www.richardlawrence.info/2010/01/12/debugging-cuke4nuke-step-definitions/' rel='bookmark' title='Permanent Link: Debugging Cuke4Nuke Step Definitions'>Debugging Cuke4Nuke Step Definitions</a></li>
<li><a href='http://www.richardlawrence.info/2010/01/04/how-to-remove-duplication-in-cucumber-tests-using-scenario-outlines/' rel='bookmark' title='Permanent Link: How to Remove Duplication in Cucumber Tests Using Scenario Outlines'>How to Remove Duplication in Cucumber Tests Using Scenario Outlines</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.richardlawrence.info/2010/07/20/just-enough-regular-expressions-for-cucumber/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>The Latest on Cuke4Nuke</title>
		<link>http://www.richardlawrence.info/2009/12/30/the-latest-on-cuke4nuke/</link>
		<comments>http://www.richardlawrence.info/2009/12/30/the-latest-on-cuke4nuke/#comments</comments>
		<pubDate>Wed, 30 Dec 2009 17:42:38 +0000</pubDate>
		<dc:creator>Richard Lawrence</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[Cucumber]]></category>
		<category><![CDATA[Cuke4Nuke]]></category>
		<category><![CDATA[testing]]></category>
		<category><![CDATA[WatiN]]></category>

		<guid isPermaLink="false">http://www.richardlawrence.info/?p=245</guid>
		<description><![CDATA[This morning, I released version 0.3.0 of Cuke4Nuke. With this release, Cuke4Nuke supports almost everything you can do with Cucumber in Ruby or Java, making C# a first class language for Cucumber. (The only missing features are small things like tags on Before and After hooks and a richer Table object.) Check out the Cuke4Nuke [...]


Related posts:<ol><li><a href='http://www.richardlawrence.info/2009/12/03/screencast-testing-web-applications-in-net-with-cuke4nuke-and-watin/' rel='bookmark' title='Permanent Link: Screencast: Testing Web Applications in .NET with Cuke4Nuke and WatiN'>Screencast: Testing Web Applications in .NET with Cuke4Nuke and WatiN</a></li>
<li><a href='http://www.richardlawrence.info/2009/09/19/cuke4nuke-cucumber-for-net-teams/' rel='bookmark' title='Permanent Link: Cuke4Nuke: Cucumber for .NET Teams'>Cuke4Nuke: Cucumber for .NET Teams</a></li>
<li><a href='http://www.richardlawrence.info/2009/01/19/web-testing-for-net-teams-watin-or-watir/' rel='bookmark' title='Permanent Link: Web Testing for .NET Teams: WatiN or Watir?'>Web Testing for .NET Teams: WatiN or Watir?</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p></p><p>This morning, I released version 0.3.0 of <a href="http://wiki.github.com/richardlawrence/Cuke4Nuke">Cuke4Nuke</a>. With this release, Cuke4Nuke supports almost everything you can do with <a href="http://cukes.info/">Cucumber</a> in Ruby or Java, making C# a first class language for Cucumber. (The only missing features are small things like tags on Before and After hooks and a richer Table object.) Check out the <a href="http://wiki.github.com/richardlawrence/Cuke4Nuke">Cuke4Nuke wiki</a> for instructions to install and get started with Cucumber in .NET. To see it in action, check out my <a href="/2009/12/03/screencast-testing-web-applications-in-net-with-cuke4nuke-and-watin/">screencast on Cuke4Nuke and WatiN</a>.</p>


<p>Related posts:<ol><li><a href='http://www.richardlawrence.info/2009/12/03/screencast-testing-web-applications-in-net-with-cuke4nuke-and-watin/' rel='bookmark' title='Permanent Link: Screencast: Testing Web Applications in .NET with Cuke4Nuke and WatiN'>Screencast: Testing Web Applications in .NET with Cuke4Nuke and WatiN</a></li>
<li><a href='http://www.richardlawrence.info/2009/09/19/cuke4nuke-cucumber-for-net-teams/' rel='bookmark' title='Permanent Link: Cuke4Nuke: Cucumber for .NET Teams'>Cuke4Nuke: Cucumber for .NET Teams</a></li>
<li><a href='http://www.richardlawrence.info/2009/01/19/web-testing-for-net-teams-watin-or-watir/' rel='bookmark' title='Permanent Link: Web Testing for .NET Teams: WatiN or Watir?'>Web Testing for .NET Teams: WatiN or Watir?</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.richardlawrence.info/2009/12/30/the-latest-on-cuke4nuke/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Screencast: Testing Web Applications in .NET with Cuke4Nuke and WatiN</title>
		<link>http://www.richardlawrence.info/2009/12/03/screencast-testing-web-applications-in-net-with-cuke4nuke-and-watin/</link>
		<comments>http://www.richardlawrence.info/2009/12/03/screencast-testing-web-applications-in-net-with-cuke4nuke-and-watin/#comments</comments>
		<pubDate>Thu, 03 Dec 2009 15:53:41 +0000</pubDate>
		<dc:creator>Richard Lawrence</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[ATDD]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[Cucumber]]></category>
		<category><![CDATA[Cuke4Nuke]]></category>
		<category><![CDATA[screencast]]></category>
		<category><![CDATA[video]]></category>
		<category><![CDATA[WatiN]]></category>

		<guid isPermaLink="false">http://www.richardlawrence.info/?p=228</guid>
		<description><![CDATA[Yesterday, I released Cuke4Nuke 0.2.2, which added WatiN compatibility and an example of how to use the two tools together. Here&#8217;s a short screencast in which I walk through the example: Resources from the video: The Cuke4Nuke Wiki with installation instructions WatiN Source code from the example The new Ruby installer Related posts:Web Testing for [...]


Related posts:<ol><li><a href='http://www.richardlawrence.info/2009/01/19/web-testing-for-net-teams-watin-or-watir/' rel='bookmark' title='Permanent Link: Web Testing for .NET Teams: WatiN or Watir?'>Web Testing for .NET Teams: WatiN or Watir?</a></li>
<li><a href='http://www.richardlawrence.info/2009/09/19/cuke4nuke-cucumber-for-net-teams/' rel='bookmark' title='Permanent Link: Cuke4Nuke: Cucumber for .NET Teams'>Cuke4Nuke: Cucumber for .NET Teams</a></li>
<li><a href='http://www.richardlawrence.info/2009/01/24/another-look-at-watin/' rel='bookmark' title='Permanent Link: Another Look at WatiN'>Another Look at WatiN</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p></p><p>Yesterday, I released Cuke4Nuke 0.2.2, which added WatiN compatibility and an example of how to use the two tools together. Here&#8217;s a short screencast in which I walk through the example:</p>
<p><object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="437" height="288" id="viddler_875f44ff"><param name="movie" value="http://www.viddler.com/player/875f44ff/" /><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="true" /><embed src="http://www.viddler.com/player/875f44ff/" width="437" height="288" type="application/x-shockwave-flash" allowScriptAccess="always" allowFullScreen="true" name="viddler_875f44ff"></embed></object></p>
<p>Resources from the video:</p>
<ul>
<li><a href="http://wiki.github.com/richardlawrence/Cuke4Nuke">The Cuke4Nuke Wiki</a> with installation instructions</li>
<li><a href="http://watin.sourceforge.net/">WatiN</a></li>
<li><a href="http://github.com/richardlawrence/Cuke4Nuke/tree/master/examples/WatiN/Google/">Source code from the example</a></li>
<li><a href="http://www.rubyinstaller.org/">The new Ruby installer</a></li>
</ul>


<p>Related posts:<ol><li><a href='http://www.richardlawrence.info/2009/01/19/web-testing-for-net-teams-watin-or-watir/' rel='bookmark' title='Permanent Link: Web Testing for .NET Teams: WatiN or Watir?'>Web Testing for .NET Teams: WatiN or Watir?</a></li>
<li><a href='http://www.richardlawrence.info/2009/09/19/cuke4nuke-cucumber-for-net-teams/' rel='bookmark' title='Permanent Link: Cuke4Nuke: Cucumber for .NET Teams'>Cuke4Nuke: Cucumber for .NET Teams</a></li>
<li><a href='http://www.richardlawrence.info/2009/01/24/another-look-at-watin/' rel='bookmark' title='Permanent Link: Another Look at WatiN'>Another Look at WatiN</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.richardlawrence.info/2009/12/03/screencast-testing-web-applications-in-net-with-cuke4nuke-and-watin/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Cuke4Nuke: Cucumber for .NET Teams</title>
		<link>http://www.richardlawrence.info/2009/09/19/cuke4nuke-cucumber-for-net-teams/</link>
		<comments>http://www.richardlawrence.info/2009/09/19/cuke4nuke-cucumber-for-net-teams/#comments</comments>
		<pubDate>Sun, 20 Sep 2009 00:16:38 +0000</pubDate>
		<dc:creator>Richard Lawrence</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[ATDD]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[Cucumber]]></category>
		<category><![CDATA[Cuke4Nuke]]></category>
		<category><![CDATA[Product Owner]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://www.richardlawrence.info/?p=174</guid>
		<description><![CDATA[Update: If you&#8217;ve just landed here, you could get the impression from this post that Cuke4Nuke doesn&#8217;t exist yet. It does. Check out this screencast showing what you can do with it as of early December 2009. If you’ve read this blog for a while or talked with me about functional test tools, you’ve heard [...]


Related posts:<ol><li><a href='http://www.richardlawrence.info/2009/01/19/web-testing-for-net-teams-watin-or-watir/' rel='bookmark' title='Permanent Link: Web Testing for .NET Teams: WatiN or Watir?'>Web Testing for .NET Teams: WatiN or Watir?</a></li>
<li><a href='http://www.richardlawrence.info/2009/02/11/watin-patterns-2-one-assertion-and-a-name-to-match/' rel='bookmark' title='Permanent Link: WatiN Patterns #2: One Assertion and a Name to Match'>WatiN Patterns #2: One Assertion and a Name to Match</a></li>
<li><a href='http://www.richardlawrence.info/2008/11/13/a-common-but-bad-idea/' rel='bookmark' title='Permanent Link: A Common, but Bad, Idea'>A Common, but Bad, Idea</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p></p><p><strong>Update: If you&#8217;ve just landed here, you could get the impression from this post that Cuke4Nuke doesn&#8217;t exist yet. It does. Check out <a href="/2009/12/03/screencast-testing-web-applications-in-net-with-cuke4nuke-and-watin/">this screencast</a> showing what you can do with it as of early December 2009.</strong></p>
<p>If you’ve read this blog for a while or talked with me about functional test tools, you’ve heard me talk about <a href="http://cukes.info/">Cucumber</a>. It’s my favorite ATDD tool because it’s so good at mapping stories and acceptance criteria to automated functional tests. Product Owners and BAs write acceptance criteria in natural language. Developers and testers unobtrusively automate tests for them. Anyone on the team can run the tests and see the current state of the system.</p>
<p>Here’s a simple example:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Feature: Google search<br />
&nbsp; &nbsp; In order to find things on the web<br />
&nbsp; &nbsp; As a user<br />
&nbsp; &nbsp; I want to search for web pages containing specific text<br />
<br />
&nbsp; &nbsp; Scenario: Load search page<br />
&nbsp; &nbsp; &nbsp; &nbsp; When I go to the search page<br />
&nbsp; &nbsp; &nbsp; &nbsp; Then I should be on the search page<br />
<br />
&nbsp; &nbsp; Scenario: Search<br />
&nbsp; &nbsp; &nbsp; &nbsp; Given I'm on the search page<br />
&nbsp; &nbsp; &nbsp; &nbsp; When I search for &quot;richard lawrence&quot;<br />
&nbsp; &nbsp; &nbsp; &nbsp; Then I should see &quot;www.richardlawrence.info&quot; in the results</div></td></tr></tbody></table></div>
<p>This reads almost exactly as I teach Product Owners to specify acceptance criteria. But it’s not just text. It’s a potentially automated test.</p>
<p>A developer or tester can come along and automate this test like so in Ruby:</p>
<div class="codecolorer-container ruby default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#008000; font-style:italic;"># assuming @google is an instance of a test DSL that wraps Watir, Selenium, etc.</span><br />
<br />
<span style="color:#9966CC; font-weight:bold;">When</span> <span style="color:#006600; font-weight:bold;">/</span>^I search <span style="color:#9966CC; font-weight:bold;">for</span> <span style="color:#996600;">&quot;(.*)&quot;</span>$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>query<span style="color:#006600; font-weight:bold;">|</span><br />
&nbsp; <span style="color:#0066ff; font-weight:bold;">@google</span>.<span style="color:#9900CC;">search_for</span> query<br />
<span style="color:#9966CC; font-weight:bold;">end</span><br />
<br />
<span style="color:#9966CC; font-weight:bold;">Then</span> <span style="color:#006600; font-weight:bold;">/</span>^I should see <span style="color:#996600;">&quot;(.*)&quot;</span> <span style="color:#9966CC; font-weight:bold;">in</span> the results$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>expected_text<span style="color:#006600; font-weight:bold;">|</span><br />
&nbsp; assert <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#0066ff; font-weight:bold;">@google</span>.<span style="color:#9900CC;">results_contain</span>? expected_text <span style="color:#006600; font-weight:bold;">&#125;</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span><br />
<br />
<span style="color:#008000; font-style:italic;"># etc...</span></div></td></tr></tbody></table></div>
<p>Each of the Given/When/Then calls is a step definition. When there’s a matching line in a Cucumber test, the step definition gets executed.</p>
<p>Recently, support was added for step definitions in Java via a project called Cuke4Duke:</p>
<div class="codecolorer-container java default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">@When<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;I search for <span style="color: #000099; font-weight: bold;">\&quot;</span>(*)<span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span><span style="color: #009900;">&#41;</span><br />
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> search<span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> query<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Exception</span></a><br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; google.<span style="color: #006633;">searchFor</span><span style="color: #009900;">&#40;</span>query<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
@Then<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;I should see <span style="color: #000099; font-weight: bold;">\&quot;</span>(*)<span style="color: #000099; font-weight: bold;">\&quot;</span> in the results&quot;</span><span style="color: #009900;">&#41;</span><br />
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> checkResults<span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> expectedUrl<span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; assertThat<span style="color: #009900;">&#40;</span>google.<span style="color: #006633;">containsResult</span><span style="color: #009900;">&#40;</span>expectedUrl<span style="color: #009900;">&#41;</span>, is<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>Now, a Java team can use Cucumber without ever writing a line of Ruby.</p>
<p>Unfortunately, there’s nothing like this for .NET teams. Until now (or soon, anyway)…</p>
<h2>AA-FTT and the Birth of Cuke4Nuke</h2>
<p>Last month, I attended the Agile Alliance Functional Test Tool conference (AA-FTT for short). AA-FTT is an open space conference. I came with one goal: to get together with other people who want Cucumber for .NET and start making it happen. I wasn’t sure anyone else would be interested, so I was thrilled with the reaction.</p>
<p><a href="http://twitpic.com/he15c" title="Photo 2 of 4 from #aaftt in Chicago at the pre-conference wor... on Twitpic"><img src="http://twitpic.com/show/large/he15c.jpg" alt="Photo 2 of 4 from #aaftt in Chicago at the pre-conference wor... on Twitpic"></a></p>
<p>Aslak Hellesøy introduced Cucumber for those in the group who hadn’t used it and then talked through the multiple language support he’d recently added to the tool. Then, we discussed ways to build .NET support. The obvious solution was to use IronRuby and Cucumber’s language support to handle C# step definitions. <a href="http://blog.mattwynne.net/2009/09/10/the-agile-alliance-functional-testing-tools-workshop/">Matt Wynne</a> downloaded the latest IronRuby and installed Cucumber on it. He kicked off a simple Cucumber example, and we waited. And waited. Some two minutes later, we had results from tests that take less than two seconds to run under the standard Ruby interpreter. In a process that values frequent, fast test runs, IronRuby was a non-starter. (If you want to try Cucumber under IronRuby, <a href="http://blog.thomaslundstrom.com/2009/08/on-running-cucumber-under-ironruby-09.html">here are some instructions</a>.)</p>
<p>So we discussed other options and settled on using a simple wire protocol for Cucumber to communicate to .NET out-of-process, similar to Slim in FitNesse. And here’s the best part: we started building it. Matt and I paired right there to start fleshing out the wire protocol (with Cucumber tests, naturally). Later in the week at Agile 2009, Matt and Aslak paired to build the Ruby side of the wire protocol, and Matt and I tackled the first bits of the .NET side. Last week, I got the skeleton of the .NET side working and up on GitHub. You can define simple steps in C#. Cucumber can ask the .NET wire server to tell it about the steps it has and to invoke them and return the pass/fail results.</p>
<p>About a week ago, Aslak <a href="http://groups.google.com/group/cukes/browse_thread/thread/27674320d7725feb">announced the project on the Cucumber mailing list and recruited more contributors</a>. Declan Whelan, Scott Ford, Åsmund Eldhuset, Anders Hammervold, Chris Kooken, and Steve Eley have already stepped up with ideas and code.</p>
<h2 id="gettinginvoled">Getting Involed</h2>
<p>How can you get involved? I’m glad you asked.</p>
<ol>
<li>Join <a href="http://groups.google.com/group/cukes">the mailing list</a>.</li>
<li>Fork <a href="http://github.com/richardlawrence/Cuke4Nuke">the GitHub repository</a> and work on one of the features in <a href="http://github.com/richardlawrence/Cuke4Nuke/issues">the backlog</a>.</li>
<li>Post a message to the mailing list to let us know what you’re working on. I’ll tag the ticket in the backlog with your GitHub username so we don’t duplicate effort. Prefix your message subject with [Cuke4Nuke].</li>
<li>Comment on tickets in the backlog.</li>
<li>Try using Cuke4Nuke as we develop it and give us feedback via the mailing list.</li>
<li>Shout encouragements in the comments here and on Twitter to let us know you care, even if you can’t contribute.</li>
</ol>


<p>Related posts:<ol><li><a href='http://www.richardlawrence.info/2009/01/19/web-testing-for-net-teams-watin-or-watir/' rel='bookmark' title='Permanent Link: Web Testing for .NET Teams: WatiN or Watir?'>Web Testing for .NET Teams: WatiN or Watir?</a></li>
<li><a href='http://www.richardlawrence.info/2009/02/11/watin-patterns-2-one-assertion-and-a-name-to-match/' rel='bookmark' title='Permanent Link: WatiN Patterns #2: One Assertion and a Name to Match'>WatiN Patterns #2: One Assertion and a Name to Match</a></li>
<li><a href='http://www.richardlawrence.info/2008/11/13/a-common-but-bad-idea/' rel='bookmark' title='Permanent Link: A Common, but Bad, Idea'>A Common, but Bad, Idea</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.richardlawrence.info/2009/09/19/cuke4nuke-cucumber-for-net-teams/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Web Testing for .NET Teams: WatiN or Watir?</title>
		<link>http://www.richardlawrence.info/2009/01/19/web-testing-for-net-teams-watin-or-watir/</link>
		<comments>http://www.richardlawrence.info/2009/01/19/web-testing-for-net-teams-watin-or-watir/#comments</comments>
		<pubDate>Tue, 20 Jan 2009 03:49:04 +0000</pubDate>
		<dc:creator>Richard Lawrence</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[ATDD]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[Cucumber]]></category>
		<category><![CDATA[testing]]></category>
		<category><![CDATA[WatiN]]></category>
		<category><![CDATA[Watir]]></category>

		<guid isPermaLink="false">http://www.richardlawrence.info/?p=100</guid>
		<description><![CDATA[I&#8217;ve noticed a pattern with several of my .NET clients who want to get into automated acceptance testing for web applications. They like the idea of WatiN because it would let them write tests in the same language as their production code. But then they notice that there&#8217;s much more documentation and apparently a much [...]


Related posts:<ol><li><a href='http://www.richardlawrence.info/2008/11/13/a-common-but-bad-idea/' rel='bookmark' title='Permanent Link: A Common, but Bad, Idea'>A Common, but Bad, Idea</a></li>
<li><a href='http://www.richardlawrence.info/2008/12/11/ui-sketches-for-distributed-teams/' rel='bookmark' title='Permanent Link: UI Sketches for Distributed Teams'>UI Sketches for Distributed Teams</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p></p><p>I&#8217;ve noticed a pattern with several of my .NET clients who want to get into automated acceptance testing for web applications. They like the idea of <a href="http://watin.sourceforge.net/">WatiN</a> because it would let them write tests in the same language as their production code. But then they notice that there&#8217;s much more documentation and apparently a much more active community around <a href="http://wiki.openqa.org/display/WTR">Watir</a>. And that Ruby language looks interesting too. What to do?</p>
<p>I think there are good arguments for both. Here are the major pros and cons from my perspective&#8230;</p>
<p><span id="more-100"></span></p>
<h2>WatiN</h2>
<table width="100%" border="0" cellspacing="0" cellpadding="3">
<tbody>
<tr>
<td width="50%"><strong>Pros</strong></td>
<td><strong>Cons</strong></td>
</tr>
<tr>
<td valign="top">
<ul>
<li>Code and test in the same language (e.g. C#)
<ul>
<li>No need to learn a new language (i.e. Ruby)</li>
<li>No need to support another language</li>
<li>No need to hire people who know another language</li>
</ul>
</li>
<li>Did I mention that you can write tests in C#?</li>
</ul>
</td>
<td valign="top">
<ul>
<li>IE only (though there&#8217;s a CTP for FireFox support)</li>
<li>Very limited documentation</li>
<li> More syntactic noise (more due to .NET than to WatiN itself; e.g. new Regex(&#8220;txtFoo$&#8221;) vs. /txtFoo$/)</li>
</ul>
</td>
</tr>
</tbody>
</table>
<h2>Watir</h2>
<table width="100%" border="0" cellspacing="0" cellpadding="3">
<tbody>
<tr>
<td width="50%"><strong>Pros</strong></td>
<td><strong>Cons</strong></td>
</tr>
<tr>
<td valign="top">
<ul>
<li>Very active community</li>
<li>Active ongoing development on Watir and related projects</li>
<li>Good support on the discussion list</li>
<li>Concise, clear syntax (more due to Ruby than to Watir itself)</li>
<li>Good documentation (though finding the current RDoc online can be difficult)</li>
<li>Works with <a href="http://wiki.github.com/aslakhellesoy/cucumber">Cucumber</a>, my current favorite acceptance test tool</li>
<li>Supports multiple browsers (IE, Firefox, Safari, and soon Chrome and Opera)</li>
</ul>
</td>
<td valign="top">
<ul>
<li>Uses a language unfamiliar to .NET teams (that&#8217;s who we&#8217;re talking about here, remember)</li>
<li>Doesn&#8217;t directly work with .NET test frameworks (of course, you can wrap the Watir tests for use by MSTest or NUnit)</li>
</ul>
</td>
</tr>
</tbody>
</table>
<h2>The Bottom Line</h2>
<p>On balance, I think Watir is the better tool, has the better documentation, the most active community, and the best long-term prospects. But I understand the desire to standardize on C# or VB.NET for both production and test code. The long-term cost of adding another language to a product is not something to ignore.</p>
<p>Personally, I&#8217;ll continue to use and teach both tools with clients. When it comes to my own projects, however, I&#8217;ll be using and extending Watir, for all the reasons above and simply because I enjoy working with Ruby.</p>
<p>Which do you use and why?</p>


<p>Related posts:<ol><li><a href='http://www.richardlawrence.info/2008/11/13/a-common-but-bad-idea/' rel='bookmark' title='Permanent Link: A Common, but Bad, Idea'>A Common, but Bad, Idea</a></li>
<li><a href='http://www.richardlawrence.info/2008/12/11/ui-sketches-for-distributed-teams/' rel='bookmark' title='Permanent Link: UI Sketches for Distributed Teams'>UI Sketches for Distributed Teams</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.richardlawrence.info/2009/01/19/web-testing-for-net-teams-watin-or-watir/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>A Common, but Bad, Idea</title>
		<link>http://www.richardlawrence.info/2008/11/13/a-common-but-bad-idea/</link>
		<comments>http://www.richardlawrence.info/2008/11/13/a-common-but-bad-idea/#comments</comments>
		<pubDate>Fri, 14 Nov 2008 04:44:09 +0000</pubDate>
		<dc:creator>Richard Lawrence</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[anti-patterns]]></category>
		<category><![CDATA[ATDD]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[Cucumber]]></category>
		<category><![CDATA[Fit]]></category>
		<category><![CDATA[QA]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[testing]]></category>
		<category><![CDATA[Watir]]></category>

		<guid isPermaLink="false">http://www.richardlawrence.info/?p=51</guid>
		<description><![CDATA[Please don&#8217;t do this: It will hurt. Not right away, but around sprint 4 when the bugs found in sprint 3 for the stories built in sprint 2 need to be mixed in with the stories planned in sprint 3 for sprint 4. And then it&#8217;ll hurt more in sprint 5 and later when you [...]


Related posts:<ol><li><a href='http://www.richardlawrence.info/2008/07/11/one-word-can-change-your-daily-scrum/' rel='bookmark' title='Permanent Link: One Word Can Change Your Daily Scrum'>One Word Can Change Your Daily Scrum</a></li>
<li><a href='http://www.richardlawrence.info/2008/09/05/making-velocity-granular-enough/' rel='bookmark' title='Permanent Link: Making Velocity Granular Enough'>Making Velocity Granular Enough</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p></p><p>Please don&#8217;t do this:<br />
<img class="alignnone size-full wp-image-52" title="Planning, Development, and QA in Separate Sprints" src="http://www.richardlawrence.info/wp-content/uploads/2008/11/plan-dev-qa-sprints.png" alt="" width="500" height="155" /></p>
<p><span id="more-51"></span></p>
<p>It will hurt. Not right away, but around sprint 4 when the bugs found in sprint 3 for the stories built in sprint 2 need to be mixed in with the stories planned in sprint 3 for sprint 4. And then it&#8217;ll hurt more in sprint 5 and later when you have to start regression testing more and more code each sprint.</p>
<p>Instead, just do as much work as you can get really DONE in each sprint. Plan it, build it, test it, and deliver it. It&#8217;ll be hard to ensure that testing doesn&#8217;t get squeezed out the back of the sprint. It will. When that happens, try moving testing to the front of each story. Create your test cases as specifications and then do just enough development to make them pass. (Consider a tool like <a href="http://github.com/aslakhellesoy/cucumber/wikis/home">Cucumber</a> for this, using it to drive <a href="http://wtr.rubyforge.org/">Watir</a> if you&#8217;re building a web app. Or look at <a href="http://fit.c2.com/">Fit</a>/<a href="http://fitnesse.org/">Fitnesse</a> if that&#8217;s more your style.)</p>


<p>Related posts:<ol><li><a href='http://www.richardlawrence.info/2008/07/11/one-word-can-change-your-daily-scrum/' rel='bookmark' title='Permanent Link: One Word Can Change Your Daily Scrum'>One Word Can Change Your Daily Scrum</a></li>
<li><a href='http://www.richardlawrence.info/2008/09/05/making-velocity-granular-enough/' rel='bookmark' title='Permanent Link: Making Velocity Granular Enough'>Making Velocity Granular Enough</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.richardlawrence.info/2008/11/13/a-common-but-bad-idea/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

