Remove examples and update testing-overview.txt
With the migration to testrepository, many of the instructions are obsolete. Also the examples are not needed as we have plenty of fine examples available in the code itself. Change-Id: I87524eaab4c39ea75d7e53fb11ffe103d5339cc3
This commit is contained in:
parent
405510e263
commit
9ae4b981b8
@ -1,6 +0,0 @@
|
|||||||
def setup():
|
|
||||||
print "package setup complete"
|
|
||||||
|
|
||||||
|
|
||||||
def teardown():
|
|
||||||
print "package teardown complete"
|
|
@ -1,2 +0,0 @@
|
|||||||
type
|
|
||||||
area
|
|
@ -1,37 +0,0 @@
|
|||||||
###
|
|
||||||
### an unparented test -- no encapsulating class, just any fn starting with
|
|
||||||
### 'test'.
|
|
||||||
## http://darcs.idyll.org/~t/projects/nose-demo/simple/tests/test_stuff.py.html
|
|
||||||
###
|
|
||||||
|
|
||||||
import sys
|
|
||||||
import nose
|
|
||||||
from nose.plugins.attrib import attr
|
|
||||||
from nose import with_setup
|
|
||||||
|
|
||||||
# module level
|
|
||||||
|
|
||||||
|
|
||||||
def setUp():
|
|
||||||
print "test1 setup complete"
|
|
||||||
|
|
||||||
|
|
||||||
def tearDown():
|
|
||||||
print "test1 teardown complete"
|
|
||||||
|
|
||||||
|
|
||||||
@with_setup(setUp, tearDown) # test level
|
|
||||||
@attr(tag=['example', 'func'])
|
|
||||||
@attr(speed='fast')
|
|
||||||
def test_a():
|
|
||||||
assert 'a' == 'a'
|
|
||||||
print "assert a"
|
|
||||||
|
|
||||||
|
|
||||||
def test_b():
|
|
||||||
assert 'b' == 'b'
|
|
||||||
print "assert b"
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
sys.argv.append(__file__)
|
|
||||||
nose.main()
|
|
@ -1,30 +0,0 @@
|
|||||||
###
|
|
||||||
### non-unittest derived test -- class is instantiated, then functions
|
|
||||||
### starting with 'test' are executed.
|
|
||||||
## http://darcs.idyll.org/~t/projects/nose-demo/simple/tests/test_stuff.py.html
|
|
||||||
###
|
|
||||||
|
|
||||||
import sys
|
|
||||||
import nose
|
|
||||||
from nose.plugins.attrib import attr
|
|
||||||
|
|
||||||
# sets attribute on all test methods
|
|
||||||
|
|
||||||
|
|
||||||
@attr(tag=['example', 'class'])
|
|
||||||
@attr(speed='fast')
|
|
||||||
class TestClass:
|
|
||||||
def test2(self):
|
|
||||||
assert 'b' == 'b'
|
|
||||||
print "assert b"
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
print "test2 setup complete"
|
|
||||||
|
|
||||||
def tearDown(self):
|
|
||||||
print "test2 teardown complete"
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
sys.argv.append(__file__)
|
|
||||||
nose.main()
|
|
@ -1,29 +0,0 @@
|
|||||||
###
|
|
||||||
### the standard unittest-derived test
|
|
||||||
## http://darcs.idyll.org/~t/projects/nose-demo/simple/tests/test_stuff.py.html
|
|
||||||
###
|
|
||||||
|
|
||||||
import sys
|
|
||||||
import nose
|
|
||||||
import unittest
|
|
||||||
from nose.plugins.attrib import attr
|
|
||||||
|
|
||||||
# sets attribute on all test methods
|
|
||||||
|
|
||||||
|
|
||||||
@attr(tag=['example', 'unit'])
|
|
||||||
@attr(speed='fast')
|
|
||||||
class ExampleTest(unittest.TestCase):
|
|
||||||
def test_a(self):
|
|
||||||
self.assertEqual(1, 1)
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
print "test3 setup complete"
|
|
||||||
|
|
||||||
def tearDown(self):
|
|
||||||
print "test3 teardown complete"
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
sys.argv.append(__file__)
|
|
||||||
nose.main()
|
|
@ -1,18 +1,17 @@
|
|||||||
Heat testing
|
Heat testing
|
||||||
------------
|
------------
|
||||||
|
|
||||||
All tests are to be placed in the heat/tests directory. The directory is
|
All tests are to be placed in the heat/tests directory. The directory
|
||||||
organized by test type (unit, functional, etc). Within each type
|
is organized by test type (unit, functional, etc). Within each type
|
||||||
directory one may create another directory for additional test files as
|
directory one may create another directory for additional test files as
|
||||||
well as a separate __init__.py, which allows setup and teardown code to
|
well as a separate __init__.py, which should be blank.
|
||||||
be shared with the tests present in the same directory.
|
|
||||||
|
|
||||||
An example directory structure illustrating the above:
|
An example directory structure illustrating the above:
|
||||||
|
|
||||||
heat/tests
|
heat/tests
|
||||||
|-- examples
|
|-- examples
|
||||||
| |-- __init__.py <-- tests1-3 will execute the fixtures (setup and
|
| |-- __init__.py
|
||||||
| |-- test1.py teardown routines) only once
|
| |-- test1.py
|
||||||
| |-- test2.py
|
| |-- test2.py
|
||||||
| |-- test3.py
|
| |-- test3.py
|
||||||
|-- __init__.py
|
|-- __init__.py
|
||||||
@ -27,77 +26,8 @@ test type.
|
|||||||
Implementing a test
|
Implementing a test
|
||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
Nose, the testing framework - http://pypi.python.org/pypi/nose, finds on
|
Testrepository - http://pypi.python.org/pypi/testrepository is used to
|
||||||
demand available tests to run. The name of the file must contain "test"
|
find and run tests, parallelize their runs, and record timing/results.
|
||||||
or "Test" at a word boundary. The recommended format is for the test to
|
|
||||||
be named test_<NAME>.
|
|
||||||
|
|
||||||
There are many different ways to write a test. Three different ways are
|
|
||||||
present in the tests/examples directory. The differences are slight
|
|
||||||
enough to just describe the make up of just one test.
|
|
||||||
|
|
||||||
---
|
|
||||||
Example 1:
|
|
||||||
|
|
||||||
import sys
|
|
||||||
import nose
|
|
||||||
from nose.plugins.attrib import attr
|
|
||||||
from nose import with_setup
|
|
||||||
|
|
||||||
# module level
|
|
||||||
def setUp():
|
|
||||||
print "test1 setup complete"
|
|
||||||
|
|
||||||
def tearDown():
|
|
||||||
print "test1 teardown complete"
|
|
||||||
|
|
||||||
@with_setup(setUp, tearDown) # test level
|
|
||||||
@attr(tag=['example', 'func'])
|
|
||||||
def test_a():
|
|
||||||
assert 'a' == 'a'
|
|
||||||
print "assert a"
|
|
||||||
|
|
||||||
def test_b():
|
|
||||||
assert 'b' == 'b'
|
|
||||||
print "assert b"
|
|
||||||
|
|
||||||
# allows testing of the test directly, shown below
|
|
||||||
if __name__ == '__main__':
|
|
||||||
sys.argv.append(__file__)
|
|
||||||
nose.main()
|
|
||||||
---
|
|
||||||
|
|
||||||
Example 1 illustrates fixture execution at the test, module, and package
|
|
||||||
level:
|
|
||||||
|
|
||||||
$ python test1.py -s
|
|
||||||
package setup complete
|
|
||||||
test1 setup complete
|
|
||||||
test1 setup complete
|
|
||||||
assert a
|
|
||||||
test1 teardown complete
|
|
||||||
.assert b
|
|
||||||
.test1 teardown complete
|
|
||||||
package teardown complete
|
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
|
||||||
Ran 2 tests in 0.001s
|
|
||||||
|
|
||||||
OK
|
|
||||||
|
|
||||||
|
|
||||||
All fixtures are optional. In the above output you can trace the order
|
|
||||||
execution of the fixtures relative to the tests. Fixtures at the class
|
|
||||||
level are present in example 2, which consists of simply defining them
|
|
||||||
within the class.
|
|
||||||
|
|
||||||
Note the attribute decorator with a list of values, which functionality
|
|
||||||
is provided via the attributeselector plugin. This "tag" allows running
|
|
||||||
tests all matching the assigned attribute(s). Tests should always
|
|
||||||
include the tag attribute with at least these values: <test type>,
|
|
||||||
<test area>. Also an attribute of speed should be used with a value of
|
|
||||||
either slow, normal, or fast. Following this convention allows for finer
|
|
||||||
granular testing without having to find the specific tests to run.
|
|
||||||
|
|
||||||
If new dependencies are introduced upon the development of a test, the
|
If new dependencies are introduced upon the development of a test, the
|
||||||
tools/test-requires file needs to be updated so that the virtual
|
tools/test-requires file needs to be updated so that the virtual
|
||||||
@ -106,21 +36,14 @@ environment will be able to successfully execute all tests.
|
|||||||
Running the tests
|
Running the tests
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
There is a run_tests.sh script in the top level of the tree. The script
|
During development, the simplest way to run tests is to simply invoke
|
||||||
will by default execute all found tests, but can be modified with the
|
testr directly.
|
||||||
tag argument:
|
|
||||||
|
|
||||||
$ ./run_tests.sh -V -a tag=example # (runs all the examples)
|
$ testr run
|
||||||
|
|
||||||
There are two important options provided by the run_tests.sh script that
|
To run the tests with a clean virtual env in the same manner as the
|
||||||
should have special attention. The '--virtual-env' or '-V' will build
|
OpenStack testing infrastructure does so, use tox.
|
||||||
and run all the tests inside of an isolated python environment located
|
|
||||||
in the .venv directory. It's sort of like mock just for python :)
|
|
||||||
|
|
||||||
The other option of note is the '--pep8' or '-p' flag. This is a python
|
$ tox -epy27 # test suite on python 2.7
|
||||||
style checker that is good to run periodically. Pep8 is automatically
|
$ tox -epy26 # test suite on python 2.6
|
||||||
executed when tests are run inside the virtual environment since pep8 is
|
$ tox -epep8 # run full source code checker
|
||||||
intentionally installed.
|
|
||||||
|
|
||||||
Please see ./run_tests.sh -h for future enhancements and/or minor
|
|
||||||
non-documented functionality.
|
|
||||||
|
Loading…
Reference in New Issue
Block a user