blob: e5f45ac1b94df161a1b897035b032b94f12f4290 [file] [log] [blame]
Attila Fazekas23fdf1d2013-06-09 16:35:23 +02001Tempest Coding Guide
2====================
3
Joe Gordon1374f882013-07-12 17:00:34 +01004- Step 1: Read the OpenStack Style Commandments
chenxinge98720a2017-07-19 03:42:23 +00005 https://docs.openstack.org/hacking/latest/
Joe Gordon1374f882013-07-12 17:00:34 +01006- Step 2: Read on
7
8Tempest Specific Commandments
9------------------------------
10
ghanshyam50f19472014-11-26 17:04:37 +090011- [T102] Cannot import OpenStack python clients in tempest/api &
12 tempest/scenario tests
Matthew Treinish5e4c0f22013-09-10 18:38:28 +000013- [T104] Scenario tests require a services decorator
Andrea Frittolia5ddd552014-08-19 18:30:00 +010014- [T105] Tests cannot use setUpClass/tearDownClass
Masayuki Igawafcacf962014-02-19 14:00:01 +090015- [T106] vim configuration should not be kept in source files.
Ken'ichi Ohmichi7581bcd2015-02-16 04:09:58 +000016- [T107] Check that a service tag isn't in the module path
Ken'ichi Ohmichi80369a92015-04-06 23:41:14 +000017- [T108] Check no hyphen at the end of rand_name() argument
John Warren3059a092015-08-31 15:34:49 -040018- [T109] Cannot use testtools.skip decorator; instead use
Andrea Frittoli (andreaf)1370baf2016-04-29 14:26:22 -050019 decorators.skip_because from tempest.lib
Ken'ichi Ohmichic0d96be2015-11-11 12:33:48 +000020- [T110] Check that service client names of GET should be consistent
Ken'ichi Ohmichi4f525f72016-03-25 15:20:01 -070021- [T111] Check that service client names of DELETE should be consistent
Ken'ichi Ohmichi0dc97472016-03-25 15:10:08 -070022- [T112] Check that tempest.lib should not import local tempest code
Ken'ichi Ohmichid079c892016-04-19 11:23:36 -070023- [T113] Check that tests use data_utils.rand_uuid() instead of uuid.uuid4()
Matthew Treinish59d9eaa2016-05-31 23:42:55 -040024- [T114] Check that tempest.lib does not use tempest config
Ken'ichi Ohmichif741d0b2017-05-01 16:56:14 -070025- [T115] Check that admin tests should exist under admin path
Ghanshyam2a180b82014-06-16 13:54:22 +090026- [N322] Method's default argument shouldn't be mutable
Attila Fazekas23fdf1d2013-06-09 16:35:23 +020027
Matthew Treinish8b372892012-12-07 17:13:16 -050028Test Data/Configuration
29-----------------------
30- Assume nothing about existing test data
31- Tests should be self contained (provide their own data)
32- Clean up test data at the completion of each test
33- Use configuration files for values that will vary by environment
34
35
Attila Fazekas10fd63d2013-07-04 18:38:21 +020036Exception Handling
37------------------
38According to the ``The Zen of Python`` the
Attila Fazekas58d23302013-07-24 10:25:02 +020039``Errors should never pass silently.``
Attila Fazekas10fd63d2013-07-04 18:38:21 +020040Tempest usually runs in special environment (jenkins gate jobs), in every
41error or failure situation we should provide as much error related
42information as possible, because we usually do not have the chance to
43investigate the situation after the issue happened.
44
45In every test case the abnormal situations must be very verbosely explained,
46by the exception and the log.
47
48In most cases the very first issue is the most important information.
49
Mithil Arunbe067ec2014-11-05 15:58:50 +053050Try to avoid using ``try`` blocks in the test cases, as both the ``except``
51and ``finally`` blocks could replace the original exception,
Attila Fazekas10fd63d2013-07-04 18:38:21 +020052when the additional operations leads to another exception.
53
Mithil Arunbe067ec2014-11-05 15:58:50 +053054Just letting an exception to propagate, is not a bad idea in a test case,
Bruce R. Montague44a6a192013-12-17 09:06:04 -080055at all.
Attila Fazekas10fd63d2013-07-04 18:38:21 +020056
57Try to avoid using any exception handling construct which can hide the errors
58origin.
59
60If you really need to use a ``try`` block, please ensure the original
61exception at least logged. When the exception is logged you usually need
62to ``raise`` the same or a different exception anyway.
63
Chris Yeohc2ff7272013-07-22 22:25:25 +093064Use of ``self.addCleanup`` is often a good way to avoid having to catch
65exceptions and still ensure resources are correctly cleaned up if the
66test fails part way through.
67
Mithil Arunbe067ec2014-11-05 15:58:50 +053068Use the ``self.assert*`` methods provided by the unit test framework.
69This signals the failures early on.
Attila Fazekas10fd63d2013-07-04 18:38:21 +020070
Mithil Arunbe067ec2014-11-05 15:58:50 +053071Avoid using the ``self.fail`` alone, its stack trace will signal
Bruce R. Montague44a6a192013-12-17 09:06:04 -080072the ``self.fail`` line as the origin of the error.
Attila Fazekas10fd63d2013-07-04 18:38:21 +020073
74Avoid constructing complex boolean expressions for assertion.
Attila Fazekas7899d312013-08-16 09:18:17 +020075The ``self.assertTrue`` or ``self.assertFalse`` without a ``msg`` argument,
76will just tell you the single boolean value, and you will not know anything
77about the values used in the formula, the ``msg`` argument might be good enough
78for providing more information.
79
80Most other assert method can include more information by default.
Attila Fazekas10fd63d2013-07-04 18:38:21 +020081For example ``self.assertIn`` can include the whole set.
82
Matthew Treinishf45ba2e2015-08-24 15:05:01 -040083It is recommended to use testtools `matcher`_ for the more tricky assertions.
84You can implement your own specific `matcher`_ as well.
Attila Fazekas7899d312013-08-16 09:18:17 +020085
Matthew Treinishf45ba2e2015-08-24 15:05:01 -040086.. _matcher: http://testtools.readthedocs.org/en/latest/for-test-authors.html#matchers
Attila Fazekas7899d312013-08-16 09:18:17 +020087
Attila Fazekas10fd63d2013-07-04 18:38:21 +020088If the test case fails you can see the related logs and the information
89carried by the exception (exception class, backtrack and exception info).
Mithil Arunbe067ec2014-11-05 15:58:50 +053090This and the service logs are your only guide to finding the root cause of flaky
91issues.
Attila Fazekas10fd63d2013-07-04 18:38:21 +020092
Attila Fazekas7899d312013-08-16 09:18:17 +020093Test cases are independent
94--------------------------
95Every ``test_method`` must be callable individually and MUST NOT depends on,
96any other ``test_method`` or ``test_method`` ordering.
97
98Test cases MAY depend on commonly initialized resources/facilities, like
99credentials management, testresources and so on. These facilities, MUST be able
Mithil Arunbe067ec2014-11-05 15:58:50 +0530100to work even if just one ``test_method`` is selected for execution.
Attila Fazekas7899d312013-08-16 09:18:17 +0200101
Matthew Treinish5e4c0f22013-09-10 18:38:28 +0000102Service Tagging
103---------------
104Service tagging is used to specify which services are exercised by a particular
Jordan Pittier74a56ab2017-04-26 16:46:20 +0200105test method. You specify the services with the ``tempest.test.services``
106decorator. For example:
Matthew Treinish5e4c0f22013-09-10 18:38:28 +0000107
108@services('compute', 'image')
109
110Valid service tag names are the same as the list of directories in tempest.api
111that have tests.
112
Jordan Pittier74a56ab2017-04-26 16:46:20 +0200113For scenario tests having a service tag is required. For the API tests service
114tags are only needed if the test method makes an API call (either directly or
Matthew Treinish5e4c0f22013-09-10 18:38:28 +0000115indirectly through another service) that differs from the parent directory
Jordan Pittier74a56ab2017-04-26 16:46:20 +0200116name. For example, any test that make an API call to a service other than Nova
117in ``tempest.api.compute`` would require a service tag for those services,
118however they do not need to be tagged as ``compute``.
Matthew Treinish5e4c0f22013-09-10 18:38:28 +0000119
Andrea Frittolia5ddd552014-08-19 18:30:00 +0100120Test fixtures and resources
121---------------------------
122Test level resources should be cleaned-up after the test execution. Clean-up
123is best scheduled using `addCleanup` which ensures that the resource cleanup
124code is always invoked, and in reverse order with respect to the creation
125order.
126
127Test class level resources should be defined in the `resource_setup` method of
128the test class, except for any credential obtained from the credentials
129provider, which should be set-up in the `setup_credentials` method.
130
131The test base class `BaseTestCase` defines Tempest framework for class level
132fixtures. `setUpClass` and `tearDownClass` are defined here and cannot be
133overwritten by subclasses (enforced via hacking rule T105).
134
135Set-up is split in a series of steps (setup stages), which can be overwritten
136by test classes. Set-up stages are:
Masayuki Igawae63cf0f2016-05-25 10:25:21 +0900137
138- `skip_checks`
139- `setup_credentials`
140- `setup_clients`
141- `resource_setup`
Andrea Frittolia5ddd552014-08-19 18:30:00 +0100142
143Tear-down is also split in a series of steps (teardown stages), which are
144stacked for execution only if the corresponding setup stage had been
145reached during the setup phase. Tear-down stages are:
Masayuki Igawae63cf0f2016-05-25 10:25:21 +0900146
147- `clear_credentials` (defined in the base test class)
148- `resource_cleanup`
Andrea Frittolia5ddd552014-08-19 18:30:00 +0100149
150Skipping Tests
151--------------
152Skipping tests should be based on configuration only. If that is not possible,
153it is likely that either a configuration flag is missing, or the test should
154fail rather than be skipped.
155Using discovery for skipping tests is generally discouraged.
156
157When running a test that requires a certain "feature" in the target
158cloud, if that feature is missing we should fail, because either the test
159configuration is invalid, or the cloud is broken and the expected "feature" is
160not there even if the cloud was configured with it.
161
Matthew Treinish8b79bb32013-10-10 17:11:05 -0400162Negative Tests
163--------------
Chris Hoge2b478412016-06-23 16:03:28 -0700164Error handling is an important aspect of API design and usage. Negative
165tests are a way to ensure that an application can gracefully handle
166invalid or unexpected input. However, as a black box integration test
167suite, Tempest is not suitable for handling all negative test cases, as
168the wide variety and complexity of negative tests can lead to long test
169runs and knowledge of internal implementation details. The bulk of
Ken'ichi Ohmichi8db40752016-09-28 14:43:05 -0700170negative testing should be handled with project function tests.
171All negative tests should be based on `API-WG guideline`_ . Such negative
172tests can block any changes from accurate failure code to invalid one.
173
Masayuki Igawa5a3ad342017-03-22 16:27:53 +0900174.. _API-WG guideline: http://specs.openstack.org/openstack/api-wg/guidelines/http.html#failure-code-clarifications
Ken'ichi Ohmichi8db40752016-09-28 14:43:05 -0700175
176If facing some gray area which is not clarified on the above guideline, propose
177a new guideline to the API-WG. With a proposal to the API-WG we will be able to
178build a consensus across all OpenStack projects and improve the quality and
179consistency of all the APIs.
180
181In addition, we have some guidelines for additional negative tests.
182
183- About BadRequest(HTTP400) case: We can add a single negative tests of
184 BadRequest for each resource and method(POST, PUT).
185 Please don't implement more negative tests on the same combination of
186 resource and method even if API request parameters are different from
187 the existing test.
188- About NotFound(HTTP404) case: We can add a single negative tests of
189 NotFound for each resource and method(GET, PUT, DELETE, HEAD).
190 Please don't implement more negative tests on the same combination
191 of resource and method.
192
193The above guidelines don't cover all cases and we will grow these guidelines
194organically over time. Patches outside of the above guidelines are left up to
195the reviewers' discretion and if we face some conflicts between reviewers, we
196will expand the guideline based on our discussion and experience.
Matthew Treinish8b79bb32013-10-10 17:11:05 -0400197
Giulio Fidente83181a92013-10-01 06:02:24 +0200198Test skips because of Known Bugs
199--------------------------------
Giulio Fidente83181a92013-10-01 06:02:24 +0200200If a test is broken because of a bug it is appropriate to skip the test until
Jordan Pittier74a56ab2017-04-26 16:46:20 +0200201bug has been fixed. You should use the ``skip_because`` decorator so that
Giulio Fidente83181a92013-10-01 06:02:24 +0200202Tempest's skip tracking tool can watch the bug status.
203
204Example::
205
206 @skip_because(bug="980688")
207 def test_this_and_that(self):
208 ...
209
Chris Yeohc2ff7272013-07-22 22:25:25 +0930210Guidelines
211----------
212- Do not submit changesets with only testcases which are skipped as
213 they will not be merged.
214- Consistently check the status code of responses in testcases. The
215 earlier a problem is detected the easier it is to debug, especially
216 where there is complicated setup required.
Matthew Treinish96c28d12013-09-16 17:05:09 +0000217
DennyZhang900f02b2013-09-23 08:34:04 -0500218Parallel Test Execution
219-----------------------
Matthew Treinish96c28d12013-09-16 17:05:09 +0000220Tempest by default runs its tests in parallel this creates the possibility for
221interesting interactions between tests which can cause unexpected failures.
Andrea Frittoli (andreaf)17209bb2015-05-22 10:16:57 -0700222Dynamic credentials provides protection from most of the potential race
223conditions between tests outside the same class. But there are still a few of
224things to watch out for to try to avoid issues when running your tests in
225parallel.
Matthew Treinish96c28d12013-09-16 17:05:09 +0000226
Sean Dagueed6e5862016-04-04 10:49:13 -0400227- Resources outside of a project scope still have the potential to conflict. This
Matthew Treinish96c28d12013-09-16 17:05:09 +0000228 is a larger concern for the admin tests since most resources and actions that
Sean Dagueed6e5862016-04-04 10:49:13 -0400229 require admin privileges are outside of projects.
Matthew Treinish96c28d12013-09-16 17:05:09 +0000230
231- Races between methods in the same class are not a problem because
Jordan Pittier74a56ab2017-04-26 16:46:20 +0200232 parallelization in Tempest is at the test class level, but if there is a json
Matthew Treinish96c28d12013-09-16 17:05:09 +0000233 and xml version of the same test class there could still be a race between
234 methods.
235
jeremy.zhangc0f95562017-05-26 13:41:57 +0800236- The rand_name() function from tempest.lib.common.utils.data_utils should be
237 used anywhere a resource is created with a name. Static naming should be
238 avoided to prevent resource conflicts.
Matthew Treinish96c28d12013-09-16 17:05:09 +0000239
240- If the execution of a set of tests is required to be serialized then locking
Jordan Pittier74a56ab2017-04-26 16:46:20 +0200241 can be used to perform this. See usage of ``LockFixture`` for examples of
242 using locking.
Marc Koderer31fe4832013-11-06 17:02:03 +0100243
Matthew Treinish6eb05852013-11-26 15:28:12 +0000244Sample Configuration File
245-------------------------
246The sample config file is autogenerated using a script. If any changes are made
David Kranzfb0f51f2014-11-11 14:07:20 -0500247to the config variables in tempest/config.py then the sample config file must be
248regenerated. This can be done running::
249
Hai Shi6f52fc52017-04-03 21:17:37 +0800250 tox -e genconfig
Matthew Treinishecf212c2013-12-06 18:23:54 +0000251
252Unit Tests
253----------
Jordan Pittier74a56ab2017-04-26 16:46:20 +0200254Unit tests are a separate class of tests in Tempest. They verify Tempest
Matthew Treinishecf212c2013-12-06 18:23:54 +0000255itself, and thus have a different set of guidelines around them:
256
2571. They can not require anything running externally. All you should need to
258 run the unit tests is the git tree, python and the dependencies installed.
259 This includes running services, a config file, etc.
260
2612. The unit tests cannot use setUpClass, instead fixtures and testresources
262 should be used for shared state between tests.
Matthew Treinish55078882014-08-12 19:01:34 -0400263
264
265.. _TestDocumentation:
266
267Test Documentation
268------------------
269For tests being added we need to require inline documentation in the form of
Xicheng Chang6fb98ec2015-08-13 14:02:52 -0700270docstrings to explain what is being tested. In API tests for a new API a class
Matthew Treinish55078882014-08-12 19:01:34 -0400271level docstring should be added to an API reference doc. If one doesn't exist
272a TODO comment should be put indicating that the reference needs to be added.
273For individual API test cases a method level docstring should be used to
274explain the functionality being tested if the test name isn't descriptive
275enough. For example::
276
277 def test_get_role_by_id(self):
278 """Get a role by its id."""
279
280the docstring there is superfluous and shouldn't be added. but for a method
281like::
282
283 def test_volume_backup_create_get_detailed_list_restore_delete(self):
284 pass
285
286a docstring would be useful because while the test title is fairly descriptive
287the operations being performed are complex enough that a bit more explanation
288will help people figure out the intent of the test.
289
290For scenario tests a class level docstring describing the steps in the scenario
291is required. If there is more than one test case in the class individual
292docstrings for the workflow in each test methods can be used instead. A good
293example of this would be::
294
Masayuki Igawa93424e52014-10-06 13:54:26 +0900295 class TestVolumeBootPattern(manager.ScenarioTest):
Dougal Matthews4bebca02014-10-28 08:36:04 +0000296 """
297 This test case attempts to reproduce the following steps:
Matthew Treinish55078882014-08-12 19:01:34 -0400298
Dougal Matthews4bebca02014-10-28 08:36:04 +0000299 * Create in Cinder some bootable volume importing a Glance image
300 * Boot an instance from the bootable volume
301 * Write content to the volume
302 * Delete an instance and Boot a new instance from the volume
303 * Check written content in the instance
304 * Create a volume snapshot while the instance is running
305 * Boot an additional instance from the new snapshot based volume
306 * Check written content in the instance booted from snapshot
307 """
Matthew Treinisha970d652015-03-11 15:39:24 -0400308
Chris Hoge0e000ed2015-07-28 14:19:53 -0500309Test Identification with Idempotent ID
310--------------------------------------
311
312Every function that provides a test must have an ``idempotent_id`` decorator
313that is a unique ``uuid-4`` instance. This ID is used to complement the fully
Naomichi Wakuidbe9aab2015-08-26 03:36:02 +0000314qualified test name and track test functionality through refactoring. The
Chris Hoge0e000ed2015-07-28 14:19:53 -0500315format of the metadata looks like::
316
Ken'ichi Ohmichi8a082112017-03-06 16:03:17 -0800317 @decorators.idempotent_id('585e934c-448e-43c4-acbf-d06a9b899997')
Chris Hoge0e000ed2015-07-28 14:19:53 -0500318 def test_list_servers_with_detail(self):
319 # The created server should be in the detailed list of all servers
320 ...
321
Andrea Frittoli (andreaf)1370baf2016-04-29 14:26:22 -0500322Tempest.lib includes a ``check-uuid`` tool that will test for the existence
Matthew Treinishc1802bc2015-12-03 18:48:11 -0500323and uniqueness of idempotent_id metadata for every test. If you have
Jordan Pittier74a56ab2017-04-26 16:46:20 +0200324Tempest installed you run the tool against Tempest by calling from the
325Tempest repo::
Chris Hoge0e000ed2015-07-28 14:19:53 -0500326
Matthew Treinishc1802bc2015-12-03 18:48:11 -0500327 check-uuid
Chris Hoge0e000ed2015-07-28 14:19:53 -0500328
329It can be invoked against any test suite by passing a package name::
330
Matthew Treinishc1802bc2015-12-03 18:48:11 -0500331 check-uuid --package <package_name>
Chris Hoge0e000ed2015-07-28 14:19:53 -0500332
333Tests without an ``idempotent_id`` can be automatically fixed by running
334the command with the ``--fix`` flag, which will modify the source package
335by inserting randomly generated uuids for every test that does not have
336one::
337
Matthew Treinishc1802bc2015-12-03 18:48:11 -0500338 check-uuid --fix
Chris Hoge0e000ed2015-07-28 14:19:53 -0500339
Jordan Pittier74a56ab2017-04-26 16:46:20 +0200340The ``check-uuid`` tool is used as part of the Tempest gate job
Chris Hoge0e000ed2015-07-28 14:19:53 -0500341to ensure that all tests have an ``idempotent_id`` decorator.
342
Matthew Treinisha970d652015-03-11 15:39:24 -0400343Branchless Tempest Considerations
344---------------------------------
345
346Starting with the OpenStack Icehouse release Tempest no longer has any stable
347branches. This is to better ensure API consistency between releases because
348the API behavior should not change between releases. This means that the stable
349branches are also gated by the Tempest master branch, which also means that
350proposed commits to Tempest must work against both the master and all the
351currently supported stable branches of the projects. As such there are a few
352special considerations that have to be accounted for when pushing new changes
Jordan Pittier74a56ab2017-04-26 16:46:20 +0200353to Tempest.
Matthew Treinisha970d652015-03-11 15:39:24 -0400354
3551. New Tests for new features
356^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
357
358When adding tests for new features that were not in previous releases of the
359projects the new test has to be properly skipped with a feature flag. Whether
360this is just as simple as using the @test.requires_ext() decorator to check
361if the required extension (or discoverable optional API) is enabled or adding
362a new config option to the appropriate section. If there isn't a method of
363selecting the new **feature** from the config file then there won't be a
364mechanism to disable the test with older stable releases and the new test won't
365be able to merge.
366
3672. Bug fix on core project needing Tempest changes
368^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
369
370When trying to land a bug fix which changes a tested API you'll have to use the
371following procedure::
372
Jordan Pittier74a56ab2017-04-26 16:46:20 +0200373 1. Propose change to the project, get a +2 on the change even with failing
374 2. Propose skip on Tempest which will only be approved after the
Matthew Treinisha970d652015-03-11 15:39:24 -0400375 corresponding change in the project has a +2 on change
Jordan Pittier74a56ab2017-04-26 16:46:20 +0200376 3. Land project change in master and all open stable branches (if required)
377 4. Land changed test in Tempest
Matthew Treinisha970d652015-03-11 15:39:24 -0400378
379Otherwise the bug fix won't be able to land in the project.
380
Jordan Pittier74a56ab2017-04-26 16:46:20 +0200381Handily, `Zuul’s cross-repository dependencies
382<https://docs.openstack.org/infra/zuul/gating.html#cross-repository-dependencies>`_.
383can be leveraged to do without step 2 and to have steps 3 and 4 happen
384"atomically". To do that, make the patch written in step 1 to depend (refer to
385Zuul's documentation above) on the patch written in step 4. The commit message
386for the Tempest change should have a link to the Gerrit review that justifies
387that change.
388
Matthew Treinisha970d652015-03-11 15:39:24 -04003893. New Tests for existing features
390^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
391
392If a test is being added for a feature that exists in all the current releases
393of the projects then the only concern is that the API behavior is the same
394across all the versions of the project being tested. If the behavior is not
395consistent the test will not be able to merge.
396
397API Stability
398-------------
399
400For new tests being added to Tempest the assumption is that the API being
401tested is considered stable and adheres to the OpenStack API stability
402guidelines. If an API is still considered experimental or in development then
403it should not be tested by Tempest until it is considered stable.