StackStorm has multiple types of tests. To run a particular test suite we use Makefile targets. Underneath, those make targets create a virtual environment, install the required Python dependencies and use nose Python test runner to run the tests.

Unit tests

Unit tests exercise small units/pieces of code (usually those are functions) and don’t require any services or 3rd party dependencies to run. Besides manipulating the state in memory, they usually have no other side affects.

In cases where a unit you are testing requires a service to run, you should use the mock library to mock the service and the result.

Note: Currently some of the unit tests require database (MongoDB) and message bus (RabbitMQ) to run. We are in process of moving those tests to the integration test suite.

Unit tests are located in <component>/tests/unit/, e.g. st2api/tests/unit/.

Integration tests

Integration tests exercise small pieces of code which require some StackStorm services such as a database and message bus to run. Usually they have side affects (e.g. changing the state in the db, etc.).

Integration tests are located in <component>/tests/integration, e.g. st2actions/tests/integration/.

End-to-end tests

End-to-end tests exercise the system as a whole, and require all the StackStorm services and dependencies (database, message bus, etc.) to run.

Usually they exercise the API and the system using the CLI and/or the Python API client.

Running all Tests

To run all tests, run the following command:

make pytests

Running all Unit Tests

To run all unit tests, run the following command:

make unit-tests

Running all Integration Tests

To run all integration tests, run the following command:

make itests

Running all Tests in a Test File

To run all the tests located in a single test file, move to the root of the repository and run the following command:

nosetests --nocapture <path to the test file>

For example:

nosetests --nocapture st2reactor/tests/unit/test_enforce.py

The --nocapture flag tells the nose test runner to directly output any stdout and stderr generated during the test execution instead of capturing and ignoring it.