@@ -94,23 +94,21 @@ def run(self, result):
9494 for r in results :
9595 # Save a test result record with the specific suite name (e.g. "core0.test_foo")
9696 test_failed = r .test_result not in ['success' , 'skipped' ]
97- fail_frequency = previous_test_run_results [r .test_name ]['fail_frequency' ] if r .test_name in previous_test_run_results else int (test_failed )
98- fail_frequency = (fail_frequency + int (test_failed )) / 2
99- previous_test_run_results [r .test_name ] = {
100- 'result' : r .test_result ,
101- 'duration' : r .test_duration ,
102- 'fail_frequency' : fail_frequency ,
103- }
97+
98+ def apply_test_results_to (test_name ):
99+ fail_frequency = previous_test_run_results [test_name ]['fail_frequency' ] if test_name in previous_test_run_results else int (test_failed )
100+ # Apply exponential moving average with 50% weighting to merge previous fail frequency with new fail frequency
101+ fail_frequency = (fail_frequency + int (test_failed )) / 2
102+ previous_test_run_results [test_name ] = {
103+ 'result' : r .test_result ,
104+ 'duration' : r .test_duration ,
105+ 'fail_frequency' : fail_frequency ,
106+ }
107+
108+ apply_test_results_to (r .test_name )
104109 # Also save a test result record without suite name (e.g. just "test_foo"). This enables different suite runs to order tests
105110 # for quick --failfast termination, in case a test fails in multiple suites
106- test_in_any_suite = r .test_name .split (' ' )[0 ]
107- fail_frequency = previous_test_run_results [test_in_any_suite ]['fail_frequency' ] if test_in_any_suite in previous_test_run_results else int (test_failed )
108- fail_frequency = (fail_frequency + int (test_failed )) / 2
109- previous_test_run_results [test_in_any_suite ] = {
110- 'result' : r .test_result ,
111- 'duration' : r .test_duration ,
112- 'fail_frequency' : fail_frequency ,
113- }
111+ apply_test_results_to (r .test_name .split (' ' )[0 ])
114112
115113 json .dump (previous_test_run_results , open (common .PREVIOUS_TEST_RUN_RESULTS_FILE , 'w' ), indent = 2 )
116114 pool .close ()
0 commit comments