qa-specs/specs/tempest-library.rst
Ken'ichi Ohmichi d27fb0779c Write the detail of tempest-lib REST Client dev
At Paris summit, we had a consensus that we will implement the
base REST Client code in tempest-lib.
This patch writes the detail of the development.

Change-Id: I5a00936362ae852dda43b145dbc415a5795b5cba
2014-12-10 08:39:25 +00:00

146 lines
5.8 KiB
ReStructuredText

..
This work is licensed under a Creative Commons Attribution 3.0 Unported
License.
http://creativecommons.org/licenses/by/3.0/legalcode
..
===========================================
Create Separate Functional Testing Library
===========================================
https://blueprints.launchpad.net/tempest/+spec/tempest-library
With a recent desire to create a number of functional tests for individual
OpenStack projects a common toolkit for building functional tests is needed.
Using Tempest's core functionality start a new functional testing library to
reuse this code in spinning up new project specific test suites.
Problem description
===================
For several years Tempest has been the integrated test suite for OpenStack.
However, recently as the scope and complexity of Tempest have continued to grow
we've found that there is a need for project specific functional testing. With
the ease of spinning up devstack slaves for testing this is a simple thing to
add to the ci infrastructure. However writing the functional test suite is not
as straightforward and would require a great deal of duplicated effort between
the projects.
Proposed change
===============
Take what common test infrastructure we have currently in tempest and split it
out into a separate library. This library will live in a separate repository,
published on pypi, have a separate bug tracker, and enforce a stable api for
use. (which will be enforced with unit testing) The intent is for this library
to be usable to build a functional test suite using the same building blocks as
Tempest.
As functionality is moved from Tempest into the library it may need to be
refactored slightly to be portable. For example, the RestClient and the service
clients will need to be refactored to not depend on the tempest config file.
These changes should occur at the same time the functionality is added to the
library.
Once a set of functionality is ported to the library it can be removed from
tempest tree and the library used instead. We should do this as soon as the
functionality lands in the library. This will ensure that we aren't maintaining
2 sets of the same code. It will also help ensure the functionality of the code
by actually using the library interface inside of tempest. For example consider
this workflow with python-novaclient CLI tests:
#. Add CLI base test classes with core functionality to the new library
#. Switch the tempest CLI tests to use the library instead
#. Remove code in tempest which has been switched to the library
#. Add a functional test suite to the novaclient repository and copy the
appropriate CLI tests from tempest
#. Remove the copied novaclient CLI tests from tempest
The first 3 steps from this example will be applied to anything that moves into
the library. Steps 4 and 5 only apply when we've decided a certain class of
testing no longer belongs in tempest.
The first working example of this should be the CLI tests because they were only
added to Tempest before having non-Tempest devstack jobs was a simple matter. By
there very nature they should be a project specific functional test so adding
CLI framework to the library should make it quite simple to move those tests out
of Tempest.
The other aspect to consider is that the library will be consumed by the
projects functional tests, not mandating functionality. All the pieces should
be optional, so that projects can use what they need to. For example, while the
tempest clients will be available in the library there should be no requirement
to use it. Also, until decisions are made around removing a certain class of
testing from tempest we shouldn't be removing tests from tempest.
Alternatives
------------
One alternative is that we modify code inside of Tempest to do the same basic
functionality. The issue with this is that tempest will become overloaded with
having too many jobs. Additionally, the new library could conceivably contain
features and code that would have no place inside of Tempest, but would belong
in the project specific functional testing. Additionally, splitting it out into
separate library will make the publishing and release a simpler matter, since
we wouldn't necessarily want to be publishing all of tempest on pypi as a
test-requirement for the projects.
Implementation
==============
Assignee(s)
-----------
Primary assignee:
Matthew Treinish <mtreinish@kortar.org>
Other contributors:
Ken'ichi Ohmichi <oomichi@mxs.nes.nec.co.jp>
Milestones
----------
Target Milestone for completion:
Kilo Release
Work Items
----------
* Start new repository for the library
* Create launchpad page for the project
* Create PyPI entry for the project
* Copy base test class and other core functionality to run tests
* Copy and remove config and tempest specific code from CLI test framework
* Add devstack support for installing the library from git
* Setup the infra jobs to make it co-gating along with all the projects that
consume it
* Migrate other commmon features and utilities related to testing, for example:
* Exceptions
* Common decorators
* Matchers
* SSH validation code
* Copy and convert the Tempest REST Client
* Clean up the REST Client code
* Separate the base REST Client code from Tempest specific code
* Move the REST Client specific exception to base REST Client code
* Copy the base REST Client code to tempest-lib repository
* Switch Tempest to use the base REST Client code of tempest-lib
* Copy and convert the Tempest service clients
* Add documentation and examples for using the libraries interfaces
Dependencies
============
This shouldn't be dependent on any other effors, however it may cause conflicts
with other BPs in progress, so care should be made when porting things to ensure
all the in progress efforts don't end up being lost in the aftermath of a
library conversion.