Gherkin in Behat and input validations scenarios - bdd

I am using Gherkin in Behat and I face an input problem in the validation scenario. Here is the example of the scenario I wrote, but Behat doesn't understand the difference between variable definition in Tags <variable> and test invalid input like special characters of tags <testspecialchar>
Scenario Outline:
- Incorrect entry at input variable
- Given user logged with username "sh" and password "123"
- When user enter incorrect data at <input variable>
- Then the user will have
Examples:
| input variable | validation message |
| <testspecialchar> | please, enter valid entry |
| test<specialchar | incorrect entry |
| test>specialchar | incorrect entry |
Could anyone try this before and have solution for that problem?
Thanks for support :)
Shimaa

AFAIK to use these kind of special characters (the ones used by Gherkin) it's needed to escape with a "\" backslash.
I hope this helps

Related

JFlex maximum read length

Given a positional language like the old IBM RPG, we can have a line such as
CCCCCDIDENTIFIER E S 10
Where characters
1-5: comment
6: specification type
7-21: identifier name
...And so on
Now, given that JFlex is based on RegExp, we would have a RegExp such as:
[a-zA-Z][a-zA-Z0-9]{0,14} {0,14}
for the identifier name token.
This RegExp however can match tokens longer than the 15 characters possible for identifier name, requiring yypushbacks.
Thus, is there a way to limit how many characters JFlex reads for a particular token?
Regular expression based lexical analysis is really not the right tool to parse fixed-field inputs. You can just split the input into fields at the known character positions, which is way easier and a lot faster. And it doesn't require fussing with regular expressions.
Anyway, [a-zA-Z][a-zA-Z0-9]{0,14}[ ]{0,14} wouldn't be the right expression even if it did properly handle the token length, since the token is really the word at the beginning, without space characters.
In the case of fixed-length fields which contain something more complicated than a single identifier, you might want to feed the field into a lexer, using a StringReader or some such.
Although I'm sure it's not useful, here's a regular expression which matches 15 characters which start with a word and are completed with spaces:
[a-zA-Z][ ]{14} |
[a-zA-Z][a-zA-Z0-9][ ]{13} |
[a-zA-Z][a-zA-Z0-9]{2}[ ]{12} |
[a-zA-Z][a-zA-Z0-9]{3}[ ]{11} |
[a-zA-Z][a-zA-Z0-9]{4}[ ]{10} |
[a-zA-Z][a-zA-Z0-9]{5}[ ]{9} |
[a-zA-Z][a-zA-Z0-9]{6}[ ]{8} |
[a-zA-Z][a-zA-Z0-9]{7}[ ]{7} |
[a-zA-Z][a-zA-Z0-9]{8}[ ]{6} |
[a-zA-Z][a-zA-Z0-9]{9}[ ]{5} |
[a-zA-Z][a-zA-Z0-9]{10}[ ]{4} |
[a-zA-Z][a-zA-Z0-9]{11}[ ]{3} |
[a-zA-Z][a-zA-Z0-9]{12}[ ]{2} |
[a-zA-Z][a-zA-Z0-9]{13}[ ] |
[a-zA-Z][a-zA-Z0-9]{14}
(That might have to be put on one very long line.)

How to add the vertical pipes we see in Examples feature of the Scenario Outline in SpecFlow

I would like to add the vertical pipes so that I can have my data table down there under "Examples" feature in Specflow. Anyone to give me any tip so I can go through it?. My scenario outline looks like:
#mytag
Scenario Outline: Check Noun Words
Given Access the AnalyzeStateless URL
And language code
And content of <Sentence>
And the Expected KeyWord <Expected KeyWords>
And the Expected Family ID <Expected FID>
And the index <Index>
When return the XML response
Then the keyword should contain <FamilyID>
Examples:
| Index | Sentence | Expected KeyWords | Expected FID |
| 1 | I need a personal credit card | personal | 92289 |
The "Examples" feature has been manually entered in above case. I have a thousand of rows on an excel file, any appropriate way to get all of the values in one go?
Have you looked at Specflow.Excel which allows you to keep your examples in your excel files?

How many assertions can take place for a scenario

