class Tryouts::TestBatch
def run(before_test_hook = nil, &)
def run(before_test_hook = nil, &) return false if empty? @start_time = Time.now @test_case_count = test_cases.size @output_manager&.execution_phase(@test_case_count) @output_manager&.info("Context: #{@options[:shared_context] ? 'shared' : 'fresh'}", 1) @output_manager&.file_start(path, context: @options[:shared_context] ? :shared : :fresh) if shared_context? @output_manager&.info('Running global setup...', 2) execute_global_setup # Stop execution if setup failed if @setup_failed @output_manager&.error('Stopping batch execution due to setup failure') @status = :failed finalize_results([]) return false end else # Fresh context mode: execute setup once to establish shared @instance_variables @output_manager&.info('Running setup for fresh context...', 2) execute_fresh_context_setup # Stop execution if setup failed if @setup_failed @output_manager&.error('Stopping batch execution due to setup failure') @status = :failed finalize_results([]) return false end end idx = 0 execution_results = test_cases.map do |test_case| @output_manager&.trace("Test #{idx + 1}/#{@test_case_count}: #{test_case.description}", 2) idx += 1 # Check circuit breaker before executing test if @circuit_breaker_active @output_manager&.error("Circuit breaker active - skipping remaining tests after #{@consecutive_failures} consecutive failures") break end @output_manager&.test_start(test_case, idx, @test_case_count) result = execute_single_test(test_case, before_test_hook, &) # runs the test code @output_manager&.test_end(test_case, idx, @test_case_count) # Update circuit breaker state based on result update_circuit_breaker(result) result rescue StandardError => ex @output_manager&.test_end(test_case, idx, @test_case_count) # Create error result packet to maintain consistent data flow error_result = build_error_result(test_case, ex) process_test_result(error_result) # Update circuit breaker for exception cases update_circuit_breaker(error_result) error_result end # Used for a separate purpose then execution_phase. # e.g. the quiet formatter prints a newline after all test dots @output_manager&.file_end(path, context: @options[:shared_context] ? :shared : :fresh) @output_manager&.execution_phase(test_cases.size) execute_global_teardown finalize_results(execution_results) @status = :completed !failed? end