From 80c5e3bdec3b5fb870d8a5d0648673ec3207c0b8 Mon Sep 17 00:00:00 2001 From: joseph-sentry Date: Wed, 19 Jun 2024 15:06:18 -0400 Subject: [PATCH] [junitxml] add timezone to testsuite timestamp Signed-off-by: joseph-sentry --- AUTHORS | 1 + changelog/7662.improvement.rst | 1 + src/_pytest/junitxml.py | 5 ++++- testing/test_junitxml.py | 7 ++++--- 4 files changed, 10 insertions(+), 4 deletions(-) create mode 100644 changelog/7662.improvement.rst diff --git a/AUTHORS b/AUTHORS index 80b6d5157cd..832593b1f2d 100644 --- a/AUTHORS +++ b/AUTHORS @@ -212,6 +212,7 @@ Jordan Guymon Jordan Moldow Jordan Speicher Joseph Hunkeler +Joseph Sawaya Josh Karpel Joshua Bronson Jurko Gospodnetić diff --git a/changelog/7662.improvement.rst b/changelog/7662.improvement.rst new file mode 100644 index 00000000000..b6ae1ba7e4c --- /dev/null +++ b/changelog/7662.improvement.rst @@ -0,0 +1 @@ +Added timezone information to the testsuite timestamp in the JUnit XML report. diff --git a/src/_pytest/junitxml.py b/src/_pytest/junitxml.py index 011af6100e9..1f06b89a62a 100644 --- a/src/_pytest/junitxml.py +++ b/src/_pytest/junitxml.py @@ -9,6 +9,7 @@ """ from datetime import datetime +from datetime import timezone import functools import os import platform @@ -671,7 +672,9 @@ def pytest_sessionfinish(self) -> None: skipped=str(self.stats["skipped"]), tests=str(numtests), time=f"{suite_time_delta:.3f}", - timestamp=datetime.fromtimestamp(self.suite_start_time).isoformat(), + timestamp=datetime.fromtimestamp(self.suite_start_time, timezone.utc) + .astimezone() + .isoformat(), hostname=platform.node(), ) global_properties = self._get_global_properties_node() diff --git a/testing/test_junitxml.py b/testing/test_junitxml.py index 1ebc3ed3a51..8ca6a7b66b9 100644 --- a/testing/test_junitxml.py +++ b/testing/test_junitxml.py @@ -1,5 +1,6 @@ # mypy: allow-untyped-defs from datetime import datetime +from datetime import timezone import os from pathlib import Path import platform @@ -220,11 +221,11 @@ def test_pass(): pass """ ) - start_time = datetime.now() + start_time = datetime.now(timezone.utc) result, dom = run_and_parse(family=xunit_family) 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() + timestamp = datetime.strptime(node["timestamp"], "%Y-%m-%dT%H:%M:%S.%f%z") + assert start_time <= timestamp < datetime.now(timezone.utc) def test_timing_function( self, pytester: Pytester, run_and_parse: RunAndParse, mock_timing