diff --git a/lib/devhub/coverbot/test_reports/actions/get_flaky_tests.ex b/lib/devhub/coverbot/test_reports/actions/get_flaky_tests.ex index 38db61a..2569f56 100644 --- a/lib/devhub/coverbot/test_reports/actions/get_flaky_tests.ex +++ b/lib/devhub/coverbot/test_reports/actions/get_flaky_tests.ex @@ -16,6 +16,7 @@ defmodule Devhub.Coverbot.TestReports.Actions.GetFlakyTests do class_name: String.t(), failure_count: non_neg_integer(), first_failure_at: DateTime.t(), + last_failure_at: DateTime.t(), commit_sha: String.t(), info: map() } @@ -41,6 +42,7 @@ defmodule Devhub.Coverbot.TestReports.Actions.GetFlakyTests do class_name: tr3.class_name, test_name: tr3.test_name, first_failure_at: min(tr3.inserted_at), + last_failure_at: max(tr3.inserted_at), commit_sha: fragment("(array_agg(? ORDER BY ? ASC))[1]", c.sha, tr3.inserted_at) } @@ -53,12 +55,13 @@ defmodule Devhub.Coverbot.TestReports.Actions.GetFlakyTests do where: tsr.test_suite_id == ^test_suite_id, where: tr.status == ^:failed, where: tsr.id in subquery(recent_runs_query), - group_by: [tr.test_name, tr.class_name, ff.first_failure_at, ff.commit_sha], + group_by: [tr.test_name, tr.class_name, ff.first_failure_at, ff.last_failure_at, ff.commit_sha], select: %{ test_name: tr.test_name, class_name: tr.class_name, failure_count: count(tr.id), first_failure_at: ff.first_failure_at, + last_failure_at: ff.last_failure_at, commit_sha: ff.commit_sha, # use aggregate function to get most recent info since tr.info is not in GROUP BY info: fragment("(array_agg(? ORDER BY ? DESC))[1]", tr.info, tr.inserted_at) diff --git a/lib/devhub/coverbot/test_reports/actions/get_flaky_tests_test.exs b/lib/devhub/coverbot/test_reports/actions/get_flaky_tests_test.exs index cce9da9..6e4b3b3 100644 --- a/lib/devhub/coverbot/test_reports/actions/get_flaky_tests_test.exs +++ b/lib/devhub/coverbot/test_reports/actions/get_flaky_tests_test.exs @@ -174,6 +174,7 @@ defmodule Devhub.Coverbot.TestReports.Actions.GetFlakyTestsTest do class_name: "TestModule", failure_count: 3, first_failure_at: always_failing_first_failure_datetime, + last_failure_at: always_failing_last_failure_datetime, test_name: "always_failing", # first (ever) failure was in commit1, but count is only from last 3 runs commit_sha: "commit1", @@ -183,6 +184,7 @@ defmodule Devhub.Coverbot.TestReports.Actions.GetFlakyTestsTest do class_name: "TestModule", failure_count: 2, first_failure_at: flaky_first_failure_datetime, + last_failure_at: flaky_last_failure_datetime, test_name: "flaky", # first (ever) failure was in commit2 commit_sha: "commit2", @@ -193,6 +195,9 @@ defmodule Devhub.Coverbot.TestReports.Actions.GetFlakyTestsTest do Coverbot.get_flaky_tests(test_suite.id, 3) assert Timex.equal?(flaky_first_failure_datetime, ~U[2024-01-02 10:00:00Z]) + assert Timex.equal?(flaky_last_failure_datetime, ~U[2024-01-03 10:00:00Z]) + assert Timex.equal?(always_failing_first_failure_datetime, ~U[2024-01-01 10:00:00Z]) + assert Timex.equal?(always_failing_last_failure_datetime, ~U[2024-01-04 10:00:00Z]) end end diff --git a/lib/devhub_web/live/coverbot/test_reports/test_suite.ex b/lib/devhub_web/live/coverbot/test_reports/test_suite.ex index 6a79ee6..29cc20f 100644 --- a/lib/devhub_web/live/coverbot/test_reports/test_suite.ex +++ b/lib/devhub_web/live/coverbot/test_reports/test_suite.ex @@ -7,11 +7,13 @@ defmodule DevhubWeb.Live.Coverbot.TestReports.TestSuite do def mount(%{"test_suite_id" => test_suite_id}, _session, socket) do {:ok, test_suite} = Coverbot.get_test_suite(test_suite_id) + number_of_past_runs = 10 socket |> assign( test_suite: test_suite, page_title: "Test Suite", + number_of_past_runs: number_of_past_runs, breadcrumbs: [ %{title: "Test Suites", path: "/coverbot/test-reports"}, %{ @@ -26,7 +28,7 @@ defmodule DevhubWeb.Live.Coverbot.TestReports.TestSuite do skipped_tests: AsyncResult.loading() ) |> assign_async([:flaky_tests], fn -> - {:ok, %{flaky_tests: Coverbot.get_flaky_tests(test_suite_id, 10)}} + {:ok, %{flaky_tests: Coverbot.get_flaky_tests(test_suite_id, number_of_past_runs)}} end) |> assign_async([:skipped_tests], fn -> {:ok, %{skipped_tests: Coverbot.get_skipped_tests(test_suite_id)}} @@ -41,13 +43,19 @@ defmodule DevhubWeb.Live.Coverbot.TestReports.TestSuite do <.page_header title="Flaky tests" /> <.async_result :let={flaky_tests} assign={@flaky_tests}> <:loading> -
{test_run.test_name}
{test_run.class_name}
- <:col label="" class="w-1/12"> - - - <:col :let={test_run} label="First time skipped" class="w-1/5"> + <:col label="" class="w-1/12"> + <:col label="" class="w-1/5"> + <:col :let={test_run} label="First time skipped" class="w-1/4">