<?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>Tea-Driven Development</title>
	<atom:link href="http://blog.mattwynne.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.mattwynne.net</link>
	<description>Matt Wynne taking it one tea at a time</description>
	<lastBuildDate>Fri, 04 May 2012 15:59:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>A vision for Cucumber 2.0</title>
		<link>http://blog.mattwynne.net/2012/04/26/a-vision-for-cucumber-2-0/</link>
		<comments>http://blog.mattwynne.net/2012/04/26/a-vision-for-cucumber-2-0/#comments</comments>
		<pubDate>Thu, 26 Apr 2012 12:42:18 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Agile / Lean Software Development]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[Relish]]></category>
		<category><![CDATA[Ruby Programming]]></category>

		<guid isPermaLink="false">http://blog.mattwynne.net/?p=384</guid>
		<description><![CDATA[At last month&#8217;s CukeUp conference, I held a panel discussion between Aslak Hellesoy, Julien Biezemans, Oriol Gual and Jonas Nicklas. I chose these panelists because each of them has written a variation on the original Ruby Cucumber, and I wanted to try to pull these ideas together into a vision for Cucumber 2.0. This post [...]]]></description>
			<content:encoded><![CDATA[<p>At last month&#8217;s CukeUp conference, I held a panel discussion between <a href="http://aslakhellesoy.com/">Aslak Hellesoy</a>, <a href="http://jbpros.net/">Julien Biezemans</a>, <a href="http://oriolgual.me/">Oriol Gual</a> and <a href="https://github.com/jnicklas">Jonas Nicklas</a>. I chose these panelists because each of them has written a <a href="http://github.com/cucumber/cucumber-jvm">variation</a> <a href="https://github.com/cucumber/cucumber-js">on</a> <a href="https://github.com/codegram/spinach">the</a> <a href="https://github.com/jnicklas/turnip">original</a> Ruby Cucumber, and I wanted to try to pull these ideas together into a vision for Cucumber 2.0.</p>

<p>This post is a record of that conversation.</p>

<h3>Why do we need a new Cucumber?</h3>

<p>The current version of Cucumber has been around since 2008, and as <a href="http://elabs.se/blog/30-solving-cucumber-s-problems">Jonas has previously explained</a> the code isn&#8217;t much fun to hack on. It&#8217;s quite bloated with features, some of which were added as experiments and maybe aren&#8217;t used by most users. Carrying this cruft around is holding us back from adding new features that we do want.</p>

<p>Also, the current mechanism for mapping from steps to Ruby code is pretty basic, and doesn&#8217;t really encourage the good practices we&#8217;ve learned as a community <a href="http://skillsmatter.com/podcast/agile-scrum/bdd-as-its-meant-to-be-done">about organising your test code</a>.</p>

<h3>What is your vision?</h3>

<p>I asked each of the participants what they&#8217;d learned from their fork of Cucumber, and what they&#8217;d like to see in a new version of Cucumber.</p>

<p>Aslak made three points:</p>

<ul>
<li>It should be possible to use Cucumber as a library, so that other tools can be built on top of it as well as the command-line interface.</li>
<li>The way steps are defined in Cucumber-JVM, by simply annotating existing methods, allows you to focus on keeping your test code well organised. We should steal this idea for Cucumber-Ruby.</li>
<li>There should be a collaborative web UI for writing Cucumber scenarios with non-technical stakeholders.</li>
</ul>

<p>Julien added:</p>

<ul>
<li>Integrating the Cucumber-HTML project, which is essentially a web-based client for Cucumber, would be awesome.</li>
<li>It would be nice to use the <a href="https://github.com/cucumber/cucumber-tck">Cucumber-TCK</a>, which is growing into a standard set of specs for any Cucumber implementation.</li>
<li>He hasn&#8217;t implemented calling steps from step defs in Cucumber-JS, and he&#8217;s not sure he wants to.</li>
<li>Parallel execution &#8211; can we make this possible?</li>
</ul>

<p>Oriol echoed Aslak&#8217;s thoughts about keeping test code better organised: Spinach uses one class per feature, and is generally more object-oriented unlike Cucumber-Ruby&#8217;s flat anonymous blocks for step definitions.</p>

<p>Jonas said his goal for Turnip was mainly simplification:</p>

<ul>
<li>He thinks that the reason some people had started to abandon Cucumber was to do with it being perceived as complex.</li>
<li>Jumping from plain english steps to Regexps is jarring, and too big a leap in abstraction. 98% of the time you don&#8217;t need regular expressions anyway. Turnip uses the concept of placeholders in strings instead to capture arguments.</li>
<li>Using RSpec as the runner for Turnip hasn&#8217;t worked out so well.</li>
</ul>

<h3>What features should we remove?</h3>

<p>It&#8217;s always fun making a &#8216;not&#8217; list, so we brainstormed the current Cucumber features we&#8217;d like to kill in a 2.0 release:</p>

<p><img src="http://blog.mattwynne.net/wp-content/uploads/2012/04/cucumber_features_to_kill1.jpg" alt="Cucumber: Features to Kill" /></p>

<p>In case you can&#8217;t read my scrawl, here&#8217;s that list again:</p>

<ul>
<li>Wire protocol</li>
<li>Calling steps from step defs</li>
<li>Tables (we&#8217;re talking about scenario outlines here)</li>
<li>DRB / Spork</li>
<li>World having everything mixed in, all the time</li>
<li>Cucumber.yml</li>
<li>Given / When / Then being regarded as the same by Cucumber</li>
</ul>

<p>As you can see, we got the audience to come up and vote after the session. It looks like nested steps are living on borrowed time!</p>

<p>My view is that with a well-designed core, many of these features can still exist but as plug-ins, thereby allowing people who need them to continue to use them, but without the maintenance burden on the core team.</p>

<h3>So what&#8217;s next?</h3>

<p>Well, I think I have a pretty clear vision for what Cucumber 2.0 would look like. I&#8217;d like to start with a simple core library that has no GUI component at all, but can pass the <a href="https://github.com/cucumber/cucumber-tck">TCK tests</a>. Then we can start building tools around that core, like a console runner, and a websocket server for running cukes from a javascript browser app. I&#8217;m personally really excited about where that last idea could lead.</p>

<p>What I&#8217;m short on is time. Would it be crazy to ask if there are any companies who would consider sponsoring this project? I can&#8217;t imagine a better way to spend the summer than hacking out a brand new shiny Cucumber!</p>

<p><strong>Update: Thanks for the comments, but I don&#8217;t find they make a great medium for discussion so I don&#8217;t tend to reply to them. If you&#8217;d like to discuss this post, please chip in on <a href="https://groups.google.com/forum/?fromgroups#!topic/cukes/F9UHzv5tSlU">these</a> <a href="https://groups.google.com/forum/?fromgroups#!topic/cukes/wRnqSeLtFsM">threads</a> on the cukes google group.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mattwynne.net/2012/04/26/a-vision-for-cucumber-2-0/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Bootstrapd &#8211; a conference for self-funded startups</title>
		<link>http://blog.mattwynne.net/2012/04/24/bootstrapd-a-conference-for-self-funded-startups/</link>
		<comments>http://blog.mattwynne.net/2012/04/24/bootstrapd-a-conference-for-self-funded-startups/#comments</comments>
		<pubDate>Tue, 24 Apr 2012 11:51:11 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Agile / Lean Software Development]]></category>
		<category><![CDATA[Relish]]></category>

		<guid isPermaLink="false">http://blog.mattwynne.net/?p=378</guid>
		<description><![CDATA[I&#8217;ve been trying to bootstrap a product for the last year or so; I&#8217;ve also got several friends who are either already doing it, or have recognised that it&#8217;s a better way to make a living than consulting / contracting for a daily rate. I want to get everyone together so we can swap ideas [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been trying to <a href="http://relishapp.com">bootstrap a product</a> for the last year or so; I&#8217;ve also got several friends who are either already doing it, or have recognised that it&#8217;s a better way to make a living than consulting / contracting for a daily rate. I want to get everyone together so we can swap ideas and experiences, and inspire each other.</p>

<p>So, together with Steve Tooke of <a href="http://heavi.es/">Heavies</a>, I&#8217;m organising a conference.</p>

<p>It&#8217;s a simple, not-for-profit event, to be held in Edinburgh on Wednesday 27th June. More details here: <a href="http://bootstrapd.com">http://bootstrapd.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mattwynne.net/2012/04/24/bootstrapd-a-conference-for-self-funded-startups/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Interviewed by RubySource</title>
		<link>http://blog.mattwynne.net/2012/04/13/interviewed-by-rubysource/</link>
		<comments>http://blog.mattwynne.net/2012/04/13/interviewed-by-rubysource/#comments</comments>
		<pubDate>Fri, 13 Apr 2012 08:33:41 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Agile / Lean Software Development]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[Relish]]></category>
		<category><![CDATA[cucumber]]></category>
		<category><![CDATA[Interview]]></category>

		<guid isPermaLink="false">http://blog.mattwynne.net/?p=368</guid>
		<description><![CDATA[Last week I had a great chat with Pat Shaughnessy about The Cucumber Book which has been published as an interview on RubySource. Pat really managed to get to the heart of my opinions about how to use Cucumber effectively, so if you&#8217;re too busy to read the book, this will give you a good summary [...]]]></description>
			<content:encoded><![CDATA[<p>Last week I had a great chat with Pat Shaughnessy about <a href="pragprog.com/book/hwcuc/the-cucumber-book">The Cucumber Book</a> which has been published as an <a href="http://rubysource.com/matt-wynne-on-using-cucumber/">interview on RubySource</a>. Pat really managed to get to the heart of my opinions about how to use Cucumber effectively, so if you&#8217;re too busy to read the book, this will give you a good summary of my latest thinking on topics such as:
<ul>
    <li>- why Cucumber is pointless unless you involve the whole team</li>
    <li>- imperative vs declarative style, and why it matters</li>
    <li>- testing domain objects directly from Cucumber</li>
</ul>
If you&#8217;re using Cucumber or SpecFlow day to day, or considering them and wondering what benefits you&#8217;ll get, I think this interview is worth a read.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mattwynne.net/2012/04/13/interviewed-by-rubysource/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Hexagonal Rails &#8211; Introduction</title>
		<link>http://blog.mattwynne.net/2012/04/09/hexagonal-rails-introduction/</link>
		<comments>http://blog.mattwynne.net/2012/04/09/hexagonal-rails-introduction/#comments</comments>
		<pubDate>Mon, 09 Apr 2012 15:48:52 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Agile / Lean Software Development]]></category>
		<category><![CDATA[Relish]]></category>
		<category><![CDATA[Ruby Programming]]></category>
		<category><![CDATA[DCI]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://blog.mattwynne.net/?p=358</guid>
		<description><![CDATA[A few months ago, development of http://relishapp.com reached what is a familiar but rather unpleasant plateau for me. Up until that point, it had been developed using conventional Ruby on Rails idioms, with controllers that talk directly to ActiveRecord class methods to make queries, then set instance variables to pass the results of those queries to [...]]]></description>
			<content:encoded><![CDATA[<p>A few months ago, development of <a href="http://www.relishapp.com">http://relishapp.com</a> reached what is a familiar but rather unpleasant plateau for me. Up until that point, it had been developed using conventional Ruby on Rails idioms, with controllers that talk directly to ActiveRecord class methods to make queries, then set instance variables to pass the results of those queries to view templates for rendering. It&#8217;s all very procedural, and very tightly coupled.</p>

<p>This post is an introduction to a forthcoming series which will explain how I&#8217;ve been tackling this.</p>

<p>Let me start by saying that the coupling in my Rails application is not necessarily a bad thing. In fact, to get the product off the ground and give <a href="https://www.relishapp.com/rspec">RSpec&#8217;s amazing living documentation</a> a place to call home, we needed to be able to put Relish together very quickly. This is where Rails absolutely dazzles: the early stages of a project are so easy that adding features is a delight.</p>

<p>Unfortunately, the very forces that make adding features to a new Rails application so easy are the same ones that start to hold you back as the number of features grows. That conventional Rails style is what Kent Beck has called a <a href="http://www.threeriversinstitute.org/blog/?p=338">connected design style</a>, Quoting from that article:
<blockquote>In a connected system, elements are highly available to each other (via global state, for example). Adding the first feature to a connected system is cheap. All the resources you need are available. However, the cost of all those connections is that subsequent features are very likely to interact with previous features, driving up the cost of development over time.</blockquote>
The alternative to a connected design style is what Kent calls a <em>modular design style.</em> He contrasts these using this chart:</p>

<div class="wp-caption aligncenter" style="width: 442px"><img class="  " title="Cost of change of two design styles (from Kent Beck's blog)" src="http://www.threeriversinstitute.org/blog/wp-content/uploads/2009/08/connectedAndModularDesign.jpg" alt="" width="432" height="240" /><p class="wp-caption-text">Cost of Features in Connected and Modular Designs (from http://www.threeriversinstitute.org/)</p></div>

<p>For the first few features, a connected design style is cheaper than a modular design style. In fact, using what might be referred to by software design snobs as &#8216;poor design&#8217; could give you a competitive advantage in the early stages of your product&#8217;s development. The trick is to recognise when it&#8217;s time to switch styles.</p>

<p>So, while I love Rails for what it is, I also recognise its weaknesses. To make the Relish codebase habitable in the long term, I need to move beyond its connected design style and establish a more modular design. But how? It&#8217;s a question that many different people are asking at the moment, and I&#8217;ve been diving deep into what they are saying. Here&#8217;s a sample:
<ul>
    <li>Gary Bernhardt and Corey Haines have been agitating with <a href="https://www.destroyallsoftware.com/screencasts/catalog/fast-tests-with-and-without-rails">screencasts</a> and <a href="http://arrrrcamp.be/videos/2011/corey-haines---fast-rails-tests/">talks</a> that highlight the advantages of decoupling from Rails.</li>
    <li><a href="http://confreaks.com/videos/759-rubymidwest2011-keynote-architecture-the-lost-years">Bob Martin has been reminding us that Rails should be an implementation detail</a>.</li>
    <li><a href="http://clean-ruby.com/">Jim Gay is writing a book</a> about using <a href="http://en.wikipedia.org/wiki/Data,_context_and_interaction">DCI (Data, Context, Interaction)</a> to organise Ruby codebases.</li>
    <li><a href="http://devblog.avdi.org/2012/03/15/now-available-objects-on-rails/">Avdi Grimm has written a book about building object-oriented Rails applications</a>.</li>
    <li>Steve Klabnik has <a href="http://blog.steveklabnik.com/posts/2011-09-06-the-secret-to-rails-oo-design">written about the delights of POROs</a>.</li>
    <li>Nicolas Henry is <a href="http://blog.firsthand.ca/2011/10/rails-is-not-your-application.html">thinking about pushing his application code out into gems</a>.</li>
    <li>Mark Burns has been <a href="http://blog.polyglotsoftware.co.uk/2012/03/30/dci-and-rails-a-first-sprint-retrospective/">trying out DCI in a new app</a>.</li>
    <li>The Ruby Rogues have been discussing <a href="http://rubyrogues.com/object-oriented-programming-in-rails-with-jim-weirich/">Object-Oriented Programming in Rails with Jim Weirich</a>.</li>
    <li>Piotr Solnica has been <a href="http://solnic.eu/2011/08/01/making-activerecord-models-thin.html">writing about making his ActiveRecord models skinny too</a>.</li>
</ul>
For my part, I re-read the outstanding <a href="http://www.growing-object-oriented-software.com/">Growing Object-Oriented Software Guided by Tests</a> (GOOS) by Steve Freeman and Nat Price. In that book, Steve and Nat advocate a <a href="http://alistair.cockburn.us/Hexagonal+architecture">ports-and-adapters or hexagonal architecture</a>, which keeps your core application logic separate from any technical details needed to connect the application to the real world; technical details like databases, or web user interfaces.</p>

<p>I think it&#8217;s easier to use an architecture like this in Java or C#, where packages and interfaces make it easy to see and enforce separation between chunks of the application, than in Ruby where it&#8217;s harder to make clear boundaries around areas of the system. But that doesn&#8217;t mean it isn&#8217;t possible. For the past couple of months I have been experimenting with refactorings in the Relish codebase to move it towards a more hexagonal architectural style. The overall goal is to make the Relish codebase habitable, which for me breaks down into:</p>

<h3>1. Fast tests</h3>

<p>I never add features without tests, and I want those tests to run fast. The goal of the hexagonal architecture is to have the most interesting (and frequently changing) logic implemented in plain old Ruby objects that have no dependency on any other libraries so they are easy to understand, and can be quickly spun up in a test.</p>

<h3>2. Modularity and encapsulation</h3>

<p>Ruby is an object-oriented language with great support for functional programming, and I want to make the most of that to keep Relish&#8217;s code easy to change.</p>

<h3>3. Clean and well-organised</h3>

<p>I want a structure that communicates what each part of the system is doing, and makes it easy for new team members to jump in and start hacking on the code.</p>

<p>I&#8217;ll start the series by explaining a couple of key concepts from Steve and Nat&#8217;s GOOS book, and about hexagonal architectures in general. Then we&#8217;ll get down to some practical work refactoring a typical Rails controller. Stay tuned!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mattwynne.net/2012/04/09/hexagonal-rails-introduction/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Free BDD Coaching</title>
		<link>http://blog.mattwynne.net/2012/03/31/free-bdd-coaching/</link>
		<comments>http://blog.mattwynne.net/2012/03/31/free-bdd-coaching/#comments</comments>
		<pubDate>Sat, 31 Mar 2012 00:48:15 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Agile / Lean Software Development]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[Ruby Programming]]></category>
		<category><![CDATA[cucumber bdd coaching training]]></category>

		<guid isPermaLink="false">http://blog.mattwynne.net/?p=337</guid>
		<description><![CDATA[In this blog post, I will reveal a secret to you. A secret that can get you access to free, hands-on BDD coaching from some of the world&#8217;s leading experts like Aslak Hellsøy, Mike Sassak, Greg Hnatiuk, Joseph Wilk and even me, Matt Wynne. Yes, that&#8217;s right: absolutely FREE. Would you like to know how? [...]]]></description>
			<content:encoded><![CDATA[<p>In this blog post, I will reveal a secret to you. A secret that can get you access to free, hands-on BDD coaching from some of the world&#8217;s leading experts like Aslak Hellsøy, Mike Sassak, Greg Hnatiuk, Joseph Wilk and even me, Matt Wynne. Yes, that&#8217;s right: absolutely FREE.</p>

<p>Would you like to know how?</p>

<p>I&#8217;ll give you step-by-step instructions.</p>

<ol>
<li><p>Point your web browser to the <a href="https://github.com/cucumber/cucumber/issues">Cucumber issues list</a>.</p></li>
<li><p>Have a look around. Take your time. Look for issues that don&#8217;t already have <strong>Code Attached,</strong> because we&#8217;re looking for an issue that nobody has tried to solve yet. Found an interesting one? Good.</p></li>
<li><p><a href="http://help.github.com/fork-a-repo/">Fork</a> the Cucumber repository to your Github account.</p></li>
<li><p>Now comes the hard part. You need to write a failing test for the issue you found. Start by writing a scenario that describes the way the code should behave once the issue has been fixed. Try to not to just create a file called &#8216;<code>features/fix<em>issue</em>234.feature</code>&#8216; but instead try to slot your scenario into the existing features as extra detail about that particular aspect of the system. You might need to create a new feature file, but try to name it according to the behaviour it describes, rather than the bug it tests. Look at the other features for examples of how to write your scenario. Try to use a declarative style where possible.</p></li>
<li><p>With your scenario written, it&#8217;s time to submit a <a href="http://help.github.com/send-pull-requests/">pull request</a>.</p></li>
<li><p>This is where your FREE BDD coaching will begin. One of the Cucumber team will see your pull request, and will be delighted to offer you feedback on your scenario. You don&#8217;t have to wait for the feedback though, you can go ahead and start to get your scenario running.</p></li>
<li><p>Keep pushing. Every time you make progress, getting the steps of your scenario to actually run against Cucumber, push to your fork and the pull request will be updated automatically by Github&#8217;s legions of octocats. Your FREE BDD coach will keep encouraging you with comments and feedback. Now comes the hard part.</p></li>
<li><p>Once you have the scenario running, you&#8217;ve got the bug trapped: it&#8217;s time to fix it! Again, your FREE BDD coach will be in your corner. Ask questions about the design of the existing cucumber code, about your code, write specs to isolate behaviour further, and let your FREE BDD coach guide you. Before you know it you&#8217;ll have fixed the issue, and your name will be <a href="https://github.com/cucumber/cucumber/blob/master/History.md">emblazoned in the codebase</a> forever more.</p></li>
</ol>

<p>This is a great way to get access to some very experienced and friendly software developers and feel good about giving something back to the community. Many wise software craftspeople have already discovered this secret. Isn&#8217;t it time you joined them?</p>

<p>And did I mention that it&#8217;s FREE?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mattwynne.net/2012/03/31/free-bdd-coaching/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using Cucumber for Load Testing</title>
		<link>http://blog.mattwynne.net/2012/03/13/using-cucumber-for-load-testing/</link>
		<comments>http://blog.mattwynne.net/2012/03/13/using-cucumber-for-load-testing/#comments</comments>
		<pubDate>Tue, 13 Mar 2012 14:52:40 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Agile / Lean Software Development]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[cucumber]]></category>
		<category><![CDATA[load]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://blog.mattwynne.net/?p=334</guid>
		<description><![CDATA[I sometimes get asked whether it&#8217;s possible to use Cucumber to test performance. The way to do it is to specify concrete examples of scenarios that the system will find itself in under stress. For example: Given there are 100,000 users registered on the system When I create a new account Then I should be [...]]]></description>
			<content:encoded><![CDATA[<p>I sometimes get asked whether it&#8217;s possible to use Cucumber to test performance. The way to do it is to specify concrete examples of scenarios that the system will find itself in under stress. For example:
<pre>Given there are 100,000 users registered on the system
When I create a new account
Then I should be taken to my dashboard within 5ms</pre>
or
<pre>Given 1000 users are hitting the homepage simultaneously
Then each user should get a response within 2ms</pre>
Talking through these kinds of scenarios with your stakeholders will help you to understand where the boundary is for what they consider to be acceptable performance. You might find it hard to get them to be this specific at first, but help them understand that what you&#8217;re doing is drawing a line in the sand for the <em>minimum acceptable performance</em> &#8211; most of the time the application may be much faster than this. Now you have agreement about this, the next step is to work out how to automate these scenarios, by calling your load testing tool of choice from the Cucumber step definitions.</p>

<p>The key thing is to have Cucumber delegate to the stress testing tool, rather than the other way around. A common mistake people make is to simply point JMeter at existing Cucumber scenarios, but this doesn&#8217;t give you the benefit of having the parameters of the performance test documented in readable Cucumber scenarios.</p>

<p>These are not normal kinds of Cucumber tests. You would need to run these against an environment that&#8217;s representative of your production hardware, whereas normal behaviour scenarios could be run against any environment. It&#8217;s useful to create these scenarios early on during the project and run them against every build so they become constraints that every build must meet as the project progresses.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mattwynne.net/2012/03/13/using-cucumber-for-load-testing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Commands vs Queries</title>
		<link>http://blog.mattwynne.net/2012/02/22/commands-vs-queries/</link>
		<comments>http://blog.mattwynne.net/2012/02/22/commands-vs-queries/#comments</comments>
		<pubDate>Wed, 22 Feb 2012 10:43:17 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Ruby Programming]]></category>
		<category><![CDATA[Ruby OO]]></category>

		<guid isPermaLink="false">http://blog.mattwynne.net/?p=331</guid>
		<description><![CDATA[There are some fascinating discussions going on over on the mailing list for Avdi Grimm&#8217;s excellent e-book, Objects on Rails. Recently, in a discussion about command-query separation and Dan Kubb posted this little piece of beauty: One convention I use is that query methods are idempotent and return a value, while command methods change state, [...]]]></description>
			<content:encoded><![CDATA[<p>There are some fascinating discussions going on over on the <a href="https://groups.google.com/forum/?fromgroups#!forum/objects-on-rails">mailing list</a> for Avdi Grimm&#8217;s excellent e-book, <em><a href="http://avdi.org/devblog/2011/11/15/early-access-beta-of-objects-on-rails-now-available-2/">Objects on Rails</a></em>.</p>

<p>Recently, in a discussion about <a href="http://en.wikipedia.org/wiki/Command-query_separation">command-query separation</a> and <a href="https://twitter.com/#!/dkubb">Dan Kubb</a> posted this little piece of beauty:</p>

<blockquote>
  <p>One convention I use is that query methods are idempotent and return a
  value, while command methods change state, but they can only return
  self. This provides a nice fluent interface when working with the
  objects, and feels quite natural (to me at least).</p>
</blockquote>

<p>Feels natural to me too.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mattwynne.net/2012/02/22/commands-vs-queries/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Our Consumer Culture and What it Means for Software Craftsmanship</title>
		<link>http://blog.mattwynne.net/2012/01/10/our-consumer-culture-and-what-it-means-for-software-craftsmanship/</link>
		<comments>http://blog.mattwynne.net/2012/01/10/our-consumer-culture-and-what-it-means-for-software-craftsmanship/#comments</comments>
		<pubDate>Tue, 10 Jan 2012 12:14:13 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Agile / Lean Software Development]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[lean]]></category>
		<category><![CDATA[Politics]]></category>

		<guid isPermaLink="false">http://blog.mattwynne.net/2012/01/10/our-consumer-culture-and-what-it-means-for-software-craftsmanship/</guid>
		<description><![CDATA[We have an old Kenwood Chef A701 that&#8217;s hardly out of use in our kitchen. A few days ago, the gearbox went. I bought a reconditioned one on Ebay for £23, and this morning I made the time to do the repair. As I tinkered away with my screwdriver, I reflected on how grateful I [...]]]></description>
			<content:encoded><![CDATA[<p>We have an old Kenwood Chef A701 that&#8217;s hardly out of use in our kitchen. A few days ago, the gearbox went. I bought a reconditioned one on Ebay for £23, and this morning I made the time to do the repair.</p>

<p><img src="http://blog.mattwynne.net/wp-content/uploads/2012/01/kenwood_chef.jpg" alt="Kenwood Chef" /></p>

<p>As I tinkered away with my screwdriver, I reflected on how grateful I was that the designers of this machine had made sure it could be maintained by an idiot like me. I actually made our A701 by cannibalising two broken machines, and I have always been delighted by how easy it is to work on.</p>

<p>Perhaps it&#8217;s my <a href="http://en.wikipedia.org/wiki/Confirmation_bias">confirmation bias</a>, but it seems that machines like this no longer tend to be designed with maintenance in mind. In our consumer society, we&#8217;re encouraged to throw things away rather than repair them, and globalisation ensures that is often the apparently rational economic decision to take: paying a local repair man to fix your DVD player will cost more than popping down to Tesco and buying a new one. Thank goodness for those <a href="http://www.guardian.co.uk/world/2011/dec/04/chinese-toy-factories-christmas-disney">cheap Chinese factories</a>, eh?</p>

<p>If we don&#8217;t design our manufactured goods for maintainability, perhaps it&#8217;s no wonder we often feel like we&#8217;re swimming against the tide trying to persuade people that it&#8217;s important in software.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mattwynne.net/2012/01/10/our-consumer-culture-and-what-it-means-for-software-craftsmanship/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Passwords are Backward</title>
		<link>http://blog.mattwynne.net/2011/12/05/passwords-are-backward/</link>
		<comments>http://blog.mattwynne.net/2011/12/05/passwords-are-backward/#comments</comments>
		<pubDate>Mon, 05 Dec 2011 15:45:23 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.mattwynne.net/2011/12/05/passwords-are-backward/</guid>
		<description><![CDATA[I really hate passwords. Today I read this, and realised I&#8217;m not alone: http://me.veekun.com/blog/2011/12/04/fuck-passwords/ If you feel like me, go and have a read. I&#8217;m pretty sure it will cheer you up.]]></description>
			<content:encoded><![CDATA[<p>I really hate passwords. Today I read this, and realised I&#8217;m not alone:</p>

<p><a href="http://me.veekun.com/blog/2011/12/04/fuck-passwords/">http://me.veekun.com/blog/2011/12/04/fuck-passwords/</a></p>

<p>If you feel like me, go and have a read. I&#8217;m pretty sure it will cheer you up.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mattwynne.net/2011/12/05/passwords-are-backward/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Skillsmatter BDD Exchange</title>
		<link>http://blog.mattwynne.net/2011/11/28/skillsmatter-bdd-exchange/</link>
		<comments>http://blog.mattwynne.net/2011/11/28/skillsmatter-bdd-exchange/#comments</comments>
		<pubDate>Mon, 28 Nov 2011 11:24:39 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Agile / Lean Software Development]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[cucumber]]></category>
		<category><![CDATA[Relish]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://blog.mattwynne.net/2011/11/28/skillsmatter-bdd-exchange/</guid>
		<description><![CDATA[Last week I travelled down to London to the BDD Exchange conference. It was a one-day conference organised by Gojko Adzic and I had a great time. I missed Gojko&#8217;s talk as I travelled down from my cave in Scotland on the day, but I did arrive in time to see Chris Matt&#8217;s excellent lecture [...]]]></description>
			<content:encoded><![CDATA[<p>Last week I travelled down to London to the BDD Exchange conference. It was a one-day conference organised by <a href="http://gojko.net/">Gojko Adzic</a> and I had a great time. I missed Gojko&#8217;s talk as I travelled down from my cave in Scotland on the day, but I did arrive in time to see Chris Matt&#8217;s <a href="http://skillsmatter.com/podcast/agile-scrum/driving-requirements-from-business-value">excellent lecture on what business analysis really should be about</a>.</p>

<p><a href="http://blog.mattwynne.net/wp-content/uploads/2011/11/DSCF4049.jpg"><img class="aligncenter size-medium wp-image-319" title="Matt proudly announces the imminent completion of The Cucumber Book" src="http://blog.mattwynne.net/wp-content/uploads/2011/11/DSCF4049-300x225.jpg" alt="" width="300" height="225" /></a></p>

<p>I particularly enjoyed the <a href="http://skillsmatter.com/podcast/agile-scrum/evolving-the-big-picture-maps-of-living-documentation">talk from Christian Hassa</a> about teams failing to make BDD work. We can learn the most from failure, and Christian&#8217;s thoughtful analysis of what he&#8217;s observed in the field as a consultant with TechTalk is useful to any team trying to get the most from these techniques. The message of Christian&#8217;s talk very much echoed my own, that the tooling you use is entirely secondary to the collaborative relationship you need to build between the business and technical-facing members of the team. I was interested to learn about the tool, <a href="http://www.speclog.net/">SpecLog</a>, TechTalk are building to help teams with this problem, which seems to have many similar goals to my own <a href="http://relishapp.com">Relish</a>. It was nice of Christian to give Relish a name-check in his talk.</p>

<p>My session ran along the same theme as my <a href="http://skillsmatter.com/podcast/home/refuctoring-your-cukes">talk from earlier in the year at Skillsmatter</a>, describing the value of writing acceptance tests at the right level of abstraction, so that they describe business rules rather than implementation details. <a href="http://skillsmatter.com/podcast/agile-scrum/bdd-as-its-meant-to-be-done">You can watch the session here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mattwynne.net/2011/11/28/skillsmatter-bdd-exchange/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

