Use testr instead of nose.

nose is invasive and can sometimes alter the outcome of a test run. testr,
on the other hand, keeps a distinction between running tests and displaying
results of the test runs. Additionally, it supports the stock python unittest
protocol.

Even better, testr supports parallel test running, which makes things faster,
and a command "testr run --failing" which will just re-run the latest failing
tests (often something one wants to do in iterative dev)

Part of blueprint grizzly-testtools

Change-Id: I0b3f1bcb5d4ff59c65eb3219b30a9e64f54d70bd
This commit is contained in:
Monty Taylor 2012-12-27 15:26:50 -08:00
parent 1aa712eaf2
commit bfeffb6366
7 changed files with 19 additions and 41 deletions

2
.gitignore vendored

@ -6,6 +6,8 @@ dist/
*.py[co] *.py[co]
.DS_Store .DS_Store
*.log *.log
.testrepository
subunit.log
build build
swiftclient/versioninfo swiftclient/versioninfo
.autogenerated .autogenerated

4
.testr.conf Normal file

@ -0,0 +1,4 @@
[DEFAULT]
test_command=${PYTHON:-python} -m subunit.run discover -t ./ ./tests $LISTOPT $IDOPTION
test_id_option=--load-list $IDFILE
test_list_option=--list

@ -1,7 +1,8 @@
#!/bin/bash #!/bin/bash
set -e set -e
nosetests --exe --with-coverage --cover-package swiftclient --cover-erase $@ python setup.py testr --coverage
rvalue=$? RET=$?
coverage report
rm -f .coverage rm -f .coverage
exit $rvalue exit $RET

@ -1,12 +1,3 @@
[nosetests]
cover-package = swiftclient
cover-html = true
cover-erase = true
cover-inclusive = true
verbosity=2
detailed-errors=1
where = tests
[build_sphinx] [build_sphinx]
source-dir = doc/source source-dir = doc/source
build-dir = doc/build build-dir = doc/build

@ -54,7 +54,6 @@ setuptools.setup(
'Programming Language :: Python :: 2.6', 'Programming Language :: Python :: 2.6',
'Environment :: No Input/Output (Daemon)', 'Environment :: No Input/Output (Daemon)',
], ],
test_suite='nose.collector',
scripts=[ scripts=[
'bin/swift', 'bin/swift',
], ],

@ -1,12 +1,10 @@
distribute>=0.6.24 distribute>=0.6.24
coverage
discover
eventlet eventlet
nose
nose-exclude
nosehtmloutput
nosexcover
openstack.nose_plugin
pep8==1.3 pep8==1.3
python-keystoneclient python-keystoneclient
sphinx>=1.1.2 sphinx>=1.1.2
testrepository>=0.0.13
testtools>=0.9.22 testtools>=0.9.22

29
tox.ini

@ -3,14 +3,13 @@ envlist = py26,py27,pep8
[testenv] [testenv]
setenv = VIRTUAL_ENV={envdir} setenv = VIRTUAL_ENV={envdir}
NOSE_WITH_OPENSTACK=1 LANG=en_US.UTF-8
NOSE_OPENSTACK_COLOR=1 LANGUAGE=en_US:en
NOSE_OPENSTACK_RED=0.05 LC_ALL=C
NOSE_OPENSTACK_YELLOW=0.025
NOSE_OPENSTACK_SHOW_ELAPSED=1
deps = -r{toxinidir}/tools/pip-requires deps = -r{toxinidir}/tools/pip-requires
-r{toxinidir}/tools/test-requires -r{toxinidir}/tools/test-requires
commands = nosetests commands = python setup.py testr --testr-args="{posargs}"
[testenv:pep8] [testenv:pep8]
deps = pep8 deps = pep8
@ -20,23 +19,7 @@ commands = pep8 --repeat --show-source --exclude=openstack swiftclient setup.py
commands = {posargs} commands = {posargs}
[testenv:cover] [testenv:cover]
commands = nosetests --cover-erase --cover-package=swiftclient --with-xcoverage commands = python setup.py testr --coverage
[tox:jenkins] [tox:jenkins]
downloadcache = ~/cache/pip downloadcache = ~/cache/pip
[testenv:jenkins26]
basepython = python2.6
setenv = NOSE_WITH_XUNIT=1
[testenv:jenkins27]
basepython = python2.7
setenv = NOSE_WITH_XUNIT=1
[testenv:jenkinscover]
setenv = NOSE_WITH_XUNIT=1
commands = nosetests --cover-erase --cover-package=swiftclient --with-xcoverage
[testenv:jenkinsvenv]
setenv = NOSE_WITH_XUNIT=1
commands = {posargs}