From 5f4169548ce5ec3b40b1cab6f66c502786e72e23 Mon Sep 17 00:00:00 2001 From: Felipe Gasper Date: Wed, 2 Apr 2025 13:35:16 -0400 Subject: [PATCH 1/3] Fix panic if a WithStats suite skips a test during SetupTest or BeforeTest. This fixes issue #1722. --- suite/suite.go | 2 ++ suite/suite_stats_and_skip_test.go | 29 +++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 suite/suite_stats_and_skip_test.go diff --git a/suite/suite.go b/suite/suite.go index 32976ac9f..daf95cddf 100644 --- a/suite/suite.go +++ b/suite/suite.go @@ -181,6 +181,7 @@ func Run(t *testing.T, suite TestingSuite) { parentT := suite.T() suite.SetT(t) defer recoverAndFailOnPanic(t) + defer func() { t.Helper() @@ -203,6 +204,7 @@ func Run(t *testing.T, suite TestingSuite) { if setupTestSuite, ok := suite.(SetupTestSuite); ok { setupTestSuite.SetupTest() } + if beforeTestSuite, ok := suite.(BeforeTest); ok { beforeTestSuite.BeforeTest(methodFinder.Elem().Name(), method.Name) } diff --git a/suite/suite_stats_and_skip_test.go b/suite/suite_stats_and_skip_test.go new file mode 100644 index 000000000..bb928af2d --- /dev/null +++ b/suite/suite_stats_and_skip_test.go @@ -0,0 +1,29 @@ +package suite + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +type mySuite struct { + Suite +} + +func (s *mySuite) SetupTest() { + s.T().Skip("Just because!") +} +func (s *mySuite) HandleStats(_ string, _ *SuiteInformation) {} + +func (s *mySuite) TestSomething() { + panic("Should not get here.") +} + +func TestSuiteWithStatsAndSkip(t *testing.T) { + assert.NotPanics( + t, + func() { + Run(t, &mySuite{}) + }, + ) +} From 761a4b8dec200b21ac01004ba03e4589852d5526 Mon Sep 17 00:00:00 2001 From: Felipe Gasper Date: Thu, 3 Apr 2025 09:01:08 -0400 Subject: [PATCH 2/3] alter bug fix --- suite/stats.go | 11 +++++++++-- suite/suite.go | 2 -- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/suite/stats.go b/suite/stats.go index be4ccd679..56bd90fb8 100644 --- a/suite/stats.go +++ b/suite/stats.go @@ -35,8 +35,15 @@ func (s *SuiteInformation) end(testName string, passed bool) { if s == nil { return } - s.TestStats[testName].End = time.Now() - s.TestStats[testName].Passed = passed + + testStats, started := s.TestStats[testName] + + if !started { + return + } + + testStats.End = time.Now() + testStats.Passed = passed } func (s *SuiteInformation) Passed() bool { diff --git a/suite/suite.go b/suite/suite.go index daf95cddf..32976ac9f 100644 --- a/suite/suite.go +++ b/suite/suite.go @@ -181,7 +181,6 @@ func Run(t *testing.T, suite TestingSuite) { parentT := suite.T() suite.SetT(t) defer recoverAndFailOnPanic(t) - defer func() { t.Helper() @@ -204,7 +203,6 @@ func Run(t *testing.T, suite TestingSuite) { if setupTestSuite, ok := suite.(SetupTestSuite); ok { setupTestSuite.SetupTest() } - if beforeTestSuite, ok := suite.(BeforeTest); ok { beforeTestSuite.BeforeTest(methodFinder.Elem().Name(), method.Name) } From f947962191abb01f118f936d3516dfd7d519b643 Mon Sep 17 00:00:00 2001 From: Henry Wibowo Date: Thu, 25 Sep 2025 09:45:50 +0700 Subject: [PATCH 3/3] Refactor: move test --- suite/suite_stats_and_skip_test.go | 29 ----------------------------- suite/suite_test.go | 21 +++++++++++++++++++++ 2 files changed, 21 insertions(+), 29 deletions(-) delete mode 100644 suite/suite_stats_and_skip_test.go diff --git a/suite/suite_stats_and_skip_test.go b/suite/suite_stats_and_skip_test.go deleted file mode 100644 index bb928af2d..000000000 --- a/suite/suite_stats_and_skip_test.go +++ /dev/null @@ -1,29 +0,0 @@ -package suite - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -type mySuite struct { - Suite -} - -func (s *mySuite) SetupTest() { - s.T().Skip("Just because!") -} -func (s *mySuite) HandleStats(_ string, _ *SuiteInformation) {} - -func (s *mySuite) TestSomething() { - panic("Should not get here.") -} - -func TestSuiteWithStatsAndSkip(t *testing.T) { - assert.NotPanics( - t, - func() { - Run(t, &mySuite{}) - }, - ) -} diff --git a/suite/suite_test.go b/suite/suite_test.go index 1c193aaf2..cebb47c13 100644 --- a/suite/suite_test.go +++ b/suite/suite_test.go @@ -813,3 +813,24 @@ func TestSuiteSignatureValidation(t *testing.T) { assert.True(t, suiteTester.setUp, "SetupSuite should have been executed") assert.True(t, suiteTester.toreDown, "TearDownSuite should have been executed") } + +type suiteSkipTestWithStats struct{ Suite } + +func (s *suiteSkipTestWithStats) SetupTest() { + s.T().Skip("Just because!") +} + +func (s *suiteSkipTestWithStats) HandleStats(_ string, _ *SuiteInformation) {} + +func (s *suiteSkipTestWithStats) TestSomething() { + panic("Should not get here.") +} + +func TestSuiteSkipTestWithStats(t *testing.T) { + assert.NotPanics( + t, + func() { + Run(t, &suiteSkipTestWithStats{}) + }, + ) +}