Jim Paris
3d24092cd2
Otherwise we might inadvertently catch SystemExit or KeyboardExit or something we don't want to catch.
50 lines
1.9 KiB
Python
Executable File
50 lines
1.9 KiB
Python
Executable File
#!/usr/bin/python
|
|
|
|
import nose
|
|
import os
|
|
import sys
|
|
import glob
|
|
from collections import OrderedDict
|
|
|
|
# Change into parent dir
|
|
os.chdir(os.path.dirname(os.path.realpath(__file__)) + "/..")
|
|
|
|
class JimOrderPlugin(nose.plugins.Plugin):
|
|
"""When searching for tests and encountering a directory that
|
|
contains a 'test.order' file, run tests listed in that file, in the
|
|
order that they're listed. Globs are OK in that file and duplicates
|
|
are removed."""
|
|
name = 'jimorder'
|
|
score = 10000
|
|
|
|
def prepareTestLoader(self, loader):
|
|
def wrap(func):
|
|
def wrapper(name, *args, **kwargs):
|
|
addr = nose.selector.TestAddress(
|
|
name, workingDir=loader.workingDir)
|
|
try:
|
|
order = os.path.join(addr.filename, "test.order")
|
|
except Exception:
|
|
order = None
|
|
if order and os.path.exists(order):
|
|
files = []
|
|
for line in open(order):
|
|
line = line.split('#')[0].strip()
|
|
if not line:
|
|
continue
|
|
fn = os.path.join(addr.filename, line.strip())
|
|
files.extend(sorted(glob.glob(fn)) or [fn])
|
|
files = list(OrderedDict.fromkeys(files))
|
|
tests = [ wrapper(fn, *args, **kwargs) for fn in files ]
|
|
return loader.suiteClass(tests)
|
|
return func(name, *args, **kwargs)
|
|
return wrapper
|
|
loader.loadTestsFromName = wrap(loader.loadTestsFromName)
|
|
return loader
|
|
|
|
# Use setup.cfg for most of the test configuration. Adding
|
|
# --with-jimorder here means that a normal "nosetests" run will
|
|
# still work, it just won't support test.order.
|
|
nose.main(addplugins = [ JimOrderPlugin() ],
|
|
argv = sys.argv + ["--with-jimorder"])
|