jBehave should be more intelligent/flexible with regards to priortisation of 
steps
----------------------------------------------------------------------------------

                 Key: JBEHAVE-247
                 URL: http://jira.codehaus.org/browse/JBEHAVE-247
             Project: JBehave
          Issue Type: Improvement
            Reporter: Stephen Cresswell
            Priority: Minor
         Attachments: LevenshteinDistance.java, 
PrioritizableUnmatchedToPendingStepCreator.java

BDD's strength relies on being able to write fluent scenarios. jBehave's 
support for this is very good, but there is still room for improvement. For 
example a typical scenario might read...

{quote}
Scenario: Schedule Patient Discharge

Given a medical patient called Bob Holness who is not medically fit
When I change Bob's state to medically fit
And select a discharge time of tomorrow morning
And select a discharge complexity of 3 
{color:red}Then Bob's discharge schedule should be displayed on the ward 
board{color}
{quote}

Now in a related scenario let's say I want to cancel while rescheduling a 
discharge...

Scenario: Cancel Rescheduling Patient Discharge

{quote}
Given a medical patient called Bob Holness who already has a discharge schedule
When I reiterate that Bob's state is medically fit
And select a discharge time of tomorrow morning
And cancel the discharge schedule
{color:red}Then Bob's *old* discharge schedule should be displayed on the ward 
board{color}
{quote}

The underlying implementation of assserting Bob's actual discharge schedule is 
the same, but I want to emphasise *the expression of intent* through use of 
words such as old, new, still, etc.

jBehave partially supports this through aliases

{code:title=MySteps.java|borderStyle=solid}
@Then('''$patient discharge schedule should be displayed on the ward board''')
@Aliases(values=['''$patient old discharge schedule should be displayed on the 
ward board'''])
public void assertDischargeScheduleOnWardPage(Patient patient) {
        wardBoardPage.assertDischargeSchedule(patient)
}
{code}

The trouble is that the above fails because of the way in which jBehave matches 
and prioritises steps. Both "Then" and "Alias" steps will match the sentence
"Bob's old discharge schedule should be displayed on the ward board", but 
"Then" will be prioritised based on it's declaration order, causing the value 
"Bob's old" to be passed to the PatientParameterConverter. Since no patient 
exists with the name "Bob's old", the parameter converter will return null and 
the test fails.

Currently the workaround is to reword the steps slightly to prevent both of 
them matching...

{quote}Then {color:red}"{color}Bob's{color:red}"{color} discharge schedule 
should be displayed on the ward board
Then {color:red}"{color}Bob's{color:red}"{color} old discharge schedule should 
be displayed on the ward board{quote}

or

{quote}Then Bob's discharge schedule should be displayed on the ward board
Then Bob's old discharge schedule should {color:red}now{color} be displayed on 
the ward board{quote}

but both are inferior to the original. A nicer (and fairly easy) solution would 
be to base this priortisation on similarity with the string step, using 
something like the Levenshtein distance. Harder, but better yet would be to 
make the prioritsation configurable.

I've attached the first solution (with lots of printlns so you can see how well 
the prioriisation works).




-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://jira.codehaus.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply via email to