qemu-iotests: Make debugging python tests easier

Adding "-d" option. The output goes to "tee" so it appears in your
console. Also, raise the verbosity of unnitest runner.

When testing a topic branch, it's possible that a bug introduced by a
code change makes the python test case hang, with debug output, it is
much easier to locate the problem.

This can also be helpful if you want to watch the progress of a python
test, it offers you a way to sense the speed of each test case method
you're writing.

Note: because there is no easy way to get *both* the verbose output and
the output expected by ./check comparison, the case would always fail
with an "output mismatch". The sole purpose of using this option is
giving developers a quick way to debug when things go wrong.

Signed-off-by: Fam Zheng <famz@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
Fam Zheng 2015-05-18 09:39:12 +08:00 committed by Kevin Wolf
parent b93bbf4ee9
commit aa4f592a1d
3 changed files with 26 additions and 6 deletions

View File

@ -296,9 +296,15 @@ do
run_command="./$seq" run_command="./$seq"
fi fi
export OUTPUT_DIR=$PWD export OUTPUT_DIR=$PWD
if $debug; then
(cd "$source_iotests";
MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(($RANDOM % 255 + 1))} \
$run_command -d 2>&1 | tee $tmp.out)
else
(cd "$source_iotests"; (cd "$source_iotests";
MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(($RANDOM % 255 + 1))} \ MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(($RANDOM % 255 + 1))} \
$run_command >$tmp.out 2>&1) $run_command >$tmp.out 2>&1)
fi
sts=$? sts=$?
$timestamp && _timestamp $timestamp && _timestamp
stop=`_wallclock` stop=`_wallclock`

View File

@ -32,6 +32,7 @@ check=${check-true}
diff="diff -u" diff="diff -u"
verbose=false verbose=false
debug=false
group=false group=false
xgroup=false xgroup=false
imgopts=false imgopts=false
@ -132,6 +133,7 @@ s/ .*//p
common options common options
-v verbose -v verbose
-d debug
check options check options
-raw test raw (default) -raw test raw (default)
@ -322,6 +324,10 @@ testlist options
verbose=true verbose=true
xpand=false xpand=false
;; ;;
-d)
debug=true
xpand=false
;;
-x) # -x group ... exclude from group file -x) # -x group ... exclude from group file
xgroup=true xgroup=true
xpand=false xpand=false

View File

@ -338,6 +338,8 @@ def notrun(reason):
def main(supported_fmts=[], supported_oses=['linux']): def main(supported_fmts=[], supported_oses=['linux']):
'''Run tests''' '''Run tests'''
debug = '-d' in sys.argv
verbosity = 1
if supported_fmts and (imgfmt not in supported_fmts): if supported_fmts and (imgfmt not in supported_fmts):
notrun('not suitable for this image format: %s' % imgfmt) notrun('not suitable for this image format: %s' % imgfmt)
@ -347,14 +349,20 @@ def main(supported_fmts=[], supported_oses=['linux']):
# We need to filter out the time taken from the output so that qemu-iotest # We need to filter out the time taken from the output so that qemu-iotest
# can reliably diff the results against master output. # can reliably diff the results against master output.
import StringIO import StringIO
if debug:
output = sys.stdout
verbosity = 2
sys.argv.remove('-d')
else:
output = StringIO.StringIO() output = StringIO.StringIO()
class MyTestRunner(unittest.TextTestRunner): class MyTestRunner(unittest.TextTestRunner):
def __init__(self, stream=output, descriptions=True, verbosity=1): def __init__(self, stream=output, descriptions=True, verbosity=verbosity):
unittest.TextTestRunner.__init__(self, stream, descriptions, verbosity) unittest.TextTestRunner.__init__(self, stream, descriptions, verbosity)
# unittest.main() will use sys.exit() so expect a SystemExit exception # unittest.main() will use sys.exit() so expect a SystemExit exception
try: try:
unittest.main(testRunner=MyTestRunner) unittest.main(testRunner=MyTestRunner)
finally: finally:
if not debug:
sys.stderr.write(re.sub(r'Ran (\d+) tests? in [\d.]+s', r'Ran \1 tests', output.getvalue())) sys.stderr.write(re.sub(r'Ran (\d+) tests? in [\d.]+s', r'Ran \1 tests', output.getvalue()))