Skip to content

Commit 66ea059

Browse files
authored
TT-2002 Update Flakeguard GitHub summary (#1650)
1 parent e8dee04 commit 66ea059

File tree

4 files changed

+120
-73
lines changed

4 files changed

+120
-73
lines changed

tools/flakeguard/reports/data.go

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,10 @@ type TestReport struct {
2828

2929
// GenerateSummaryData generates a summary of a report's test results
3030
func (testReport *TestReport) GenerateSummaryData() {
31-
var runs, testRunCount, passes, fails, skips, panickedTests, racedTests, flakyTests, skippedTests int
31+
var runs, testRunCount, passes, fails, skips, panickedTests, racedTests, flakyTests int
32+
33+
// Map to hold unique test names that were entirely skipped
34+
uniqueSkippedTestsMap := make(map[string]struct{})
3235

3336
for _, result := range testReport.Results {
3437
runs += result.Runs
@@ -39,9 +42,8 @@ func (testReport *TestReport) GenerateSummaryData() {
3942
fails += result.Failures
4043
skips += result.Skips
4144

42-
// Count tests that were entirely skipped
4345
if result.Runs == 0 && result.Skipped {
44-
skippedTests++
46+
uniqueSkippedTestsMap[result.TestName] = struct{}{}
4547
}
4648

4749
if result.Panic {
@@ -55,6 +57,9 @@ func (testReport *TestReport) GenerateSummaryData() {
5557
}
5658
}
5759

60+
// Calculate the unique count of skipped tests
61+
uniqueSkippedTestCount := len(uniqueSkippedTestsMap)
62+
5863
// Calculate the raw pass ratio
5964
passRatio := passRatio(passes, runs)
6065

@@ -66,12 +71,13 @@ func (testReport *TestReport) GenerateSummaryData() {
6671
flakeTestRatioStr := formatRatio(flakeRatio)
6772

6873
testReport.SummaryData = &SummaryData{
69-
UniqueTestsRun: totalTests,
70-
TestRunCount: testRunCount,
71-
PanickedTests: panickedTests,
72-
RacedTests: racedTests,
73-
FlakyTests: flakyTests,
74-
FlakyTestPercent: flakeTestRatioStr,
74+
UniqueTestsRun: totalTests,
75+
UniqueSkippedTestCount: uniqueSkippedTestCount,
76+
TestRunCount: testRunCount,
77+
PanickedTests: panickedTests,
78+
RacedTests: racedTests,
79+
FlakyTests: flakyTests,
80+
FlakyTestPercent: flakeTestRatioStr,
7581

7682
TotalRuns: runs,
7783
PassedRuns: passes,
@@ -112,6 +118,8 @@ type SummaryData struct {
112118
// Overall test run stats
113119
// UniqueTestsRun tracks how many unique tests were run
114120
UniqueTestsRun int `json:"unique_tests_run"`
121+
// UniqueSkippedTestCount tracks how many unique tests were entirely skipped
122+
UniqueSkippedTestCount int `json:"unique_skipped_test_count"`
115123
// TestRunCount tracks the max amount of times the tests were run, giving an idea of how many times flakeguard was executed
116124
// e.g. if TestA was run 5 times, and TestB was run 10 times, UniqueTestsRun == 2 and TestRunCount == 10
117125
TestRunCount int `json:"test_run_count"`

tools/flakeguard/reports/data_test.go

Lines changed: 90 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -27,17 +27,18 @@ func TestGenerateSummaryData(t *testing.T) {
2727
MaxPassRatio: 1.0,
2828
},
2929
expected: &SummaryData{
30-
UniqueTestsRun: 2,
31-
TestRunCount: 10,
32-
PanickedTests: 0,
33-
RacedTests: 0,
34-
FlakyTests: 0,
35-
FlakyTestPercent: "0%", // no flaky tests
36-
TotalRuns: 15,
37-
PassedRuns: 15,
38-
FailedRuns: 0,
39-
SkippedRuns: 0,
40-
PassPercent: "100%",
30+
UniqueTestsRun: 2,
31+
TestRunCount: 10,
32+
PanickedTests: 0,
33+
RacedTests: 0,
34+
FlakyTests: 0,
35+
FlakyTestPercent: "0%", // no flaky tests
36+
TotalRuns: 15,
37+
PassedRuns: 15,
38+
FailedRuns: 0,
39+
SkippedRuns: 0,
40+
PassPercent: "100%",
41+
UniqueSkippedTestCount: 0,
4142
},
4243
},
4344
{
@@ -60,10 +61,11 @@ func TestGenerateSummaryData(t *testing.T) {
6061
FlakyTestPercent: "66.6667%",
6162
TotalRuns: 19,
6263
PassedRuns: 15,
63-
FailedRuns: 4, // total failures
64+
FailedRuns: 4,
6465
SkippedRuns: 0,
6566
// 15/19 => ~78.947...
66-
PassPercent: "78.9474%",
67+
PassPercent: "78.9474%",
68+
UniqueSkippedTestCount: 0,
6769
},
6870
},
6971
{
@@ -89,7 +91,8 @@ func TestGenerateSummaryData(t *testing.T) {
8991
FailedRuns: 1,
9092
SkippedRuns: 0,
9193
// 17/18 => ~94.444...
92-
PassPercent: "94.4444%",
94+
PassPercent: "94.4444%",
95+
UniqueSkippedTestCount: 0,
9396
},
9497
},
9598
{
@@ -104,70 +107,74 @@ func TestGenerateSummaryData(t *testing.T) {
104107
PanickedTests: 0,
105108
RacedTests: 0,
106109
FlakyTests: 0,
107-
FlakyTestPercent: "0%", // no tests => 0%
110+
FlakyTestPercent: "0%",
108111
TotalRuns: 0,
109112
PassedRuns: 0,
110113
FailedRuns: 0,
111114
SkippedRuns: 0,
112115
// With zero runs, we default passRatio to "100%"
113-
PassPercent: "100%",
116+
PassPercent: "100%",
117+
UniqueSkippedTestCount: 0,
114118
},
115119
},
116120
{
117121
name: "Skipped tests included in total but not executed",
118122
testReport: &TestReport{
119123
Results: []TestResult{
124+
// Skipped test with no runs should be counted in UniqueSkippedTestCount.
120125
{PassRatio: -1.0, Runs: 0, Successes: 0, Skips: 1, Skipped: true},
121126
{PassRatio: 0.7, Runs: 10, Successes: 7, Failures: 3},
122127
},
123128
MaxPassRatio: 0.8,
124129
},
125130
expected: &SummaryData{
126-
UniqueTestsRun: 2,
127-
TestRunCount: 10,
128-
PanickedTests: 0,
129-
RacedTests: 0,
130-
FlakyTests: 1, // second test has ratio=0.7 => "flaky"
131-
FlakyTestPercent: "50%", // 1 out of 2 => 50%
132-
TotalRuns: 10,
133-
PassedRuns: 7,
134-
FailedRuns: 3,
135-
SkippedRuns: 1, // from first test
136-
PassPercent: "70%",
131+
UniqueTestsRun: 2,
132+
TestRunCount: 10,
133+
PanickedTests: 0,
134+
RacedTests: 0,
135+
FlakyTests: 1,
136+
FlakyTestPercent: "50%",
137+
TotalRuns: 10,
138+
PassedRuns: 7,
139+
FailedRuns: 3,
140+
SkippedRuns: 1,
141+
PassPercent: "70%",
142+
UniqueSkippedTestCount: 1,
137143
},
138144
},
139145
{
140146
name: "Mixed skipped and executed tests",
141147
testReport: &TestReport{
142148
Results: []TestResult{
149+
// Skipped test should be counted for UniqueSkippedTestCount.
143150
{PassRatio: -1.0, Runs: 0, Successes: 0, Skips: 1, Skipped: true},
144151
{PassRatio: 0.9, Runs: 10, Successes: 9, Failures: 1},
145152
{PassRatio: 0.5, Runs: 4, Successes: 2, Failures: 2},
146153
},
147154
MaxPassRatio: 0.85,
148155
},
149156
expected: &SummaryData{
150-
UniqueTestsRun: 3,
151-
TestRunCount: 10,
152-
PanickedTests: 0,
153-
RacedTests: 0,
154-
FlakyTests: 1, // last test has ratio=0.5 => "flaky"
155-
FlakyTestPercent: "33.3333%", // 1 out of 3 => 33.333...
156-
TotalRuns: 14, // 10 + 4
157-
PassedRuns: 11, // 9 + 2
158-
FailedRuns: 3, // 1 + 2
159-
SkippedRuns: 1, // from first test
160-
// 11/14 => 78.5714...
161-
PassPercent: "78.5714%",
157+
UniqueTestsRun: 3,
158+
TestRunCount: 10,
159+
PanickedTests: 0,
160+
RacedTests: 0,
161+
FlakyTests: 1,
162+
FlakyTestPercent: "33.3333%",
163+
TotalRuns: 14,
164+
PassedRuns: 11,
165+
FailedRuns: 3,
166+
SkippedRuns: 1,
167+
PassPercent: "78.5714%",
168+
UniqueSkippedTestCount: 1,
162169
},
163170
},
164171
{
165172
name: "Tiny flake ratio that is exactly 0.01%",
166173
testReport: &TestReport{
167174
Results: func() []TestResult {
168175
// 9,999 total:
169-
// - 9,998 stable => pass=1.0
170-
// - 1 flaky => pass=0.5
176+
// - 9,998 stable tests => pass ratio = 1.0
177+
// - 1 flaky test => pass ratio = 0.5
171178
const total = 9999
172179
tests := make([]TestResult, total)
173180
for i := 0; i < total-1; i++ {
@@ -178,7 +185,7 @@ func TestGenerateSummaryData(t *testing.T) {
178185
}
179186
}
180187
tests[total-1] = TestResult{
181-
PassRatio: 0.5, // 1 success, 1 fail
188+
PassRatio: 0.5, // 1 success, 1 failure
182189
Runs: 2,
183190
Successes: 1,
184191
Failures: 1,
@@ -188,17 +195,47 @@ func TestGenerateSummaryData(t *testing.T) {
188195
MaxPassRatio: 1.0,
189196
},
190197
expected: &SummaryData{
191-
UniqueTestsRun: 9999,
192-
TestRunCount: 10,
193-
PanickedTests: 0,
194-
RacedTests: 0,
195-
FlakyTests: 1,
196-
FlakyTestPercent: "0.01%",
197-
TotalRuns: (9998 * 10) + 2,
198-
PassedRuns: (9998 * 10) + 1,
199-
FailedRuns: 1,
200-
SkippedRuns: 0,
201-
PassPercent: "99.999%",
198+
UniqueTestsRun: 9999,
199+
TestRunCount: 10,
200+
PanickedTests: 0,
201+
RacedTests: 0,
202+
FlakyTests: 1,
203+
FlakyTestPercent: "0.01%",
204+
TotalRuns: (9998 * 10) + 2,
205+
PassedRuns: (9998 * 10) + 1,
206+
FailedRuns: 1,
207+
SkippedRuns: 0,
208+
PassPercent: "99.999%",
209+
UniqueSkippedTestCount: 0,
210+
},
211+
},
212+
{
213+
name: "Duplicate skipped tests",
214+
testReport: &TestReport{
215+
Results: []TestResult{
216+
// Two entries for "TestA" should count as one unique skipped test.
217+
{TestName: "TestA", PassRatio: -1.0, Runs: 0, Skips: 1, Skipped: true},
218+
{TestName: "TestA", PassRatio: -1.0, Runs: 0, Skips: 1, Skipped: true},
219+
// A different test "TestB"
220+
{TestName: "TestB", PassRatio: -1.0, Runs: 0, Skips: 1, Skipped: true},
221+
// This test was executed so it should not count as skipped.
222+
{TestName: "TestC", PassRatio: 1.0, Runs: 5, Successes: 5, Skipped: false},
223+
},
224+
MaxPassRatio: 1.0,
225+
},
226+
expected: &SummaryData{
227+
UniqueTestsRun: 4,
228+
TestRunCount: 5,
229+
PanickedTests: 0,
230+
RacedTests: 0,
231+
FlakyTests: 0,
232+
FlakyTestPercent: "0%",
233+
TotalRuns: 5,
234+
PassedRuns: 5,
235+
FailedRuns: 0,
236+
SkippedRuns: 3, // Sum of Skips for all skipped tests.
237+
PassPercent: "100%",
238+
UniqueSkippedTestCount: 2, // Only "TestA" and "TestB" count.
202239
},
203240
},
204241
}

tools/flakeguard/reports/presentation.go

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -195,27 +195,27 @@ func RenderResults(
195195
collapsible bool,
196196
) {
197197
resultsTable := GenerateFlakyTestsTable(testReport, markdown)
198-
renderSummaryTable(w, testReport.SummaryData, markdown, false) // Don't make the summary collapsible
198+
renderSummaryTable(w, testReport.SummaryData, markdown, false, testReport.RaceDetection) // Don't make the summary collapsible
199199
renderTestResultsTable(w, resultsTable, collapsible)
200200
}
201201

202202
// renderSummaryTable renders a summary table with the given data into a console or markdown format.
203203
// If in markdown mode, the table can also be made collapsible.
204-
func renderSummaryTable(w io.Writer, summary *SummaryData, markdown bool, collapsible bool) {
204+
func renderSummaryTable(w io.Writer, summary *SummaryData, markdown bool, collapsible bool, raceDetection bool) {
205205
summaryData := [][]string{
206206
{"Category", "Total"},
207207
{"Unique Tests", fmt.Sprintf("%d", summary.UniqueTestsRun)},
208-
{"Test Run Count", fmt.Sprintf("%d", summary.TestRunCount)},
209-
{"Panicked Tests", fmt.Sprintf("%d", summary.PanickedTests)},
210-
{"Raced Tests", fmt.Sprintf("%d", summary.RacedTests)},
211-
{"Flaky Tests", fmt.Sprintf("%d", summary.FlakyTests)},
212-
{"Flaky Test Percent", summary.FlakyTestPercent},
208+
{"Unique Skipped Tests", fmt.Sprintf("%d", summary.UniqueSkippedTestCount)},
213209
{"Total Test Runs", fmt.Sprintf("%d", summary.TotalRuns)},
214-
{"Passes", fmt.Sprintf("%d", summary.PassedRuns)},
215-
{"Failures", fmt.Sprintf("%d", summary.FailedRuns)},
216-
{"Skips", fmt.Sprintf("%d", summary.SkippedRuns)},
217-
{"Pass Percent", summary.PassPercent},
210+
{"Passed Test Runs", fmt.Sprintf("%d (%s)", summary.PassedRuns, summary.PassPercent)},
211+
{"Flaky Test Runs", fmt.Sprintf("%d (%s)", summary.FlakyTests, summary.FlakyTestPercent)},
212+
{"Panicked Tests", fmt.Sprintf("%d", summary.PanickedTests)},
218213
}
214+
// Only include "Raced Tests" row if race detection is enabled.
215+
if raceDetection {
216+
summaryData = append(summaryData, []string{"Raced Tests", fmt.Sprintf("%d", summary.RacedTests)})
217+
}
218+
219219
if markdown {
220220
for i, row := range summaryData {
221221
if i == 0 {

tools/flakeguard/runner/runner.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ func (r *Runner) RunTestPackages(packages []string) (*reports.TestReport, error)
8484
MaxPassRatio: r.MaxPassRatio,
8585
}
8686
report.GenerateSummaryData()
87+
8788
return report, nil
8889
}
8990

@@ -119,6 +120,7 @@ func (r *Runner) RunTestCmd(testCmd []string) (*reports.TestReport, error) {
119120
MaxPassRatio: r.MaxPassRatio,
120121
}
121122
report.GenerateSummaryData()
123+
122124
return report, nil
123125
}
124126

0 commit comments

Comments
 (0)