Commit 251b4d06 authored by Andrei Vagin's avatar Andrei Vagin

zdtm: report test results in the junit format

We found a good plugin for Jenkins to analize test results,
but it can handle only the junit format.

v2: work without the junit python module
v3: install junit-xml, because zdtm.py is executed
    with the --report option from jenkins scripts.
Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
parent 061a407c
...@@ -38,6 +38,7 @@ travis_prep () { ...@@ -38,6 +38,7 @@ travis_prep () {
apt-get update -qq apt-get update -qq
apt-get install -qq --no-install-recommends $TRAVIS_PKGS apt-get install -qq --no-install-recommends $TRAVIS_PKGS
pip install junit-xml
chmod a+x $HOME chmod a+x $HOME
} }
......
...@@ -1383,6 +1383,8 @@ class launcher: ...@@ -1383,6 +1383,8 @@ class launcher:
self.__subs = {} self.__subs = {}
self.__fail = False self.__fail = False
self.__file_report = None self.__file_report = None
self.__junit_file = None
self.__junit_test_cases = None
self.__failed = [] self.__failed = []
self.__nr_skip = 0 self.__nr_skip = 0
if self.__max > 1 and self.__total > 1: if self.__max > 1 and self.__total > 1:
...@@ -1393,13 +1395,20 @@ class launcher: ...@@ -1393,13 +1395,20 @@ class launcher:
self.__use_log = False self.__use_log = False
if opts['report'] and (opts['keep_going'] or self.__total == 1): if opts['report'] and (opts['keep_going'] or self.__total == 1):
global TestSuite, TestCase
from junit_xml import TestSuite, TestCase
now = datetime.datetime.now() now = datetime.datetime.now()
att = 0 att = 0
reportname = os.path.join(report_dir, "criu-testreport.tap") reportname = os.path.join(report_dir, "criu-testreport.tap")
while os.access(reportname, os.F_OK): junitreport = os.path.join(report_dir, "criu-testreport.xml")
while os.access(reportname, os.F_OK) or os.access(junitreport, os.F_OK):
reportname = os.path.join(report_dir, "criu-testreport" + ".%d.tap" % att) reportname = os.path.join(report_dir, "criu-testreport" + ".%d.tap" % att)
junitreport = os.path.join(report_dir, "criu-testreport" + ".%d.xml" % att)
att += 1 att += 1
self.__junit_file = open(junitreport, 'a')
self.__junit_test_cases = []
self.__file_report = open(reportname, 'a') self.__file_report = open(reportname, 'a')
print >> self.__file_report, "TAP version 13" print >> self.__file_report, "TAP version 13"
print >> self.__file_report, "# Hardware architecture: " + arch print >> self.__file_report, "# Hardware architecture: " + arch
...@@ -1421,6 +1430,12 @@ class launcher: ...@@ -1421,6 +1430,12 @@ class launcher:
self.__nr += 1 self.__nr += 1
self.__runtest += 1 self.__runtest += 1
self.__nr_skip += 1 self.__nr_skip += 1
if self.__junit_test_cases != None:
tc = TestCase(name)
tc.add_skipped_info(reason)
if self.__junit_test_cases != None:
self.__junit_test_cases.append(tc)
if self.__file_report: if self.__file_report:
testline = "ok %d - %s # SKIP %s" % (self.__runtest, name, reason) testline = "ok %d - %s # SKIP %s" % (self.__runtest, name, reason)
print >> self.__file_report, testline print >> self.__file_report, testline
...@@ -1455,7 +1470,7 @@ class launcher: ...@@ -1455,7 +1470,7 @@ class launcher:
sub = subprocess.Popen(["./zdtm_ct", "zdtm.py"], sub = subprocess.Popen(["./zdtm_ct", "zdtm.py"],
env = dict(os.environ, CR_CT_TEST_INFO = arg), env = dict(os.environ, CR_CT_TEST_INFO = arg),
stdout = log, stderr = subprocess.STDOUT, close_fds = True) stdout = log, stderr = subprocess.STDOUT, close_fds = True)
self.__subs[sub.pid] = {'sub': sub, 'log': logf, 'name': name} self.__subs[sub.pid] = {'sub': sub, 'log': logf, 'name': name, "start": time.time()}
if test_flag(desc, 'excl'): if test_flag(desc, 'excl'):
self.wait() self.wait()
...@@ -1465,13 +1480,19 @@ class launcher: ...@@ -1465,13 +1480,19 @@ class launcher:
self.__runtest += 1 self.__runtest += 1
if pid != 0: if pid != 0:
sub = self.__subs.pop(pid) sub = self.__subs.pop(pid)
tc = None
if self.__junit_test_cases != None:
tc = TestCase(sub['name'], elapsed_sec=time.time() - sub['start'])
self.__junit_test_cases.append(tc)
if status != 0: if status != 0:
self.__fail = True self.__fail = True
failed_flavor = decode_flav(os.WEXITSTATUS(status)) failed_flavor = decode_flav(os.WEXITSTATUS(status))
self.__failed.append([sub['name'], failed_flavor]) self.__failed.append([sub['name'], failed_flavor])
if self.__file_report: if self.__file_report:
testline = "not ok %d - %s # flavor %s" % (self.__runtest, sub['name'], failed_flavor) testline = "not ok %d - %s # flavor %s" % (self.__runtest, sub['name'], failed_flavor)
details = {'output': open(sub['log']).read()} output = open(sub['log']).read()
details = {'output': output}
tc.add_error_info(output = output)
print >> self.__file_report, testline print >> self.__file_report, testline
print >> self.__file_report, yaml.dump(details, explicit_start=True, explicit_end=True, default_style='|') print >> self.__file_report, yaml.dump(details, explicit_start=True, explicit_end=True, default_style='|')
if sub['log']: if sub['log']:
...@@ -1511,6 +1532,8 @@ class launcher: ...@@ -1511,6 +1532,8 @@ class launcher:
if not opts['fault'] and check_core_files(): if not opts['fault'] and check_core_files():
self.__fail = True self.__fail = True
if self.__file_report: if self.__file_report:
ts = TestSuite(opts['title'], self.__junit_test_cases, os.getenv("NODE_NAME"))
self.__junit_file.write(TestSuite.to_xml_string([ts]))
self.__file_report.close() self.__file_report.close()
if opts['keep_going']: if opts['keep_going']:
...@@ -1968,6 +1991,7 @@ rp.add_argument("--keep-going", help = "Keep running tests in spite of failures" ...@@ -1968,6 +1991,7 @@ rp.add_argument("--keep-going", help = "Keep running tests in spite of failures"
rp.add_argument("--ignore-taint", help = "Don't care about a non-zero kernel taint flag", action = 'store_true') rp.add_argument("--ignore-taint", help = "Don't care about a non-zero kernel taint flag", action = 'store_true')
rp.add_argument("--lazy-pages", help = "restore pages on demand", action = 'store_true') rp.add_argument("--lazy-pages", help = "restore pages on demand", action = 'store_true')
rp.add_argument("--remote-lazy-pages", help = "simulate lazy migration", action = 'store_true') rp.add_argument("--remote-lazy-pages", help = "simulate lazy migration", action = 'store_true')
rp.add_argument("--title", help = "A test suite title", default = "criu")
lp = sp.add_parser("list", help = "List tests") lp = sp.add_parser("list", help = "List tests")
lp.set_defaults(action = list_tests) lp.set_defaults(action = list_tests)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment