Custom Phone Allocation Stepdef¶
Now that we have configured our Glue path and deactivated the Built-in Telephony Stepdefs, we will implement the custom step Given phones as A and B:.
1. Creating a Steps File¶
Create a Steps file by right-clicking on the lang directory -> New -> Steps:

Name the Steps file CustomTelephonyStepdefs. intaQt Studio will append the .steps extension to the file.
Replace the template text with the code below:
1 2 3 | stepdef "a? ?phones? as {phoneTags}:" / ids, details / end |
The Stepdef keyword needs a regular expression (Regex) and a list of parameters.
2. Regular Expression¶
The regular expression defines the text that this Stepdef uses. The question marks ? indicate optional characters. In this case, all the phrases below would match the regular expression:
* a phone as A
* phones as A and B
* phone as B
| Note |
|---|
The leading Given, When, and Then must not be part of the Regex definition. |
3. Parameters¶
This Stepdef is special, because it ends with a colon :. This means that it is a Compound Step that has detail clauses: lines starting with asterisks *. Those details clauses are mapped to the last parameter details that does not correspond to a pair of curly braces `{ }' in the Regex.
The Stepdef takes two parameters, ids and details:
-
The position of the parameters in the text phrase are indicated by the curly braces
{}. -
The first parameter,
idsholds the phone identifiers (characters such asAorB). -
The
phoneTagskeyword enclosed by the curly braces has a special meaning: it implicitly creates the given phones asVirtualPhones.
4. Revise the Stepdef and Feature File¶
Remove the phoneTags keyword form the braces and change our Stepdef. Now it only holds the phone allocation step:
1 2 3 4 | stepdef "a? ?phones? as {}:" / ids, details / println("ids=" + ids) println("details=" + details) end |
Change the Feature File to the following:
1 2 3 4 5 6 | Feature: A phone can dial another phone and connect within 30 seconds Scenario: Phone connection Given phones as A and B: * of type Android |
This Step does not do anything useful aside from taking the two parameters ids and details and printing them.
Running the current Feature File, will display the error below:
1 2 3 4 5 6 7 | 12:54:23.581 [INFO]: Step started: phones as A and B: * of type Android 12:54:23.75 [INFO]: Step ended with status: failed 12:54:23.751 [INFO]: [Error: unresolvable property or identifier: A] [Near : {... A and B ....}] ^ [Line: 1, Column: 1] |
The elements A and B are not defined, meaning, they are not part of the scenario execution context.
| Important! |
|---|
An empty pair of curly braces { } in the Stepdef Regex tries to evaluate the corresponding expression against the scenario execution context before passing it on to the Stepdef. Since A and B are not there, the evaluation fails and the test will not run. |
5. Fix the Stepdef¶
Add the phoneTags keyword to the custom Stepdef to fix the issued faced in Step 4:
1 2 3 4 | stepdef "a? ?phones? as {phoneTags}:" / ids, details / println("ids=" + ids) println("details=" + details) end |
Run the test case again. At the bottom of the intaQt Studio window, you will see a list of executed steps, step details and their status.
Click on the step phones A and B:

The output from ids shows a list of two elements: [A, B]. By using the phoneTags keyword, A and B are implicitly created as Virtual Phones. We can now make use of these phones by adapting our Stepdef.
6. Access the Phone¶
Revise your Stepdef to the following:
1 2 3 4 5 6 7 8 | stepdef "a? ?phones? as {phoneTags}:" / ids, details / println("ids= " + ids) println("details= " + details) for phone in ids p := getContextObject(phone) println("p is " + p) end end |
After printing the parameters, a for loop runs through the elements in ids and prints them out. Accessing the Scenario execution context is done using getContextObject(phone). Here that phone is the loop variable.
| Note |
|---|
A and B are part of the context since they were implicitly created when the stepdef started. This is why we can retrieve them and print them. |
In the next section, we will create a virtual phone call. Read the information below for further details about phoneTags.
Additional Notes¶
Using the phoneTags Keyword: Single Phone¶
When using the phoneTags keyword for a stepdef parameter, the phones are always passed as a list.
Use the command below for a single phone like this:
1 2 | Given phones as A: * of type Android |
In this case, the parameter is still passed as a list of VirtualPhones, but with a single element.
Using the phoneTags Keyword: Multiple Phones¶
Use commas , and the word and as separators in lists when specifying multiple phones:
1 2 | Given phones as A and B, C and D: * of type Android |
If you need a single VirtualPhone element, the phoneTag keyword may be used. The parameter is passed as a single phone (as opposed to a single element list). Details can be found in the intaQt manual.