Am writing a sceanarios to verify a card in mobile app in BDD. The card contains 7 elements in it and each has a value or a copy. These need to be verified with predefined values / calculated values. so wanted to know, can i write the Assertions for all the 7 elements in single scenario or split it with 2/3 ?
There are no much details, so I can't be specific with the answer. Let's say you are using Python client for Appium tests. In such case it would be nice to use some unit testing framework (it could be Python built-in unittest module).
I'll recommend you to verify each element in a separate test case. This approach will make your life easier - you'll get separate status for each element verification.
Speaking about "How many assertions can take place for a scenario" question - I believe it depends on tools your are using. With Python unittest you may have a lot of assertions in a single test case, but this is bad practise. Please read the following:
https://softwareengineering.stackexchange.com/questions/7823/is-it-ok-to-have-multiple-asserts-in-a-single-unit-test
If I knew what you were meaning by "card", this would be a help, but lets assume for this that it's a debit/credit card.
What we could do here, is simply have one assertion:
Scenario: Adding a new payment method
Given I have a card with the following details:
| Name | Mr Test McTestington |
| Card Number | 4567 8901 2345 6789 |
| Card Type | Credit |
| Issuer | MasterCard |
| Valid From Date | 01/23 |
| Expiry Date | 12/34 |
| Security Code | 123 |
And the card details are valid
When I add the card as a new payment method
Then I should be able to checkout the items in my basket with the card
And I should see the order confirmation screen
Inside the And the card details are valid step, you would have the validation code for all of the items. This may involve breaking down each of these into functions that can be used elsewhere:
public boolean validName(string name){
bool valid = false;
// validate name - set valid to true if it meets validation criteria
return valid;
}
As an example (Java is not my strong point, but this is just an outline on my suggestion).
In essence, making it readable is what cucumber does best, to describe functionality in language that the Development Team and the Business have agreed on, so that everyone can understand exactly what is being described in your Scenario. It's more about conversations than testing things.
Is it like I have done in my example, where you don't necessarily need to validate each card detail individually?
It all comes down to a judgement call.
And if it does come down to this judgement call, where you believe each thing needs to be validated individually, why not use a Scenario Outline to help you out?
Scenario Outline: Valid card details
Given I have a card with the "<detail>" of "<value>"
Then the card detail "<detail>" should be valid
Examples:
| detail | value |
| Name | Mr Test McTestington |
| Card Number | 4567 8901 2345 6789 |
| Card Type | Credit |
| Issuer | MasterCard |
| Valid From Date | 01/23 |
| Expiry Date | 12/34 |
| Security Code | 123 |

Splitting examples in Given and Then for SpecFlow Scenario Outline

I am writing a specflow scenario with multiple input and output parameters (about 4-5 each). When using scenario outline, I need to write a wide table giving both input and output columns in the same row. Is there any way where I can specify the examples separately for the step definitions? This is for improved readability.
Current state
Given - State of the data
When I trigger action with parameters <input1> and <input2> and ...
Then my output should contain <output1> and <output2> ...
Examples:
| input1 | input2 |... | output1 | output2 |...
Can I do this?
Given - State of the data
When I trigger action with parameters <input1> and <input2> and ...
Examples of input
Then my output should contain <output1> and <output2> ...
Examples of output
No, unfortunately that (or anything similar) is not possible.
You could make your inputs and outputs more abstract and possibly merge a few columns. Example: instead of Country | PostalCode | City | Street | House | Firstname | Lastname | etc. you should have | Address | Job title | with values like "EU", "US, missing postal code", "HQ" for the address.
You can't have multiple Example tables for scenario outline but you can pass in data tables for regular scenarios.
The data table will be accessible only to the step that uses it, however you could save it in Scenario Context for subsequent steps.
Not sure if this will work for you if your scenario is complex and spans multiple lines but I thought I'd mention it.
Scenario: Checking outputs for inputs
Given - State of the data
When I trigger action with the following parameters
input1 | input2 | input3 |
data | data | data |
Then my output should contain the following outputs
output1 | output2 | output3 |
data | data | data |

How do I use dynamic arguments in my SpecFlow scenario background?

I have a feature that logs into a trading system and keys a number of trades. Theres a lot of reusable steps at the beginning of each trade (initial trade set up) But each trade has different arguments.
Here is an example
Scenario: Trade 1
Given I have selected my test data: "20003"
And I have connected to VMS with the following details:
| Field | Value |
| Username | user |
| Password | password |
| Session | myServer |
When I run the DCL command to set my privileges to full
Then I expect to see the following:
| Pass Criteria | Timeout |
| Privileges Set | 00:00:30 |
When I ICE to the test account: "System Test"
Then I expect to be ICED see the following:
| Pass Criteria | Timeout |
| "ICED to System Test" | "00:00:10" |
When I run a dcl to delete the company: "Test_Company"
Then I expect to see a confirmation that company: "Test_Company" has been deleted or doesnt exist
So within those steps the 2 things that could change is the "Given" argument so the test data ID and also the Test company at the end.
What I wanted was some way to run a background step so that its being able to know what parameters to enter. So if it was Trade 1 for example it would enter 20003, if it was Trade 2 enter 20004 etc.
Can I do this? I was thinking using the "Example" table that Scenario Outline uses. Or is there a better way to do this? I dont want these repeatable steps in all of my scenarios as it takes up lots of room and doesnt look too readable.
So I did some searching and couldn't find a solution that didn't require a lot of coding so I made this up:
this is what the background looks like
Background:
Given I have selected my test data:
| Scenario | ID |
| DirectCredit_GBP | 20003 |
| Cheque_GBP | 20004 |
| ForeignCheque_GBP | 20005 |
And in order to find which row it should use the method behind it uses ScenarioContext. Here is the method:
[Given(#"I have selected my test data:")]
[When(#"I have selected my test data:")]
public static void setTestDataID(Table data)
{
string scenario = ScenarioContext.Current.ScenarioInfo.Title;
string testDataId = data.ReadTable("Scenario", scenario, "ID"));
TestDriver.LoadTestData(testDataId);
}
What the method does is search the table for the scenario name (using an extension method I wrote) and get the ID, once its got the ID it passes it into my TestDriver method.
It seems to work fine and keeps the test readable.

Resources