Skip to content

Commit

Permalink
Add actual test time to xUnit result files (#270)
Browse files Browse the repository at this point in the history
* Add actual test time to xUnit result files
Fixes #269

Signed-off-by: ruffsl <roxfoxpox@gmail.com>

* Report test_time even with skipped test

Signed-off-by: ruffsl <roxfoxpox@gmail.com>

* Set time attribute for testcase element

Signed-off-by: ruffsl <roxfoxpox@gmail.com>
  • Loading branch information
ruffsl committed Aug 12, 2020
1 parent 79145a6 commit 191f1d4
Showing 1 changed file with 14 additions and 7 deletions.
21 changes: 14 additions & 7 deletions ament_cmake_test/ament_cmake_test/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import re
import subprocess
import sys
import time
from xml.etree.ElementTree import ElementTree
from xml.etree.ElementTree import ParseError
from xml.sax.saxutils import quoteattr
Expand Down Expand Up @@ -193,6 +194,8 @@ def log(msg, **kwargs):
encodings = ['utf-8']
if locale.getpreferredencoding(False) not in encodings:
encodings.append(locale.getpreferredencoding(False))

start_time = time.monotonic()

try:
proc = subprocess.Popen(
Expand Down Expand Up @@ -229,12 +232,14 @@ def log(msg, **kwargs):
output += str(e)
rc = 1

test_time = time.monotonic() - start_time

if not rc and args.generate_result_on_success:
# generate result file with one passed test
# if it was expected that no result file was generated
# and the command returned with code zero
log("-- run_test.py: generate result file '%s' with successful test" % args.result_file)
success_result_file = _generate_result(args.result_file)
success_result_file = _generate_result(args.result_file, test_time=test_time)
with open(args.result_file, 'w') as h:
h.write(success_result_file)

Expand All @@ -247,14 +252,15 @@ def log(msg, **kwargs):
if args.skip_return_code is not None and args.skip_return_code == rc:
log("-- run_test.py: generate result file '%s' with skipped test" % args.result_file)
# regenerate result file to indicate that the test was skipped
result_file = _generate_result(args.result_file, skip=True)
result_file = _generate_result(args.result_file, skip=True, test_time=test_time)
else:
log("-- run_test.py: generate result file '%s' with failed test" % args.result_file,
file=sys.stderr)
# regenerate result file to include output / exception of the invoked command
result_file = _generate_result(
args.result_file,
error_message='The test did not generate a result file:\n\n' + output)
error_message='The test did not generate a result file:\n\n' + output,
test_time=test_time)
with open(args.result_file, 'w') as h:
h.write(result_file)
else:
Expand Down Expand Up @@ -310,7 +316,7 @@ def log(msg, **kwargs):
return rc


def _generate_result(result_file, *, failure_message=None, skip=False, error_message=None):
def _generate_result(result_file, *, failure_message=None, skip=False, error_message=None, test_time=0):
# the generated result file must be readable
# by any of the Jenkins test result report publishers
pkgname = os.path.basename(os.path.dirname(result_file))
Expand All @@ -323,17 +329,18 @@ def _generate_result(result_file, *, failure_message=None, skip=False, error_mes
'<skipped type="skip" message="">![CDATA[Test Skipped by developer]]</skipped>' \
if skip else ''
return """<?xml version="1.0" encoding="UTF-8"?>
<testsuite name="%s" tests="1" failures="%d" time="0" errors="%d" skipped="%d">
<testcase classname="%s" name="%s.missing_result" time="0">
<testsuite name="%s" tests="1" failures="%d" time="%f" errors="%d" skipped="%d">
<testcase classname="%s" name="%s.missing_result" time="%f">
%s%s%s
</testcase>
</testsuite>\n""" % \
(
pkgname,
1 if failure_message else 0,
test_time,
1 if error_message else 0,
1 if skip else 0,
pkgname, testname,
pkgname, testname, test_time,
failure_message, skipped_message, error_message
)

Expand Down

0 comments on commit 191f1d4

Please sign in to comment.