From 1ce45a6f6733128aab750674acb82f97a66f29b0 Mon Sep 17 00:00:00 2001 From: Samuel Searles-Bryant Date: Sat, 3 Aug 2019 15:11:36 +0100 Subject: [PATCH] Add hostname and timestamp to JUnit XML testsuite tag Fix #5471 --- changelog/5471.trivial.rst | 1 + src/_pytest/junitxml.py | 4 ++++ testing/test_junitxml.py | 26 ++++++++++++++++++++++++++ 3 files changed, 31 insertions(+) create mode 100644 changelog/5471.trivial.rst diff --git a/changelog/5471.trivial.rst b/changelog/5471.trivial.rst new file mode 100644 index 000000000..154b64ea7 --- /dev/null +++ b/changelog/5471.trivial.rst @@ -0,0 +1 @@ +JUnit XML now includes a timestamp and hostname in the testsuite tag. diff --git a/src/_pytest/junitxml.py b/src/_pytest/junitxml.py index 15c630b1d..ba0f48ed3 100644 --- a/src/_pytest/junitxml.py +++ b/src/_pytest/junitxml.py @@ -10,9 +10,11 @@ src/main/resources/org/jenkinsci/plugins/xunit/types/model/xsd/junit-10.xsd """ import functools import os +import platform import re import sys import time +from datetime import datetime import py @@ -666,6 +668,8 @@ class LogXML: skipped=self.stats["skipped"], tests=numtests, time="%.3f" % suite_time_delta, + timestamp=datetime.fromtimestamp(self.suite_start_time).isoformat(), + hostname=platform.node(), ) logfile.write(Junit.testsuites([suite_node]).unicode(indent=0)) logfile.close() diff --git a/testing/test_junitxml.py b/testing/test_junitxml.py index 3196f0ebd..76420b7d4 100644 --- a/testing/test_junitxml.py +++ b/testing/test_junitxml.py @@ -1,4 +1,6 @@ import os +import platform +from datetime import datetime from xml.dom import minidom import py @@ -139,6 +141,30 @@ class TestPython: node = dom.find_first_by_tag("testsuite") node.assert_attr(name="pytest", errors=1, failures=2, skipped=1, tests=5) + def test_hostname_in_xml(self, testdir): + testdir.makepyfile( + """ + def test_pass(): + pass + """ + ) + result, dom = runandparse(testdir) + node = dom.find_first_by_tag("testsuite") + node.assert_attr(hostname=platform.node()) + + def test_timestamp_in_xml(self, testdir): + testdir.makepyfile( + """ + def test_pass(): + pass + """ + ) + start_time = datetime.now() + result, dom = runandparse(testdir) + node = dom.find_first_by_tag("testsuite") + timestamp = datetime.strptime(node["timestamp"], "%Y-%m-%dT%H:%M:%S.%f") + assert start_time <= timestamp < datetime.now() + def test_timing_function(self, testdir): testdir.makepyfile( """