1+ import re
12import pytest
23import os
34import datetime
@@ -20,6 +21,9 @@ def pytest_configure(config):
2021 config .option .verbose = 3
2122
2223def pytest_terminal_summary (terminalreporter , exitstatus , config ):
24+ def remove_ansi_codes (text ):
25+ ansi_escape = re .compile (r'\x1B[@-_][0-?]*[ -/]*[@-~]' )
26+ return ansi_escape .sub ('' , text )
2327 if config .getoption ("--testcato" ):
2428 results = []
2529 tracebacks = []
@@ -28,25 +32,22 @@ def pytest_terminal_summary(terminalreporter, exitstatus, config):
2832 for report in terminalreporter .getreports ("failed" ):
2933 results .append ({'name' : report .nodeid , 'status' : 'failed' })
3034 if hasattr (report , 'longrepr' ) and report .longrepr :
31- tb = str (report .longrepr )
35+ tb = remove_ansi_codes ( str (report .longrepr ) )
3236 tracebacks .append ({'name' : report .nodeid , 'traceback' : tb })
3337 for report in terminalreporter .getreports ("skipped" ):
3438 results .append ({'name' : report .nodeid , 'status' : 'skipped' })
3539
36- # Save tracebacks to XML
40+ # Save tracebacks to JSON Lines
3741 if tracebacks :
42+ import json
3843 result_dir = os .path .join (os .getcwd (), 'testcato_result' )
3944 os .makedirs (result_dir , exist_ok = True )
40- root = ET .Element ('TestTracebacks' )
41- for tb in tracebacks :
42- test_elem = ET .SubElement (root , 'Test' , name = tb ['name' ])
43- tb_elem = ET .SubElement (test_elem , 'Traceback' )
44- tb_elem .text = tb ['traceback' ]
45- tree = ET .ElementTree (root )
4645 timestamp = datetime .datetime .now ().strftime ('%Y%m%d_%H%M%S' )
47- xml_path = os .path .join (result_dir , f'test_run_{ timestamp } .xml' )
48- tree .write (xml_path , encoding = 'utf-8' , xml_declaration = True )
49- terminalreporter .write_line (f"Tracebacks saved to { xml_path } " )
46+ jsonl_path = os .path .join (result_dir , f'test_run_{ timestamp } .jsonl' )
47+ with open (jsonl_path , 'w' , encoding = 'utf-8' ) as f :
48+ for tb in tracebacks :
49+ f .write (json .dumps (tb , ensure_ascii = False ) + '\n ' )
50+ terminalreporter .write_line (f"Tracebacks saved to { jsonl_path } " )
5051
5152 categorizer = TestCategorizer ()
5253 categories = categorizer .categorize (results )
@@ -55,3 +56,10 @@ def pytest_terminal_summary(terminalreporter, exitstatus, config):
5556 terminalreporter .write_line (f"{ category } :" )
5657 for test in tests :
5758 terminalreporter .write_line (f" { test } " )
59+
60+ # Automatically send latest XML to AI agent and save debug file
61+ try :
62+ from .ai_agent import debug_latest_xml
63+ debug_latest_xml ()
64+ except Exception as e :
65+ terminalreporter .write_line (f"Error sending XML to AI agent: { e } " )
0 commit comments