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