Script
Last updated
Last updated
This is a node that runs JavaScript scripts. It is going to help you solve the following tasks:
create complex tests to check the results of one or several nodes;
generate test data;
change other nodes' variables;
perform operations to bring the tested system to a specific state (set_up, tear_down);
debug and access all nodes' states.
The script node editing window is divided into two parts: the code editor and the console output window. To close the console window click the button.
You can use the toolbar above the output window to manage the console behavior:
/- choose what to do with the console output. - clear the window every time you run a script, - display all previous outputs.
- auto scroll to the last line of the output
- clear the console window
Click the RUN
button to execute the script. The execution continues to the last line of the code and finishes when all asynchronous tasks are done (e.g.setTimeout
). The execution is successful if:
there are no syntax errors in the code;
the exceptions raised had been handled;
the execution took no more than 30 seconds (otherwise the execution will be terminated).
Since the call to the script is wrapped in a function, you need to use the return;
command to avoid errors while terminating the script.
To get an error after script termination raise an exception withthrow new Error('Something went wrong');
The script is executed in the Node.js virtual environment. Some Node.js modules and all standard JavaScript features supported by V8 are available.
The ECMAScript 6 standard is supported as well.
fs - a module for interacting with the file system
lodash - a library that provides lots of utility functions
moment.js - a library for managing dates
CryptoJS - a collection of cryptographic algorithms
random-js - a mathematically correct random number generator library
faker.js - a library that lets you generate random data for different entities properties
chai.js - a library that provides a convenient API for making assertions
request - a library that provides a powerful HTTP client
axios - a library for sending HTTP requests
Objects and functions of the script's global scope are listed below.
Every module stated above is automatically added to the execution context and is available in the global scope.
Therequest
library doesn't provide an interface for working with async/await. One possible solution is wrapping request
call in Promise
object
There are different console output methods, such as log, info, warn, error, debug, exception.
Their signatures are equal to the signatures of their standard versions. In the console every method type is highlighted in different color. Each colored line contains the particular row and column where the output method is called. Events of the exception type are displayed along with the stack trace.
In previous versions, TestMace tried to automatically determine if the script had been finished. In new versions, this feature and finish() function were removed.
A script can contain asynchronous calls (e.g. Promise, setTimeout, addEventListener, built-in modules callbacks, etc.). JavaScript provides a convenient mechanism for working with asynchronous operations - async/await. TestMace has full support of async/await and use this mechanism while performing asynchronous operations to determine if the script had been finished. Let's consider the following example:
Console output:
To fix this you should explicitly mark the operation as an asynchronous usind await
keyword. For convenience, we've added delay
function that will allow you to pause the script. This function is compatible with async/await:
New console output:
For further information about async/await we recommend to read a documentation. Following modules support async/await:
fs.promises
axios
Finally, it can be mentioned that script execution can take up to 30 seconds. If it takes more then the error will be thrown.
There is an object used to access the project and the current Script node. It is called tm
and it is available in the global scope.
currentNode: nodeAPI
- the current Script node API
project: nodeAPI
- the project node API
env: envAPI
- the API for accessing the environment variables
cookies: cookie[]
- a list of cookies used in the project
system: object
- an object, which contains the system's environment variables
parent: nodeAPI
- returns a parent node API and null for the project node
name: string
- the given node name
type: string
- the given node type
path: string
- the path to the given node starting with the project root
children: nodeAPI[]
- a list of child nodes APIs
findChild(name: string): nodeAPI
- searches for the child node using its name and returns null if the node doesn't exist
next: nodeAPI
- the API of the next node in the group. If the given node is the last one, null is returned
prev: nodeAPI
- the API of the previous node in the group. If the given node is the first one, null is returned
nextNodes: nodeAPI[]
- a list of all next nodes in the group. If the given node is the last one, an empty list is returned
prevNodes: nodeAPI[]
- a list of all previous nodes in the group. If the given node is the first one, an empty list is returned
vars: object
- the object that stores all static variables of the given node
dynamicVars: object
- the object that stores all dynamic variables of the given node
setDynamicVar(name: string, value: any): void
- sets the name dynamic variable with a certain value for the given node
The interface of a RequestStep
node is more advanced.
request: object
- the object that stores the node's request configuration
response: object
- the object that stores the results of the last request
active: string
- the active environment title
vars: object
- the object that stores the current environment variables
The code below shows how to pass data to all children of the current node.
You can find a child node by its name using the findChild
method:
Here is how you can generate a random string identifier using the faker
library and setting as the next node's dynamic variable UUI
. Once you've run the script, you can reference this variable in an URL, request body, etc.