Flavio Percoco | 3d2dac7 | 2016-11-24 13:06:32 +0100 | [diff] [blame] | 1 | ======================== |
| 2 | Team and repository tags |
| 3 | ======================== |
| 4 | |
| 5 | .. image:: http://governance.openstack.org/badges/tempest.svg |
| 6 | :target: http://governance.openstack.org/reference/tags/index.html |
Jordan Pittier | 63746da | 2016-12-09 17:16:51 +0100 | [diff] [blame] | 7 | :remote: |
Flavio Percoco | 3d2dac7 | 2016-11-24 13:06:32 +0100 | [diff] [blame] | 8 | |
| 9 | .. Change things from this point on |
| 10 | |
Jay Pipes | 7f75763 | 2011-12-02 15:53:32 -0500 | [diff] [blame] | 11 | Tempest - The OpenStack Integration Test Suite |
| 12 | ============================================== |
Justin Shepherd | 0d9bbd1 | 2011-08-11 12:57:44 -0500 | [diff] [blame] | 13 | |
Matthew Treinish | dced423 | 2016-07-05 11:20:12 -0400 | [diff] [blame] | 14 | The documentation for Tempest is officially hosted at: |
| 15 | http://docs.openstack.org/developer/tempest/ |
Masayuki Igawa | b5d3293 | 2016-03-25 12:46:43 +0900 | [diff] [blame] | 16 | |
Sean Dague | b56052b | 2013-05-21 17:57:41 -0400 | [diff] [blame] | 17 | This is a set of integration tests to be run against a live OpenStack |
| 18 | cluster. Tempest has batteries of tests for OpenStack API validation, |
| 19 | Scenarios, and other specific tests useful in validating an OpenStack |
| 20 | deployment. |
| 21 | |
Sean Dague | a26454d | 2013-11-01 18:09:55 -0400 | [diff] [blame] | 22 | Design Principles |
Matthew Treinish | 077a563 | 2014-06-04 11:43:10 -0400 | [diff] [blame] | 23 | ----------------- |
Sean Dague | a26454d | 2013-11-01 18:09:55 -0400 | [diff] [blame] | 24 | Tempest Design Principles that we strive to live by. |
| 25 | |
| 26 | - Tempest should be able to run against any OpenStack cloud, be it a |
| 27 | one node devstack install, a 20 node lxc cloud, or a 1000 node kvm |
| 28 | cloud. |
| 29 | - Tempest should be explicit in testing features. It is easy to auto |
| 30 | discover features of a cloud incorrectly, and give people an |
| 31 | incorrect assessment of their cloud. Explicit is always better. |
| 32 | - Tempest uses OpenStack public interfaces. Tests in Tempest should |
Ken'ichi Ohmichi | b824990 | 2016-06-01 17:11:04 -0700 | [diff] [blame] | 33 | only touch public OpenStack APIs. |
Sean Dague | a26454d | 2013-11-01 18:09:55 -0400 | [diff] [blame] | 34 | - Tempest should not touch private or implementation specific |
| 35 | interfaces. This means not directly going to the database, not |
| 36 | directly hitting the hypervisors, not testing extensions not |
OctopusZhang | 03b8900 | 2015-11-05 11:24:14 +0800 | [diff] [blame] | 37 | included in the OpenStack base. If there are some features of |
| 38 | OpenStack that are not verifiable through standard interfaces, this |
Sean Dague | a26454d | 2013-11-01 18:09:55 -0400 | [diff] [blame] | 39 | should be considered a possible enhancement. |
| 40 | - Tempest strives for complete coverage of the OpenStack API and |
| 41 | common scenarios that demonstrate a working cloud. |
| 42 | - Tempest drives load in an OpenStack cloud. By including a broad |
| 43 | array of API and scenario tests Tempest can be reused in whole or in |
| 44 | parts as load generation for an OpenStack cloud. |
| 45 | - Tempest should attempt to clean up after itself, whenever possible |
| 46 | we should tear down resources when done. |
zhangfeng | c53e4e1 | 2015-08-21 04:09:08 +0000 | [diff] [blame] | 47 | - Tempest should be self-testing. |
Justin Shepherd | 0d9bbd1 | 2011-08-11 12:57:44 -0500 | [diff] [blame] | 48 | |
| 49 | Quickstart |
| 50 | ---------- |
| 51 | |
Matthew Treinish | 828734a | 2015-07-06 15:43:46 -0400 | [diff] [blame] | 52 | To run Tempest, you first need to create a configuration file that will tell |
| 53 | Tempest where to find the various OpenStack services and other testing behavior |
| 54 | switches. Where the configuration file lives and how you interact with it |
| 55 | depends on how you'll be running Tempest. There are 2 methods of using Tempest. |
| 56 | The first, which is a newer and recommended workflow treats Tempest as a system |
| 57 | installed program. The second older method is to run Tempest assuming your |
| 58 | working dir is the actually Tempest source repo, and there are a number of |
| 59 | assumptions related to that. For this section we'll only cover the newer method |
| 60 | as it is simpler, and quicker to work with. |
Justin Shepherd | 0d9bbd1 | 2011-08-11 12:57:44 -0500 | [diff] [blame] | 61 | |
OctopusZhang | 03b8900 | 2015-11-05 11:24:14 +0800 | [diff] [blame] | 62 | #. You first need to install Tempest. This is done with pip after you check out |
| 63 | the Tempest repo:: |
Justin Shepherd | 0d9bbd1 | 2011-08-11 12:57:44 -0500 | [diff] [blame] | 64 | |
Ken'ichi Ohmichi | 9883ff2 | 2016-04-22 18:24:15 -0700 | [diff] [blame] | 65 | $ git clone http://git.openstack.org/openstack/tempest |
OctopusZhang | 03b8900 | 2015-11-05 11:24:14 +0800 | [diff] [blame] | 66 | $ pip install tempest/ |
Justin Shepherd | 0d9bbd1 | 2011-08-11 12:57:44 -0500 | [diff] [blame] | 67 | |
Matthew Treinish | 828734a | 2015-07-06 15:43:46 -0400 | [diff] [blame] | 68 | This can be done within a venv, but the assumption for this guide is that |
| 69 | the Tempest cli entry point will be in your shell's PATH. |
Justin Shepherd | 0d9bbd1 | 2011-08-11 12:57:44 -0500 | [diff] [blame] | 70 | |
Matthew Treinish | 531b01c | 2016-07-05 10:22:52 -0400 | [diff] [blame] | 71 | #. Installing Tempest may create a /etc/tempest dir, however if one isn't |
| 72 | created you can create one or use ~/.tempest/etc or ~/.config/tempest in |
| 73 | place of /etc/tempest. If none of these dirs are created tempest will create |
| 74 | ~/.tempest/etc when it's needed. The contents of this dir will always |
| 75 | automatically be copied to all etc/ dirs in local workspaces as an initial |
| 76 | setup step. So if there is any common configuration you'd like to be shared |
| 77 | between local Tempest workspaces it's recommended that you pre-populate it |
| 78 | before running ``tempest init``. |
Justin Shepherd | 0d9bbd1 | 2011-08-11 12:57:44 -0500 | [diff] [blame] | 79 | |
Matthew Treinish | ab77cbf | 2016-07-01 13:55:05 -0400 | [diff] [blame] | 80 | #. Setup a local Tempest workspace. This is done by using the tempest init |
Matthew Treinish | 828734a | 2015-07-06 15:43:46 -0400 | [diff] [blame] | 81 | command:: |
Jay Pipes | 7f75763 | 2011-12-02 15:53:32 -0500 | [diff] [blame] | 82 | |
Ken'ichi Ohmichi | 9883ff2 | 2016-04-22 18:24:15 -0700 | [diff] [blame] | 83 | $ tempest init cloud-01 |
Matthew Treinish | a970d65 | 2015-03-11 15:39:24 -0400 | [diff] [blame] | 84 | |
Matthew Treinish | ab77cbf | 2016-07-01 13:55:05 -0400 | [diff] [blame] | 85 | which also works the same as:: |
Attila Fazekas | 58d2330 | 2013-07-24 10:25:02 +0200 | [diff] [blame] | 86 | |
Ken'ichi Ohmichi | 9883ff2 | 2016-04-22 18:24:15 -0700 | [diff] [blame] | 87 | $ mkdir cloud-01 && cd cloud-01 && tempest init |
Daryl Walleck | e36f623 | 2012-03-06 00:21:45 -0600 | [diff] [blame] | 88 | |
Matthew Treinish | 828734a | 2015-07-06 15:43:46 -0400 | [diff] [blame] | 89 | This will create a new directory for running a single Tempest configuration. |
| 90 | If you'd like to run Tempest against multiple OpenStack deployments the idea |
| 91 | is that you'll create a new working directory for each to maintain separate |
| 92 | configuration files and local artifact storage for each. |
Attila Fazekas | 58d2330 | 2013-07-24 10:25:02 +0200 | [diff] [blame] | 93 | |
Matthew Treinish | 828734a | 2015-07-06 15:43:46 -0400 | [diff] [blame] | 94 | #. Then cd into the newly created working dir and also modify the local |
| 95 | config files located in the etc/ subdir created by the ``tempest init`` |
| 96 | command. Tempest is expecting a tempest.conf file in etc/ so if only a |
| 97 | sample exists you must rename or copy it to tempest.conf before making |
Matthew Treinish | dced423 | 2016-07-05 11:20:12 -0400 | [diff] [blame] | 98 | any changes to it otherwise Tempest will not know how to load it. For |
| 99 | details on configuring tempest refer to the :ref:`tempest-configuration`. |
Matthew Treinish | a970d65 | 2015-03-11 15:39:24 -0400 | [diff] [blame] | 100 | |
Matthew Treinish | 828734a | 2015-07-06 15:43:46 -0400 | [diff] [blame] | 101 | #. Once the configuration is done you're now ready to run Tempest. This can |
Matthew Treinish | 85c8e3e | 2016-06-30 19:28:04 -0400 | [diff] [blame] | 102 | be done using the :ref:`tempest_run` command. This can be done by either |
Matthew Treinish | ab77cbf | 2016-07-01 13:55:05 -0400 | [diff] [blame] | 103 | running:: |
Matthew Treinish | 85c8e3e | 2016-06-30 19:28:04 -0400 | [diff] [blame] | 104 | |
Yushiro FURUKAWA | e4b18ad | 2016-09-27 16:52:47 +0900 | [diff] [blame] | 105 | $ tempest run |
Matthew Treinish | 85c8e3e | 2016-06-30 19:28:04 -0400 | [diff] [blame] | 106 | |
Matthew Treinish | ab77cbf | 2016-07-01 13:55:05 -0400 | [diff] [blame] | 107 | from the Tempest workspace directory. Or you can use the ``--workspace`` |
| 108 | argument to run in the workspace you created regarless of your current |
| 109 | working directory. For example:: |
Matthew Treinish | 85c8e3e | 2016-06-30 19:28:04 -0400 | [diff] [blame] | 110 | |
Yushiro FURUKAWA | e4b18ad | 2016-09-27 16:52:47 +0900 | [diff] [blame] | 111 | $ tempest run --workspace cloud-01 |
Matthew Treinish | 85c8e3e | 2016-06-30 19:28:04 -0400 | [diff] [blame] | 112 | |
| 113 | There is also the option to use testr directly, or any `testr`_ based test |
Matthew Treinish | ab77cbf | 2016-07-01 13:55:05 -0400 | [diff] [blame] | 114 | runner, like `ostestr`_. For example, from the workspace dir run:: |
Matthew Treinish | b17460e | 2013-09-17 17:04:03 +0000 | [diff] [blame] | 115 | |
Yushiro FURUKAWA | e4b18ad | 2016-09-27 16:52:47 +0900 | [diff] [blame] | 116 | $ ostestr --regex '(?!.*\[.*\bslow\b.*\])(^tempest\.(api|scenario))' |
Matthew Treinish | a970d65 | 2015-03-11 15:39:24 -0400 | [diff] [blame] | 117 | |
Matthew Treinish | 828734a | 2015-07-06 15:43:46 -0400 | [diff] [blame] | 118 | will run the same set of tests as the default gate jobs. |
Matthew Treinish | a970d65 | 2015-03-11 15:39:24 -0400 | [diff] [blame] | 119 | |
Matthew Treinish | 828734a | 2015-07-06 15:43:46 -0400 | [diff] [blame] | 120 | .. _testr: https://testrepository.readthedocs.org/en/latest/MANUAL.html |
| 121 | .. _ostestr: http://docs.openstack.org/developer/os-testr/ |
nayna-patel | ddb489c | 2012-11-13 22:06:45 +0000 | [diff] [blame] | 122 | |
Matthew Treinish | 55511d9 | 2016-02-23 10:55:53 -0500 | [diff] [blame] | 123 | Library |
| 124 | ------- |
| 125 | Tempest exposes a library interface. This interface is a stable interface and |
| 126 | should be backwards compatible (including backwards compatibility with the |
| 127 | old tempest-lib package, with the exception of the import). If you plan to |
| 128 | directly consume tempest in your project you should only import code from the |
| 129 | tempest library interface, other pieces of tempest do not have the same |
| 130 | stable interface and there are no guarantees on the Python API unless otherwise |
| 131 | stated. |
| 132 | |
| 133 | For more details refer to the library documentation here: :ref:`library` |
| 134 | |
| 135 | Release Versioning |
| 136 | ------------------ |
Ken'ichi Ohmichi | 7f5e1d7 | 2016-08-29 12:01:44 -0700 | [diff] [blame] | 137 | `Tempest Release Notes <http://docs.openstack.org/releasenotes/tempest>`_ |
| 138 | shows what changes have been released on each version. |
| 139 | |
Matthew Treinish | 55511d9 | 2016-02-23 10:55:53 -0500 | [diff] [blame] | 140 | Tempest's released versions are broken into 2 sets of information. Depending on |
| 141 | how you intend to consume tempest you might need |
| 142 | |
| 143 | The version is a set of 3 numbers: |
| 144 | |
| 145 | X.Y.Z |
| 146 | |
| 147 | While this is almost `semver`_ like, the way versioning is handled is slightly |
| 148 | different: |
| 149 | |
| 150 | X is used to represent the supported OpenStack releases for tempest tests |
| 151 | in-tree, and to signify major feature changes to tempest. It's a monotonically |
| 152 | increasing integer where each version either indicates a new supported OpenStack |
| 153 | release, the drop of support for an OpenStack release (which will coincide with |
| 154 | the upstream stable branch going EOL), or a major feature lands (or is removed) |
| 155 | from tempest. |
| 156 | |
| 157 | Y.Z is used to represent library interface changes. This is treated the same |
| 158 | way as minor and patch versions from `semver`_ but only for the library |
| 159 | interface. When Y is incremented we've added functionality to the library |
| 160 | interface and when Z is incremented it's a bug fix release for the library. |
| 161 | Also note that both Y and Z are reset to 0 at each increment of X. |
| 162 | |
| 163 | .. _semver: http://semver.org/ |
| 164 | |
Daryl Walleck | e36f623 | 2012-03-06 00:21:45 -0600 | [diff] [blame] | 165 | Configuration |
| 166 | ------------- |
| 167 | |
Joe H. Rahme | 00a7542 | 2015-03-16 17:46:24 +0100 | [diff] [blame] | 168 | Detailed configuration of Tempest is beyond the scope of this |
Matthew Treinish | a970d65 | 2015-03-11 15:39:24 -0400 | [diff] [blame] | 169 | document see :ref:`tempest-configuration` for more details on configuring |
zhangfeng | c53e4e1 | 2015-08-21 04:09:08 +0000 | [diff] [blame] | 170 | Tempest. The etc/tempest.conf.sample attempts to be a self-documenting version |
Matthew Treinish | a970d65 | 2015-03-11 15:39:24 -0400 | [diff] [blame] | 171 | of the configuration. |
Sean Dague | b56052b | 2013-05-21 17:57:41 -0400 | [diff] [blame] | 172 | |
Matthew Treinish | a970d65 | 2015-03-11 15:39:24 -0400 | [diff] [blame] | 173 | You can generate a new sample tempest.conf file, run the following |
Yushiro FURUKAWA | e4b18ad | 2016-09-27 16:52:47 +0900 | [diff] [blame] | 174 | command from the top level of the Tempest directory:: |
Masayuki Igawa | ac401c7 | 2014-11-18 15:28:46 +0900 | [diff] [blame] | 175 | |
Yushiro FURUKAWA | e4b18ad | 2016-09-27 16:52:47 +0900 | [diff] [blame] | 176 | $ tox -egenconfig |
Matthew Treinish | 6eb0585 | 2013-11-26 15:28:12 +0000 | [diff] [blame] | 177 | |
Sean Dague | b56052b | 2013-05-21 17:57:41 -0400 | [diff] [blame] | 178 | The most important pieces that are needed are the user ids, openstack |
Matthew Treinish | a970d65 | 2015-03-11 15:39:24 -0400 | [diff] [blame] | 179 | endpoint, and basic flavors and images needed to run tests. |
Matthew Treinish | a7c7f9f | 2014-01-13 18:20:50 +0000 | [diff] [blame] | 180 | |
| 181 | Unit Tests |
| 182 | ---------- |
| 183 | |
Joe H. Rahme | 00a7542 | 2015-03-16 17:46:24 +0100 | [diff] [blame] | 184 | Tempest also has a set of unit tests which test the Tempest code itself. These |
Atsushi SAKAI | 0a183b8 | 2015-07-28 21:52:17 +0900 | [diff] [blame] | 185 | tests can be run by specifying the test discovery path:: |
Matthew Treinish | a7c7f9f | 2014-01-13 18:20:50 +0000 | [diff] [blame] | 186 | |
Ken'ichi Ohmichi | dcf55a0 | 2016-06-01 19:57:14 -0700 | [diff] [blame] | 187 | $ OS_TEST_PATH=./tempest/tests testr run --parallel |
Matthew Treinish | a7c7f9f | 2014-01-13 18:20:50 +0000 | [diff] [blame] | 188 | |
| 189 | By setting OS_TEST_PATH to ./tempest/tests it specifies that test discover |
| 190 | should only be run on the unit test directory. The default value of OS_TEST_PATH |
| 191 | is OS_TEST_PATH=./tempest/test_discover which will only run test discover on the |
Joe H. Rahme | 00a7542 | 2015-03-16 17:46:24 +0100 | [diff] [blame] | 192 | Tempest suite. |
Matthew Treinish | a7c7f9f | 2014-01-13 18:20:50 +0000 | [diff] [blame] | 193 | |
Masayuki Igawa | afb1143 | 2016-06-02 16:09:50 +0900 | [diff] [blame] | 194 | Alternatively, there are the py27 and py34 tox jobs which will run the unit |
| 195 | tests with the corresponding version of python. |
Matthew Treinish | af37dc9 | 2014-02-13 14:35:38 -0500 | [diff] [blame] | 196 | |
| 197 | Python 2.6 |
| 198 | ---------- |
| 199 | |
Matthew Treinish | d28dd7b | 2015-02-23 11:52:33 -0500 | [diff] [blame] | 200 | Starting in the kilo release the OpenStack services dropped all support for |
Joe H. Rahme | 00a7542 | 2015-03-16 17:46:24 +0100 | [diff] [blame] | 201 | python 2.6. This change has been mirrored in Tempest, starting after the |
| 202 | tempest-2 tag. This means that proposed changes to Tempest which only fix |
Matthew Treinish | d28dd7b | 2015-02-23 11:52:33 -0500 | [diff] [blame] | 203 | python 2.6 compatibility will be rejected, and moving forward more features not |
Joe H. Rahme | 00a7542 | 2015-03-16 17:46:24 +0100 | [diff] [blame] | 204 | present in python 2.6 will be used. If you're running your OpenStack services |
| 205 | on an earlier release with python 2.6 you can easily run Tempest against it |
Matthew Treinish | d28dd7b | 2015-02-23 11:52:33 -0500 | [diff] [blame] | 206 | from a remote system running python 2.7. (or deploy a cloud guest in your cloud |
| 207 | that has python 2.7) |
Matthew Treinish | 3460aaa | 2015-05-11 22:18:00 -0400 | [diff] [blame] | 208 | |
Matthew Treinish | 315aa21 | 2016-10-13 17:35:47 -0400 | [diff] [blame] | 209 | Python 3.x |
Matthew Treinish | 3460aaa | 2015-05-11 22:18:00 -0400 | [diff] [blame] | 210 | ---------- |
| 211 | |
| 212 | Starting during the Liberty release development cycle work began on enabling |
| 213 | Tempest to run under both Python 2.7 and Python 3.4. Tempest strives to fully |
Matthew Treinish | 315aa21 | 2016-10-13 17:35:47 -0400 | [diff] [blame] | 214 | support running with Python 3.4 and newer. A gating unit test job was added to |
| 215 | also run Tempest's unit tests under Python 3. This means that the Tempest |
| 216 | code at least imports under Python 3.4 and things that have unit test coverage |
| 217 | will work on Python 3.4. However, because large parts of Tempest are |
| 218 | self-verifying there might be uncaught issues running on Python 3. So until |
| 219 | there is a gating job which does a full Tempest run using Python 3 there |
| 220 | isn't any guarantee that running Tempest under Python 3 is bug free. |
Matthew Treinish | 828734a | 2015-07-06 15:43:46 -0400 | [diff] [blame] | 221 | |
| 222 | Legacy run method |
| 223 | ----------------- |
| 224 | |
| 225 | The legacy method of running Tempest is to just treat the Tempest source code |
| 226 | as a python unittest repository and run directly from the source repo. When |
| 227 | running in this way you still start with a Tempest config file and the steps |
| 228 | are basically the same except that it expects you know where the Tempest code |
| 229 | lives on your system and requires a bit more manual interaction to get Tempest |
| 230 | running. For example, when running Tempest this way things like a lock file |
| 231 | directory do not get generated automatically and the burden is on the user to |
| 232 | create and configure that. |
| 233 | |
| 234 | To start you need to create a configuration file. The easiest way to create a |
| 235 | configuration file is to generate a sample in the ``etc/`` directory :: |
| 236 | |
Ken'ichi Ohmichi | dcf55a0 | 2016-06-01 19:57:14 -0700 | [diff] [blame] | 237 | $ cd $TEMPEST_ROOT_DIR |
| 238 | $ oslo-config-generator --config-file \ |
Erickson Santos | 7d274ed | 2016-07-26 14:16:57 +0000 | [diff] [blame] | 239 | tempest/cmd/config-generator.tempest.conf \ |
Matthew Treinish | 828734a | 2015-07-06 15:43:46 -0400 | [diff] [blame] | 240 | --output-file etc/tempest.conf |
| 241 | |
| 242 | After that, open up the ``etc/tempest.conf`` file and edit the |
| 243 | configuration variables to match valid data in your environment. |
| 244 | This includes your Keystone endpoint, a valid user and credentials, |
| 245 | and reference data to be used in testing. |
| 246 | |
| 247 | .. note:: |
| 248 | |
| 249 | If you have a running devstack environment, Tempest will be |
| 250 | automatically configured and placed in ``/opt/stack/tempest``. It |
| 251 | will have a configuration file already set up to work with your |
| 252 | devstack installation. |
| 253 | |
| 254 | Tempest is not tied to any single test runner, but `testr`_ is the most commonly |
| 255 | used tool. Also, the nosetests test runner is **not** recommended to run Tempest. |
| 256 | |
| 257 | After setting up your configuration file, you can execute the set of Tempest |
| 258 | tests by using ``testr`` :: |
| 259 | |
Ken'ichi Ohmichi | dcf55a0 | 2016-06-01 19:57:14 -0700 | [diff] [blame] | 260 | $ testr run --parallel |
Matthew Treinish | 828734a | 2015-07-06 15:43:46 -0400 | [diff] [blame] | 261 | |
Matthew Treinish | 828734a | 2015-07-06 15:43:46 -0400 | [diff] [blame] | 262 | To run one single test serially :: |
| 263 | |
Ken'ichi Ohmichi | dcf55a0 | 2016-06-01 19:57:14 -0700 | [diff] [blame] | 264 | $ testr run tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_reboot_non_existent_server |
Matthew Treinish | 828734a | 2015-07-06 15:43:46 -0400 | [diff] [blame] | 265 | |
Jordan Pittier | 27ca251 | 2017-02-22 16:25:28 +0100 | [diff] [blame^] | 266 | Tox also contains several existing job configurations. For example:: |
Matthew Treinish | 828734a | 2015-07-06 15:43:46 -0400 | [diff] [blame] | 267 | |
Yushiro FURUKAWA | e4b18ad | 2016-09-27 16:52:47 +0900 | [diff] [blame] | 268 | $ tox -efull |
Matthew Treinish | 828734a | 2015-07-06 15:43:46 -0400 | [diff] [blame] | 269 | |
| 270 | which will run the same set of tests as the OpenStack gate. (it's exactly how |
| 271 | the gate invokes Tempest) Or:: |
| 272 | |
Yushiro FURUKAWA | e4b18ad | 2016-09-27 16:52:47 +0900 | [diff] [blame] | 273 | $ tox -esmoke |
Matthew Treinish | 828734a | 2015-07-06 15:43:46 -0400 | [diff] [blame] | 274 | |
| 275 | to run the tests tagged as smoke. |