Steps
Steps define individual HTTP requests and their associated configurations within a scenario.
Scenario can contain multiple steps, each representing a unique request to be executed during the test.
Creating Steps
Creating step from a scenario instance:
use VoltTest\VoltTest;
$test = new VoltTest('API Test');
$scenario = $test->scenario('Login Flow');
$scenario->step('Login') // Step name is required
->post('https://api.example.com/login');
HTTP Methods
GET Request
$scenario->step('Get Users')
->get('https://api.example.com/users')
->header('Accept', 'application/json');
POST Request
Json body is required for POST requests:
$scenario->step('Create User')
->post('https://api.example.com/users', '{"name": "John"}')
->header('Content-Type', 'application/json');
Html form data can be sent as an array:
$scenario->step('Submit Form')
->post('https://api.example.com/users', 'email=${email}&password=${password}')
->header('Content-Type', 'application/x-www-form-urlencoded');
PUT Request
$scenario->step('Update User')
->put('https://api.example.com/users/1', '{"name": "Updated"}');
PATCH Request
$scenario->step('Patch User')
->patch('https://api.example.com/users/1', '{"status": "active"}');
DELETE Request
$scenario->step('Delete User')
->delete('https://api.example.com/users/1');
HEAD Request
$scenario->step('Check Status')
->head('https://api.example.com/status');
OPTIONS Request
$scenario->step('Get Options')
->options('https://api.example.com/users');
Headers
Add custom headers to requests:
$scenario->step('Create User')
->post('https://api.example.com/users', '{"name": "John"}')
->header('Authorization', 'Bearer token')
->header('Accept', 'application/json')
->header('X-Custom-Header', 'value');
Data Extraction
Data can be extracted from responses and used in subsequent requests.
Let's say you have a login request that returns a token in the response. You can extract the token and use it in subsequent requests.
JSON Response
Extract data from a JSON response:
$scenario->step('Login')
->post('https://api.example.com/login', '{"name": "John"}')
->header('Content-Type', 'application/json')
->extractFromJson('token', 'meta.token');
Support for array Indexing in JSON path
You can extract data from JSON arrays using the array index.
$scenario->step('Login')
->post('https://api.example.com/login', '{"name": "John"}')
->header('Content-Type', 'application/json')
->extractFromJson('email', 'data[0].users[0].email');
Here, email will store the value of attribute from the first object in the data array.
Example usage in subsequent steps:
$scenario->get('https://api.example.com/profile')
->header('Authorization', 'Bearer ${token}');
HTML Response
Extract data from an HTML response:
$scenario->step('Get Login Page')
->get('https://example.com/login')
->extractFromHtml('csrf', 'input[name="_token"]', 'value');
The above code will extract the value of the input field with the name _token and store it in the csrf variable.
You can also specify the form action URL to extract data from a specific form:
$scenario->step('Get Login Page')
->get('https://example.com/login')
->extractFromHtml('csrf', 'form[action="http://localhost/login"] input[name="_token"]', 'value');
Here, the csrf variable will store the value of the input field with the name _token from the form with the action URL http://localhost/login.
$scenario->step('Get Login Page')
->get('https://example.com/login')
->extractFromHtml('csrf', '.login-form input[name="_csrf"]', 'value');
Here, the csrf variable will store the value of the input field with the name _csrf from the form with the class login-form.
$scenario->step('Get Page')
->get('https://example.com/login')
->extractFromHtml('csrf', 'div#test', 'data-test');
Here, the csrf variable will store the value of the data attribute data-test from the div with the id test.
Headers
Extract data from response headers:
$scenario->step('Login')
->post('https://api.example.com/login', '{"name": "John"}')
->header('Content-Type', 'application/json')
->extractFromHeader('token', 'Authorization');
Here, token is the variable name, and Authorization is the header name to extract the value from the response headers.
So, the extracted value will be stored in the token variable and can be used in subsequent steps.
Cookies
Extract data from cookies:
$loginScenario->step('submit_login')
->post(
'https://example.com/login',
'_token=${csrf_token}&email=tes11t1v@mai1l.com&password=12345678'
)
->extractFromCookie('session', 'laravel_session')
->extractFromCookie('XSRF-TOKEN', 'XSRF-TOKEN')
->header('Content-Type', 'application/x-www-form-urlencoded');
Regular Expressions
Extract data using regular expressions:
$scenario->step('Get Login Page')
->get('https://example.com/login')
->extractFromRegex('csrf', 'name="_token" value="(.+?)"');
Here, csrf is the variable name, and name="_token" value="(.+?)" is the regular expression to extract the value from the response.
Response Validation
For now, VoltTest php sdk supports validating the response status code only.
Validate Status
$scenario->step('Login')
->post('https://api.example.com/login', '{"name": "John"}')
->validateStatus('success', 200);
Here, success is the validation name, and 200 is the expected status code.
So if the response status code is not 200, This will add an error to the test report.
Think Time
Think time is the delay after a step finishes executing. The default think time is 0 seconds.
Adding a delay after step execution:
$scenario->step('Get Page')
->get('https://example.com')
->setThinkTime('2s'); // 2-second delay after this step
This overrides the scenario-level think time for this specific step.
Using Variables
Reference extracted variables in subsequent steps:
// Extract token from login response
$scenario->step('Login')
->post('/login', '{"username": "user", "password": "pass"}')
->extractFromJson('token', 'data.token');
// Use token in next request
$scenario->step('Get Profile')
->get('/profile')
->header('Authorization', 'Bearer ${token}');
Complete Example
$scenario->step('Get Form')
->get('https://example.com/form')
->header('Content-Type', 'application/x-www-form-urlencoded')
->extractFromRegex('csrf', 'name="_token" value="(.+?)"')
->validateStatus('success', 200)
->setThinkTime('1s');
$scenario->step('Process Result')
->post('https://example.com/form', 'name=John')
->header('X-CSRF-TOKEN', '${csrf}')
->validateStatus('success', 200);
This example demonstrates a scenario with two steps:
- Get Form: Sends a GET request to
https://example.com/form, extracts the CSRF token from the response, and validates the status code. - After a 1-second delay, the Process Result step sends a POST request to
https://example.com/formwith the CSRF token extracted from the previous step.
Validation Rules
- Step name is required
- URLs must be valid HTTP/HTTPS URLs
- Headers must follow RFC 7230 requirements
- JSON paths must be valid expressions
- Regex patterns must be valid
- Think time must use valid time units (s/m/h)