提交 7d4b7ef1 authored 作者: Olivier Delalleau's avatar Olivier Delalleau

The run_tests_in_batch script is now more flexible, in particular it can redirect its output

上级 88002fc2
...@@ -36,15 +36,43 @@ import cPickle, os, subprocess, sys ...@@ -36,15 +36,43 @@ import cPickle, os, subprocess, sys
import theano import theano
def main(): def main(stdout=None, stderr=None, argv=None, call_nose=None):
theano_dir = os.path.dirname(theano.__file__) """
# `nose` is the script that calls nosetests. Run tests with optional output redirection.
nose = os.path.join(theano_dir, 'tests', 'call_nose.py')
if len(sys.argv) == 1: Parameters stdout and stderr should be file-like objects used to redirect
tests_dir = theano_dir the output. None uses default sys.stdout and sys.stderr.
If argv is None, then we use arguments from sys.argv, otherwise we use the
provided arguments instead.
If call_nose is None, then we use the call_nose.py script found in
theano/tests to call nosetests. Otherwise we call the provided script.
"""
if stdout is None:
stdout = sys.stdout
if stderr is None:
stderr = sys.stderr
if argv is None:
argv = sys.argv
if call_nose is None:
call_nose = os.path.join(theano.__path__[0], 'tests', 'call_nose.py')
stdout_backup = sys.stdout
stderr_backup = sys.stderr
try:
sys.stdout = stdout
sys.stderr = stderr
run(stdout, stderr, argv, call_nose)
finally:
sys.stdout = stdout_backup
sys.stderr = stderr_backup
def run(stdout, stderr, argv, call_nose):
if len(argv) == 1:
tests_dir = theano.__path__[0]
else: else:
assert len(sys.argv) == 2 assert len(argv) == 2
tests_dir = sys.argv[1] tests_dir = argv[1]
assert os.path.isdir(tests_dir) assert os.path.isdir(tests_dir)
os.chdir(tests_dir) os.chdir(tests_dir)
# It seems safer to fully regenerate the list of tests on each call. # It seems safer to fully regenerate the list of tests on each call.
...@@ -55,7 +83,14 @@ def main(): ...@@ -55,7 +83,14 @@ def main():
#################### ####################
# COLLECTING TESTS # # COLLECTING TESTS #
####################""" ####################"""
rval = subprocess.call(['python', nose, '--collect-only', '--with-id']) stdout.flush()
stderr.flush()
dummy_in = open(os.devnull)
rval = subprocess.call(['python', call_nose, '--collect-only', '--with-id'],
stdin=dummy_in.fileno(), stdout=stdout.fileno(),
stderr=stderr.fileno())
stdout.flush()
stderr.flush()
assert rval == 0 assert rval == 0
noseids_file = '.noseids' noseids_file = '.noseids'
data = cPickle.load(open(noseids_file, 'rb')) data = cPickle.load(open(noseids_file, 'rb'))
...@@ -70,13 +105,16 @@ def main(): ...@@ -70,13 +105,16 @@ def main():
# RUNNING TESTS IN BATCHES OF %s # # RUNNING TESTS IN BATCHES OF %s #
###################################""" % n_batch ###################################""" % n_batch
for test_id in xrange(1, n_tests + 1, n_batch): for test_id in xrange(1, n_tests + 1, n_batch):
stdout.flush()
stderr.flush()
test_range = range(test_id, min(test_id + n_batch, n_tests + 1)) test_range = range(test_id, min(test_id + n_batch, n_tests + 1))
# We suppress all output because we want the user to focus only on the # We suppress all output because we want the user to focus only on the
# failed tests, which are re-run (with output) below. # failed tests, which are re-run (with output) below.
dummy_out = open(os.devnull, 'w') dummy_out = open(os.devnull, 'w')
rval = subprocess.call(['python', nose, '-q', '--with-id'] + rval = subprocess.call(['python', call_nose, '-q', '--with-id'] +
map(str, test_range), stdout=dummy_out.fileno(), map(str, test_range), stdout=dummy_out.fileno(),
stderr=dummy_out.fileno()) stderr=dummy_out.fileno(),
stdin=dummy_in.fileno())
# Recover failed test indices from the 'failed' field of the '.noseids' # Recover failed test indices from the 'failed' field of the '.noseids'
# file. We need to do it after each batch because otherwise this field # file. We need to do it after each batch because otherwise this field
# may get erased. We use a set because it seems like it is not # may get erased. We use a set because it seems like it is not
...@@ -92,7 +130,13 @@ def main(): ...@@ -92,7 +130,13 @@ def main():
################################ ################################
# RE-RUNNING FAILED TESTS ONLY # # RE-RUNNING FAILED TESTS ONLY #
################################""" ################################"""
subprocess.call(['python', nose, '-v', '--with-id'] + failed) stdout.flush()
stderr.flush()
subprocess.call(['python', call_nose, '-v', '--with-id'] + failed,
stdin=dummy_in.fileno(), stdout=stdout.fileno(),
stderr=stderr.fileno())
stdout.flush()
stderr.flush()
return 0 return 0
else: else:
print """\ print """\
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论