Input
During the test case execution it is possible to read some user input from the command line. The test execution will stop and wait for keyboard inputs over the standard input stream. The user has to type the input and end it with the return key.
The user input is stored to the respective variable value.
XML DSL
<testcase name="inputTest">
<variables>
<variable name="userinput" value=""></variable>
<variable name="userinput1" value=""></variable>
<variable name="userinput2" value="y"></variable>
<variable name="userinput3" value="yes"></variable>
<variable name="userinput4" value=""></variable>
</variables>
<actions>
<input/>
<echo><message>user input was: ${userinput}</message></echo>
<input message="Now press enter:" variable="userinput1"/>
<echo><message>user input was: ${userinput1}</message></echo>
<input message="Do you want to continue?"
valid-answers="y/n" variable="userinput2"/>
<echo><message>user input was: ${userinput2}</message></echo>
<input message="Do you want to continue?"
valid-answers="yes/no" variable="userinput3"/>
<echo><message>user input was: ${userinput3}</message></echo>
<input variable="userinput4"/>
<echo><message>user input was: ${userinput4}</message></echo>
</actions>
</testcase>
As you can see the input action is customizable with a prompt message that is displayed to the user and some valid answer possibilities. The user input is stored to a test variable for further use in the test case. In detail the input action offers following attributes:
message -> message displayed to the user
valid-answers -> optional slash separated string containing the possible valid answers
variable -> result variable name holding the user input (default = ${userinput})
The same action in Java DSL now looks quite familiar to us although attribute naming is slightly different:
Java DSL designer
@CitrusTest
public void inputActionTest() {
variable("userinput", "");
variable("userinput1", "");
variable("userinput2", "y");
variable("userinput3", "yes");
variable("userinput4", "");
input();
echo("user input was: ${userinput}");
input().message("Now press enter:").result("userinput1");
echo("user input was: ${userinput1}");
input().message("Do you want to continue?").answers("y", "n").result("userinput2");
echo("user input was: ${userinput2}");
input().message("Do you want to continue?").answers("yes", "no").result("userinput3");
echo("user input was: ${userinput3}");
input().result("userinput4");
echo("user input was: ${userinput4}");
}
Java DSL runner
@CitrusTest
public void inputActionTest() {
variable("userinput", "");
variable("userinput1", "");
variable("userinput2", "y");
variable("userinput3", "yes");
variable("userinput4", "");
input(action -> {});
echo("user input was: ${userinput}");
input(action -> action.message("Now press enter:").result("userinput1"));
echo("user input was: ${userinput1}");
input(action -> action.message("Do you want to continue?").answers("y", "n").result("userinput2"));
echo("user input was: ${userinput2}");
input(action -> action.message("Do you want to continue?").answers("yes", "no").result("userinput3"));
echo("user input was: ${userinput3}");
input(action -> action.result("userinput4"));
echo("user input was: ${userinput4}");
}
When the user input is restricted to a set of valid answers the input validation of course can fail due to mismatch. This is the case when the user provides some input not matching the valid answers given. In this case the user is again asked to provide valid input. The test action will continue to ask for valid input until a valid answer is given.
Note User inputs may not fit to automatic testing in terms of continuous integration testing where no user is present to type in the correct answer over the keyboard. In this case you can always skip the user input in advance by specifying a variable that matches the user input variable name. As the user input variable is then already present the user input is missed out and the test proceeds automatically.