diff --git a/qa/qa/tools/reliable_report.rb b/qa/qa/tools/reliable_report.rb index 9f58c1b8a20faa8b4bcad927cd8f2f34cfe5fd8f..fc887bcb1046d37660a8a8d4ef86501e3ca769c0 100644 --- a/qa/qa/tools/reliable_report.rb +++ b/qa/qa/tools/reliable_report.rb @@ -453,7 +453,7 @@ def spec_attributes_per_run(records) r.values["status"] == "failed" && !allowed_failure?(r.values["failure_exception"]) end - failure_issue = exceptions_and_related_urls(records).values.last + failure_issue = issue_for_most_failures(failed_records) last_record = records.last.values name = last_record["name"] file = last_record["file_path"].split("/").last @@ -508,7 +508,6 @@ def test_runs(reliable:) link = BLOB_MASTER + FEATURES_DIR + last_record["file_path"] stage = last_record["stage"] || "unknown" product_group = last_record["product_group"] || "unknown" - failure_issue = exceptions_and_related_urls(records).values.last runs = records.count @@ -516,6 +515,8 @@ def test_runs(reliable:) r.values["status"] == "failed" && !allowed_failure?(r.values["failure_exception"]) end + failure_issue = issue_for_most_failures(failed_records) + failed_run_type = failed_records.map { |record| record.values['run_type'] }.uniq failure_rate = (failed_records.count.to_f / runs) * 100 @@ -550,6 +551,19 @@ def exceptions_and_related_urls(records) end end + # Return the failure that has the most occurrence + # + # @param [Array<InfluxDB2::FluxRecord>] records + # @return [String] the failure with most occurrence + def issue_for_most_failures(records) + return '' if records.empty? + + issues = records.filter_map { |r| r.values["failure_issue"] } + return '' if issues.empty? + + issues.tally.max_by { |_, count| count }&.first + end + # Check if failure is allowed # # @param [String] failure_exception diff --git a/qa/spec/tools/reliable_report_spec.rb b/qa/spec/tools/reliable_report_spec.rb index bf5c4b1b83923ea94de93aa8ae69f27c4e31f55a..f7018deb1fb516c8829805a78c90579916be6a23 100644 --- a/qa/spec/tools/reliable_report_spec.rb +++ b/qa/spec/tools/reliable_report_spec.rb @@ -409,6 +409,52 @@ def exceptions_markdown(exceptions_and_related_urls) end end + describe "#issue_for_most_failures" do + subject(:reliable_report) { described_class.new(14) } + + let(:failure_message_1) { "This is a failure exception 1" } + let(:failure_message_2) { "This is a failure exception 2" } + let(:job_url) { "https://example.com/job/url" } + let(:failure_issue_url_1) { "https://example.com/failure/issue_1" } + let(:failure_issue_url_2) { "https://example.com/failure/issue_2" } + + let(:records) do + [ + instance_double("InfluxDB2::FluxRecord", values: values_1), + instance_double("InfluxDB2::FluxRecord", values: values_2), + instance_double("InfluxDB2::FluxRecord", values: values_2) + ] + end + + let(:values_1) do + { + "failure_exception" => failure_message_1, + "failure_issue" => failure_issue_url_1, + "job_url" => job_url + } + end + + let(:values_2) do + { + "failure_exception" => failure_message_2, + "failure_issue" => failure_issue_url_2, + "job_url" => job_url + } + end + + let(:values_3) do + { + "failure_exception" => failure_message_2, + "failure_issue" => failure_issue_url_2, + "job_url" => job_url + } + end + + it 'returns the failure issue with most failures' do + expect(reliable_report.send(:issue_for_most_failures, records)).to eq(failure_issue_url_2) + end + end + describe "#exceptions_and_related_urls" do subject(:reliable_report) { described_class.new(14) }