44
55import locale
66from pathlib import Path
7- from xml .etree import ElementTree
7+ from typing import TYPE_CHECKING
8+ from xml .etree import ElementTree as ET
89
9- from tox .journal .main import Journal
1010from tox .report .formatter import ReportFormatter
1111
12+ if TYPE_CHECKING :
13+ from tox .journal .main import Journal
14+
1215
1316class XmlFormatter (ReportFormatter ):
1417 """JUnit XML format report formatter."""
@@ -25,7 +28,7 @@ def format(self, journal: Journal, output_path: Path | None = None) -> str | Non
2528 content = journal .content
2629
2730 # Create root testsuites element
28- testsuites = ElementTree .Element ("testsuites" )
31+ testsuites = ET .Element ("testsuites" )
2932
3033 # Add metadata
3134 if "toxversion" in content :
@@ -43,7 +46,7 @@ def format(self, journal: Journal, output_path: Path | None = None) -> str | Non
4346 # Process each test environment
4447 testenvs = content .get ("testenvs" , {})
4548 for env_name , env_data in testenvs .items ():
46- testsuite = ElementTree .SubElement (testsuites , "testsuite" )
49+ testsuite = ET .SubElement (testsuites , "testsuite" )
4750 testsuite .set ("name" , env_name )
4851
4952 env_tests = 0
@@ -57,7 +60,7 @@ def format(self, journal: Journal, output_path: Path | None = None) -> str | Non
5760
5861 # Process setup commands
5962 for setup in setup_results :
60- testcase = ElementTree .SubElement (testsuite , "testcase" )
63+ testcase = ET .SubElement (testsuite , "testcase" )
6164 testcase .set ("classname" , env_name )
6265 testcase .set ("name" , f"setup:{ setup .get ('run_id' , 'unknown' )} " )
6366 elapsed = float (setup .get ("elapsed" , 0.0 ))
@@ -66,14 +69,14 @@ def format(self, journal: Journal, output_path: Path | None = None) -> str | Non
6669 env_tests += 1
6770
6871 if setup .get ("retcode" , 0 ) != 0 :
69- failure = ElementTree .SubElement (testcase , "failure" )
72+ failure = ET .SubElement (testcase , "failure" )
7073 failure .set ("message" , f"Setup command failed with exit code { setup .get ('retcode' )} " )
7174 failure .text = setup .get ("err" , "" )
7275 env_errors += 1
7376
7477 # Process test commands
7578 for test in test_results :
76- testcase = ElementTree .SubElement (testsuite , "testcase" )
79+ testcase = ET .SubElement (testsuite , "testcase" )
7780 testcase .set ("classname" , env_name )
7881 testcase .set ("name" , test .get ("command" , test .get ("run_id" , "unknown" )))
7982 elapsed = float (test .get ("elapsed" , 0.0 ))
@@ -83,7 +86,7 @@ def format(self, journal: Journal, output_path: Path | None = None) -> str | Non
8386
8487 retcode = test .get ("retcode" , 0 )
8588 if retcode != 0 :
86- failure = ElementTree .SubElement (testcase , "failure" )
89+ failure = ET .SubElement (testcase , "failure" )
8790 failure .set ("message" , f"Test command failed with exit code { retcode } " )
8891 failure .text = test .get ("err" , test .get ("output" , "" ))
8992 env_failures += 1
@@ -111,10 +114,10 @@ def format(self, journal: Journal, output_path: Path | None = None) -> str | Non
111114
112115 # Convert to XML string
113116 try :
114- ElementTree .indent (testsuites , space = " " ) # Python 3.9+
117+ ET .indent (testsuites , space = " " ) # Python 3.9+
115118 except AttributeError :
116119 pass # ElementTree.indent not available in older Python versions
117- xml_content = ElementTree .tostring (testsuites , encoding = "unicode" , xml_declaration = True )
120+ xml_content = ET .tostring (testsuites , encoding = "unicode" , xml_declaration = True )
118121
119122 if output_path is not None :
120123 with Path (output_path ).open ("w" , encoding = locale .getpreferredencoding (do_setlocale = False )) as file_handler :
@@ -125,4 +128,3 @@ def format(self, journal: Journal, output_path: Path | None = None) -> str | Non
125128
126129
127130__all__ = ("XmlFormatter" ,)
128-
0 commit comments