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