Cross-project Unit Testing

Libraries in OpenStack have an unusual ability to introduce breaking changes. All of the projects are run together from source in one form or another during the integration tests, but they are not combined from source when unit tests are run. The server applications do not generally import code from other projects, so their unit tests are isolated. The libraries, however, are fundamentally intended to be used during unit tests as well as integration tests. Testing the full cross-product of libraries and consuming projects would consume all available test servers, and so we cannot run all of the tests on all patches to the libraries. As an alternative, we have a few scripts in oslotest for running the unit tests in serial. The result takes far too long (usually overnight) to run in the OpenStack infrastructure. Instead, they are usually run by hand on a dedicated system. A cloud VM works well for this purpose, especially considering how much of it is now automated.

Check Out OpenStack Source

The first step for all of the cross-project unit tests tools is to ensure that you have a full copy of the OpenStack source checked out. You can do this yourself through gerrit’s ssh API, or you can use the clone_openstack.sh command in the tools directory of the openstack/oslo-incubator repository.

For example:

$ mkdir -p ~/repos/openstack
$ cd ~/repos/openstack
$ git clone https://opendev.org/openstack/oslo-incubator
$ cd ~/repos
$ ./openstack/oslo-incubator/tools/clone_openstack.sh

The first time the script runs it will take quite some time, since it has to download the entire history of every OpenStack project.

Testing One Project

oslo_run_cross_tests runs one set of unit tests for one library against all of the consuming projects. It should be run from the directory with the library to be tested, and passed arguments telling it about another project whose tests should be run.

For example, to run the py27 test suite from nova using the currently checked out sources for oslo.config, run:

$ cd ~/repos/openstack/oslo.config
$ tox -e venv -- oslo_run_cross_tests ~/repos/openstack/nova py27

Testing All Consumers

oslo_run_pre_release_tests builds on oslo_run_cross_tests to find all of the consuming projects and run their tests automatically. The pre-release script needs to know where the source has been checked out, so the first step is to create its configuration file.

Edit ~/.oslo.conf to contain:

[DEFAULT]
repo_root = /path/to/repos

Replace /path/to/repos with the full, expanded, absolute path to the location where the source code was checked out. For example, if you followed the instructions above using clone_openstack.sh in ~/repos and your user name is theuser the path would be /home/theuser/repos.

Returning to the earlier example, to test oslo.config with all of the projects that use it, go to the oslo.config source directory and run oslo_run_pre_release_tests.

$ cd ~/repos/openstack/oslo.config
$ tox -e venv -- oslo_run_pre_release_tests

The output for each test set is logged to a separate file in the current directory, to make them easy to examine.

Use the --update or -u option to force a git pull for each consuming projects before running its tests (useful for maintaining a long-running system to host these tests).

Use the --verbose or -v option to report more verbosely about what is happening, including the number of projects being tested.

Use --env or -e to add a tox environment to test. By default the py27 and pep8 environments are used because those have been shown to provide a good balance between finding problems and running the tests quickly.

Use the --ref option to test a specific commit reference of the library under test. The default is to leave the source directory untouched, but if this option is specified git checkout is used to force the source tree to the specified reference.