<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Nick Sieger: RubyConf Day 3: Behaviour-Driven Development with RSpec</title>
    <link>http://blog.nicksieger.com/articles/2007/11/04/rubyconf-day-3-behaviour-driven-development-with-rspec</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description></description>
    <item>
      <title>RubyConf Day 3: Behaviour-Driven Development with RSpec</title>
      <description>&lt;h2&gt;David Chelimsky and Dave Astels: RSpec&lt;/h2&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;describe&lt;/span&gt; &lt;span class="constant"&gt;TestDriverDevelopment&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
  &lt;span class="ident"&gt;it&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;is an incremental process&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
  &lt;span class="ident"&gt;it&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;drives the implementation&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; 
  &lt;span class="ident"&gt;it&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;results in an exhaustive test suite&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
  &lt;span class="comment"&gt;# but also...&lt;/span&gt;
  &lt;span class="ident"&gt;it&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;should focus on design&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
  &lt;span class="ident"&gt;it&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;should focus on documentation&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
  &lt;span class="ident"&gt;it&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;should focus on behaviour&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;BehaviourDrivenDevelopment&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;TestDrivenDevelopment&lt;/span&gt;
  &lt;span class="ident"&gt;include&lt;/span&gt; &lt;span class="constant"&gt;FocusOnDesign&lt;/span&gt;
  &lt;span class="ident"&gt;include&lt;/span&gt; &lt;span class="constant"&gt;FocusOnDocumentation&lt;/span&gt;
  &lt;span class="ident"&gt;include&lt;/span&gt; &lt;span class="constant"&gt;FocusOnBehavior&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;When doing test-driven development:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Write your intent first. The smallest test you can that fails.&lt;/li&gt;
&lt;li&gt;Next, write the implementation. The simplest thing that could possibly work.&lt;/li&gt;
&lt;li&gt;Even though you may be tempted to think about additional edge cases, multiple requirements, etc., you should try to be disciplined and focus only on the immediate tests. Only after you&amp;#8217;ve made one test fail, then pass, can you continue on to other tests.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;RSpec history&lt;/h3&gt;

&lt;p&gt;Initially BDD was just a discussion among Aslak Hellesoy and Dan North in the ThoughtWorks London office. Dave Astels joined the conversation with a blog post stating that he thought these ideas could be easily implemented in Smalltalk or Ruby. Steven Baker jumped in with an initial implementation, and released RSpec 0.1. Later in 2006, maintenance was handed over to David Chelimsky. RSpec has evolved through a dog-fooding phase up to the present 1.0 product.&lt;/p&gt;

&lt;p&gt;BDD is no longer just about &amp;#8220;should instead of assert&amp;#8221;, it&amp;#8217;s evolving into a process. Emphasizing central concepts from extreme programming and domain-driven design, it&amp;#8217;s moving toward focusing on customer stories and acceptance testing. It&amp;#8217;s outside-in, starting at high levels of detail, rather than low-level like RSpec or Test::Unit.&lt;/p&gt;

&lt;h3&gt;Story Runner&lt;/h3&gt;

&lt;p&gt;Story Runner is a new feature intended for RSpec 1.1. Each story is supposed to capture a customer requirement in the following general template:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;As a (role) ... I want to (some function) ... so that (some business value).
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It uses a &amp;#8220;Scenario &amp;#8230; Given &amp;#8230; When &amp;#8230; Then &amp;#8230;&amp;#8221; format to express the high level stories. Scenarios are a series of given items, steps, and behaviour validations. Once the basic steps are established, they can be re-used. David even demonstrated a preview of an in-browser story runner that would allow the customer to play with the implementation and create new scenarios.&lt;/p&gt;

&lt;h3&gt;Pending&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Pending&lt;/em&gt; is a nice way to mark specs as &amp;#8220;in-progress&amp;#8221;. You can either omit a block for your spec, or use &lt;code&gt;pending&lt;/code&gt; inside the block to leave a placeholder to come back to.&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;describe&lt;/span&gt; &lt;span class="constant"&gt;Pending&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
  &lt;span class="ident"&gt;it&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;doesn't need a block to be pending&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
  &lt;span class="ident"&gt;it&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;could also be specified inside the block&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
    &lt;span class="ident"&gt;pending&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;TODO&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt;
    &lt;span class="ident"&gt;this&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;should_not&lt;/span&gt; &lt;span class="ident"&gt;be_a_failure&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="ident"&gt;it&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;could also use a block with pending, and you will be notified when it starts to succeed&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
    &lt;span class="ident"&gt;pending&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;TODO&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
      &lt;span class="ident"&gt;this&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;should_not&lt;/span&gt; &lt;span class="ident"&gt;be_a_failure&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Behaviour-Driven Development in Ruby with RSpec is a new book David and Aslak are working on, due out early next year.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Update: &lt;a href="http://blog.davidchelimsky.net/articles/2007/11/05/rubyconf-slides"&gt;David has posted his slides&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</description>
      <pubDate>Sun, 04 Nov 2007 16:26:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:48613cce-c252-4be0-a12e-923eb239c87a</guid>
      <author>Nick Sieger</author>
      <link>http://blog.nicksieger.com/articles/2007/11/04/rubyconf-day-3-behaviour-driven-development-with-rspec</link>
      <category>rubyconf</category>
      <category>rubyconf2007</category>
      <category>rspec</category>
      <trackback:ping>http://blog.nicksieger.com/articles/trackback/343</trackback:ping>
    </item>
  </channel>
</rss>
