mirror of
https://github.com/node-red/node-red.git
synced 2023-10-10 13:36:53 +02:00
Created Testing (markdown)
parent
4ac776b265
commit
62021c91f4
165
Testing.md
Normal file
165
Testing.md
Normal file
@ -0,0 +1,165 @@
|
|||||||
|
# Test components
|
||||||
|
### npm packages
|
||||||
|
Node-RED uses the following packages for testing.
|
||||||
|
- mocha
|
||||||
|
- should
|
||||||
|
- sinon
|
||||||
|
- supertest
|
||||||
|
- istanbul
|
||||||
|
|
||||||
|
### Test directory structure
|
||||||
|
There are test scripts under test directory (https://github.com/node-red/node-red/tree/master/test).
|
||||||
|
Test scripts in `test/nodes` and `test/red` are located in the same hierarchy as the source code in `nodes` and `red`.
|
||||||
|
|
||||||
|
`test/resources` is used for storing files that are needed to run a test script. For example, `70-HTML-test-file.html` is used in `70-HTML_spec.js`.
|
||||||
|
This directory is also used for creating a temporary directory and/or file (e.g. `50-file_spec.js`).
|
||||||
|
|
||||||
|
### Checking the existence of test cases for core components
|
||||||
|
`test/_spec.js` traverses under a `red` directory to check if all .js files have a corresponding `_spec.js` test file.
|
||||||
|
When adding a code in `red` directory, the corresponding test file also needs to be created.
|
||||||
|
|
||||||
|
### Testing environment
|
||||||
|
When you develop a feature that depends on OS or browser, please test on the following environments according to the modification.
|
||||||
|
|
||||||
|
OS
|
||||||
|
- Linux (Ubuntu, Raspbian, etc.)
|
||||||
|
- Mac OS X
|
||||||
|
- Windows
|
||||||
|
|
||||||
|
Browser
|
||||||
|
- Chrome
|
||||||
|
- Safari
|
||||||
|
- Internet Explorer
|
||||||
|
- Firefox
|
||||||
|
|
||||||
|
|
||||||
|
***
|
||||||
|
# Helper node
|
||||||
|
|
||||||
|
There is a helper script for testing a node `test/nodes/helper.js`. When testing a node, it is recommended to use this script.
|
||||||
|
Helper script can start Node-RED server, load a flow, and receive a payload from the previous node, etc.
|
||||||
|
|
||||||
|
### Starting a server
|
||||||
|
`helper.startServer` starts a Node-RED server. To start a Node-RED server on each test case:
|
||||||
|
```
|
||||||
|
beforeEach(function(done) {
|
||||||
|
helper.startServer(done);
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Loading a flow
|
||||||
|
`helper.load` loads a flow then starts the flow. This function has the following arguments in order.
|
||||||
|
|
||||||
|
- `testNode`: (object|array of objects) Module object of a node to be tested returned by require function. This node will be registered, and can be used in `testFlows`.
|
||||||
|
- `testFlows`: (array of objects) [Flow data](https://github.com/node-red/node-red/wiki/Flow-Format) to test a node. If you want to use the flow data exported from Node-RED editor, need to covert it to JavaScript object using JSON.parse().
|
||||||
|
- `testCredentials`: (object) [Node credentials](https://nodered.org/docs/creating-nodes/credentials). This argument is optional.
|
||||||
|
- `cb`: (function) Function to call back when testFlows has been started.
|
||||||
|
|
||||||
|
The minimum script to test a flow is as follows. This case omits `testCredentials`.
|
||||||
|
```
|
||||||
|
var testNode = require("../../../../nodes/core/core/20-inject.js");
|
||||||
|
it('should be loaded', function(done) {
|
||||||
|
var testFlows = [{id:"n1", type:"inject"}];
|
||||||
|
helper.load(testNode, testFlows, function() {
|
||||||
|
var n1 = helper.getNode("n1");
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Receiving a message
|
||||||
|
`helper.getNode` returns a node instance. Any node that is defined in `testFlows` can be retrieved, including `helper` node that is automatically registered when a flow is loaded.
|
||||||
|
Helper node is a mock node with no functionality. By adding "input" event, the helper node can receive a message from the previous node and check if its contents are the expected value.
|
||||||
|
|
||||||
|
The following is a sample test case to check a message that is sent from `inject` node.
|
||||||
|
Once the flow is loaded, "n1" inject node sends a message to "n2" helper node. "n2" node receives a message and checks if the payload is correct.
|
||||||
|
|
||||||
|
```
|
||||||
|
it('should send a message', function(done) {
|
||||||
|
var testFlows = [
|
||||||
|
{id:"n1", type:"inject", payload:"hello world!", once: true, wires:[["n2"]] },
|
||||||
|
{id:"n2", type:"helper"}
|
||||||
|
];
|
||||||
|
helper.load(testNode, testFlows, function() {
|
||||||
|
var n2 = helper.getNode("n2");
|
||||||
|
n2.on("input", function(msg) {
|
||||||
|
msg.should.have.property('payload', 'hello world!');
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Unloading a flow
|
||||||
|
`helper.unload` clears node registration and context, then stops a flow.
|
||||||
|
|
||||||
|
### Stopping a server
|
||||||
|
`helper.stopServer` stops a Node-RED server.
|
||||||
|
To unload a flow then stop a server:
|
||||||
|
|
||||||
|
```
|
||||||
|
afterEach(function(done) {
|
||||||
|
helper.unload().then(function() {
|
||||||
|
helper.stopServer(done);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
***
|
||||||
|
# Testing Node-RED
|
||||||
|
|
||||||
|
### Running a test
|
||||||
|
You can run test scripts with `grunt` command in the `node-red` directory that is cloned from GitHub.
|
||||||
|
|
||||||
|
The following table shows the options for this command.
|
||||||
|
|
||||||
|
Option | Description
|
||||||
|
-------------|-------------
|
||||||
|
`default` | Builds editor content then runs code style checks and unit tests on all components. `default` means to run `grunt` command without option.
|
||||||
|
`test-core` | Runs code style check and unit tests on core runtime code.
|
||||||
|
`test-editor`| Runs code style check on editor code.
|
||||||
|
`test-nodes` | Runs unit tests on core nodes.
|
||||||
|
`clean` | Deletes build outputs
|
||||||
|
`build` | Builds editor contents
|
||||||
|
`dev` | Developer mode: runs node-red, watches for source changes and rebuilds/restart
|
||||||
|
`coverage` | Runs unit tests on all components, and outputs coverage reports.
|
||||||
|
`release` | Creates distribution zip file - this is the content that will get published to npm when do a release and make available as a zip download via GitHub.
|
||||||
|
|
||||||
|
### Testing runtime
|
||||||
|
Runtime consists of `nodes` and `red` directories.
|
||||||
|
When modified these components, the associated test file should be modified or created if not exists.
|
||||||
|
|
||||||
|
#### Running a specific test file
|
||||||
|
To run only a specific test script, run the following command in the `node-red` directory:
|
||||||
|
|
||||||
|
```
|
||||||
|
npm install -g mocha
|
||||||
|
mocha test/nodes/core/core/20-inject_spec.js
|
||||||
|
```
|
||||||
|
|
||||||
|
If you cannot install mocha command globally, run the following command as an alternative:
|
||||||
|
|
||||||
|
```
|
||||||
|
node node_modules/mocha/bin/mocha test/nodes/core/core/20-inject_spec.js
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Checking a coverage report
|
||||||
|
If a pull request causes the code coverage to decrease it will be rejected unless there is a good reason provided. To run all test cases and output coverage report:
|
||||||
|
|
||||||
|
```
|
||||||
|
grunt coverage
|
||||||
|
```
|
||||||
|
|
||||||
|
Once all tests finished, open `index.html` in `coverage/lcov-report` directory to see the coverage report.
|
||||||
|
If the source code that you developed is all covered by test cases, it is ok to send a pull request.
|
||||||
|
|
||||||
|
### Testing editor
|
||||||
|
Currently, there is no test scripts for Node-RED editor. When you modify Node-RED editor, you need to test by hand.
|
||||||
|
You can run Node-RED with the following command to not minify and uglify scripts so that you can view a code on a browser debugger.
|
||||||
|
|
||||||
|
```
|
||||||
|
grunt dev
|
||||||
|
```
|
||||||
|
|
||||||
|
### Sending a pull request
|
||||||
|
After finishing the above procedure, it is ready to send a pull request. Please read [Contributing to Node-RED](https://nodered.org/about/contribute/) again before sending a pull request.
|
Loading…
Reference in New Issue
Block a user