[rspec-users] Are you writing "imperative" or "declarative" scenarios in your stories?

Ben Mabey ben at benmabey.com
Mon May 12 18:56:10 EDT 2008


David Chelimsky wrote:
> On May 11, 2008, at 4:01 PM, Ben Mabey wrote:
>
>> Hey all,
>> I just found Bryan Helmkamp's (of webrat fame) slides on a 
>> presentation he did at GoRuCo 2008:
>>
>> http://www.brynary.com/2008/4/26/story-driven-development-slides-posted
>>
>> On slides 21-24 he talks about writing good stories and shows gives 
>> two examples.. the way not to do it and the way to do it.  You can 
>> also see the video of the presentation at confreaks 
>> (http://goruco2008.confreaks.com/01_helmkamp.html -- jump to 13:24 to 
>> see where he talks about the two examples.)  The first is what he 
>> calls an imperative example:
>> ---------------------------------------------------------------------------- 
>>
>> Scenario: Reject duplicate names
>>
>> Given I am on the Developers page
>>
>> When I click the Add Developer button
>>
>> Then I should see the Add Developer page
>>
>> When I enter the first name Zed
>> And I enter the last name Shaw
>> And I click the Create Developer button
>>
>> Then I should see the message "Zed was created"
>> And the Developers list should contain Zed Shaw
>>
>> When I enter the first name Zed
>>
>> And I enter the last name Shaw
>> And I click the Create Developer button
>>
>> Then I should see an error "There can be only one Zed Shaw"
>> ---------------------------------------------------------------------------- 
>>
>>
>> The second is a declarative example and the same scenario reads like:
>>
>> ---------------------------------------------------------------------------- 
>>
>> Scenario: Reject duplicate names
>>
>> Given there is a developer Zed Shaw
>>
>> When I try to add a developer named Zed Shaw
>>
>> Then I should see an error "There can be only one Zed Shaw"
>> ---------------------------------------------------------------------------- 
>>
>> Bryan argues that the imperative version is a poor choice because it 
>> is too coupled to the implementation;  keeping a scenario up to date 
>> with future maintenance changes may be a pain when you have to add or 
>> remove fields.  Additionally, the declarative version removes all of 
>> the noise so that the most important features of that story stand out.
>> The imperative version looks like the "detailed scenarios" that David 
>> talked about at his ETEC slides 
>> (http://blog.davidchelimsky.net/articles/2008/04/01/etec-slides.)  On 
>> slide #75 David gives a good overview of the pros and cons of this 
>> style.  The pros mentioned are that they are easier to write and 
>> easier to change.
>
> To be clear - I mean that the step definitions themselves are easier 
> to write and change - not the supported scenarios. In general, I think 
> the overall maintenance cost is higher with this approach. But I don't 
> agree that it is a definitively poor choice.
>
> There's another factor to consider here - the human factor. Scenarios 
> have an audience with whom they are trying to communicate something. 
> The appropriate level of granularity is going to be driven in part by 
> the communication needs of the audience. Working with FitNesse, I've 
> encountered some stakeholders who really need to see every field 
> represented and others who are perfectly happy with a more abstract 
> representation. This needs to be accounted for when choosing the 
> appropriate level of granularity.
Great point.  Lower level specs (unit tests) are meant for developer use 
only and I think that is the mentality that I was getting trapped in for 
the scenarios as well.  Instead of considering just our  confidence and 
yearning for a better design the confidence of the customer also needs 
to be addressed and accounted for.

>
> Also, I find that even when there is a need for high levels of 
> granularity in some cases, this doesn't need to happen throughout a 
> suite of scenarios. For example, let's say that I've got an app that 
> has to run in a browser, on the desktop and through a command line 
> interface. I might have three separate scenarios to describe the login 
> process. I might have one scenario that is high level enough that I 
> can let it drive three different sets of step definitions. Regardless, 
> this would only be required for the login scenario. Any other scenario 
> that requires that the user is logged in can simply say something like 
> "Given that I am logged in as Joe Smith" or "Given that I am logged in 
> with the 'administrator' role", etc.
>
>> While my stories may not read quite as bad as the example presented 
>> by Bryan I have been going down more of the imperative/detailed 
>> scenario route the majority of the time.  I have done this due to the 
>> high reuse of steps that it enables.  I haven't ran into maintenance 
>> issues with them yet but I can understand that point.  The more and 
>> more I think about it the more I agree with Bryan though.  The 
>> declarative version does feel a lot better and seems to keep the 
>> salient points more prominent.  Keeping the stories small, I think, 
>> is also more in line with the typical user stories in XP and other 
>> agile methodologies.  (I would like to see someone stick the first 
>> example on a 3x5 card :). )
>
> It is not necessary to include the scenarios on the card. What goes on 
> the card is the narrative.

Ahh, yes.  Thanks for setting me straight on that.
>
>> I did Use Cases (Alistair Cockburn style) on a project several years 
>> ago and I remember that revealing anything about the interface or 
>> implementation was a big no no.  I realize that user stories != use 
>> cases so I'm trying to find a balance between UI based stories and 
>> more declarative stories that don't reveal the implementation.  The 
>> funny thing is that I started out doing more declarative stories but 
>> my current customer kept wanting to write stories dealing with how 
>> the forms worked.
>
> Exactly!!!!!!
>
>> It seemed silly to fight the customer on this since the app will 
>> always be a web app.. so maybe it is just a balancing act we have to 
>> play on a case by case basis?
>
>
> Exactly!!!!!!
>
>> I'm curious what everyone else on this list has been doing in this 
>> regard.  Are you writing declarative scenarios all the time?  Or are 
>> you reusing a lot of your steps with detailed scenarios?  A little 
>> bit of both maybe?  If so, how do you decide which type of scenario 
>> to use in a given case?  Any other thoughts on this matter?
>
> Definitely a little of both. As with all things, there are always pros 
> and cons to be weighed and the key to the craft is having a number of 
> tools at your disposal and the wisdom to understand which tool to pull 
> out when.
>
> Cheers,
> David

Thanks for your thoughts.  This helped me clear things up and confirmed 
what I was thinking.

-Ben


More information about the rspec-users mailing list