Tutorial 8 – Sharing data between steps in Behave BDD
Welcome to the 8th article in Behave BDD series!
What you will Learn :
Overview of sharing data between steps
‘context’ variable
Practical Example#1
Practical Example#2
Add a scenario in example#2
Overview of sharing data between steps
In the previous tutorial, we saw how to pass parameters to steps. Now we will see how to pass parameters between steps. This is required because we need to share information between ‘steps’ frequently. By ‘steps’ we mean the functions in the step definition file.
Now, Python keeps variables alive only in the function they are defined. We cannot access these variables outside of the function they are defined in. However, there might be a need to send data from first function to the second function. So how can we achieve this? Behave provides us a feature to accomplish that.
Please note that it is not a good practice to define global variables. The reason being, global variables are only useful in the file they are defined. These cannot be used outside of the file. During testing, we will be having lots of step definitions and we might need to share the same information all over the place. Global var will not be of any help here.
For example, lets suppose we have the browser open and the instance of the browser is stored in a variable. Our tests will be in different files and all these the files should be able to access the browser. This is not possible using global var.
Look at the below example:
A random email id is being generated in the first step (Given)
We want to login using the same email id in next step (When). But how do we know what the email is?
Finally we want to verify the same email id in next step (Then)
So we need some way to store the value of email id that got generated in the first step and use that value in the subsequent steps.
‘context’ variable
The ‘context’ variable is an instance of a class that is used to store contextual data during test run. The syntax is:
context.<variable name> = <value>
Example:
context.rand_email = ‘TestUser1@email.com’
Now we can use this variable in our selenium code (pseudo code below):
during run-time this would have the value TestUser1@email.com
email_username_field.send_keys(context.rand_email)
Important note: context.rand_email representing email address is only valid for a particular scenario in a feature file. So we cannot share the context variables between other scenario(s). We will see this in a practical example soon.
Practical Example#1
Let us consider the same feature
Let us write the step defintion for the ‘Given’ step. Notice step#8. Here we are creating a varibale that we can use in other steps
Let us run this much, as you see below, the value of variable gets printed
Let us implement ‘When’ step now that will use the same variable
Let us run, see that value gets printed
Let us implement ‘Then’ step now that will use the same variable
Let us run, see that value gets printed
So this is how we can share the data between steps.
Practical Example#2
Let us look at another example
Below is step def file
Lets run it, notice the o/p
Add a scenario in example#2
Let us now add one more scenario to our above example. This is a test case where we are re-requesting for a refund
Let us write step def for the ‘When’ step and let us use the same variable, see below
Now when we run the feature, we get an error. The reason being, the variable that was used in first scenario is not valid for another scenario
Similarly let us add the ‘Then’ step
Now when we run the feature, we get the same error. The summary also says that 1 scenario passed and 1 failed
So this is how we share the data between steps.
Thank you for reading!