keystone/doc/source/testing.rst

3.2 KiB

Testing Keystone

Keystone uses a number of testing methodologies to ensure correctness.

Running Built-In Tests

To run the full suites of tests maintained within Keystone, run:

$ ./run_tests.sh --with-progress

This shows realtime feedback during test execution, and iterates over multiple configuration variations.

This differs from how tests are executed from the continuous integration environment. Specifically, Jenkins doesn't care about realtime progress, and aborts after the first test failure (a fail-fast behavior):

$ ./run_tests.sh

Schema Migration Tests

Schema migrations are tested using SQLAlchemy Migrate's built-in test runner:

The test does not start testing from the very top.In order for the test to run, the database that is used to test, should be up to version above the version brought forward by the latest script.:

This command would create the test db with a version of 0.:

$python keystone/backends/sqlalchemy/migrate_repo/manage.py version_control sqlite:///test.db   --repository=keystone/backends/sqlalchemy/migrate_repo/

Use this command to move to the version that is before our latest script.

ie if our latest script has version 3, we should move to 2.:

$python keystone/backends/sqlalchemy/migrate_repo/manage.py upgrade version_number --url=sqlite:///test.db   --repository=keystone/backends/sqlalchemy/migrate_repo/

Now try:

$python keystone/backends/sqlalchemy/migrate_repo/manage.py test  --url=sqlite:///test.db --repository=keystone/backends/sqlalchemy/migrate_repo/

This tests both forward and backward migrations, and should leave behind an test sqlite database (test.db) that can be safely removed or simply ignored.

Writing Tests

Tests are maintained in the keystone.test module. Unit tests are isolated from functional tests.

Functional Tests

The keystone.test.functional.common module provides a unittest-based httplib client which you can extend and use for your own tests. Generally, functional tests should serve to illustrate intended use cases and API behaviors. To help make your tests easier to read, the test client:

  • Authenticates with a known user name and password combination
  • Asserts 2xx HTTP status codes (unless told otherwise)
  • Abstracts keystone REST verbs & resources into single function calls

Testing Multiple Configurations

Several variations of the default configuration are iterated over to ensure test coverage of mutually exclusive featuresets, such as the various backend options.

These configuration templates are maintained in keystone/test/etc and are iterated over by run_tests.py.

Further Testing

devstack is the best way to quickly deploy keystone with the rest of the OpenStack universe and should be critical step in your development workflow!

You may also be interested in either the OpenStack Continuous Integration Project or the OpenStack Integration Testing Project.