Most implementations of cucumber can automatically replace parameter values with some run time value. Let say in your feature file you want to write steps like this:
Scenario: MyScenario When I print 'Hello from test case {test}' When I save the value '{test}' to my database
Then you might be tempted to write these bindings (dont do this…keep reading!)
[Binding] public class MyBindings { [StepDefinition(@"I print '([^']*)'") ] public void PrintMessage(string Message) { string Name = .... Message = Message.Replace("{test}",Name) Console.WriteLine(Message); } [StepDefinition(@"I save '([^']*)' to my database") ] public void SaveToDatabase(string Message) { string Name = .... Message = Message.Replace("{test}",Name) Console.WriteLine(Message); } }
This way of writing step definitions becomes a real problem as the size of your automation increases:
- we have to repeat the same logic in every step definition.
- Its easy to forget to repeat that code.
- New placeholders need you to find and update all places where this kind of parsing is done.
- Its code that’s needed but not relevant for the objective of the step definitions.
Luckily SpecFlow’s Step Argument Conversion helps us! We can simplify our binding code to this:
[Binding] public class MyBindings { [StepDefinition(@"I print '([^']*)'") ] public void PrintMessage(string Message) => Console.WriteLine(Message); [StepDefinition(@"I save '([^']*)' to my database") ] public void SaveToDatabase(string Message) => Console.WriteLine(Message); [StepArgumentTransformation] public string TransformParsedString(string input) { string Name = ... return input.Replace("{test}",Name); } }
Other implementations of cucumber also implement this principle. Its frequently referred to using these buzzwords:
- Transforms / Transformations
- Parsing / Replacing
- StepArgumentTransformation