Skip to content

Commit

Permalink
Ensure that subtest name is set in SetupSubTest/TearDownSubTest
Browse files Browse the repository at this point in the history
  • Loading branch information
thekidder committed Sep 20, 2023
1 parent 882382d commit da0d3c8
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 13 deletions.
21 changes: 11 additions & 10 deletions suite/suite.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,19 +96,20 @@ func failOnPanic(t *testing.T, r interface{}) {
func (suite *Suite) Run(name string, subtest func()) bool {
oldT := suite.T()

if setupSubTest, ok := suite.s.(SetupSubTest); ok {
setupSubTest.SetupSubTest()
}
return oldT.Run(name, func(t *testing.T) {
suite.SetT(t)

defer func() {
suite.SetT(oldT)
if tearDownSubTest, ok := suite.s.(TearDownSubTest); ok {
tearDownSubTest.TearDownSubTest()
if setupSubTest, ok := suite.s.(SetupSubTest); ok {
setupSubTest.SetupSubTest()
}
}()

return oldT.Run(name, func(t *testing.T) {
suite.SetT(t)
defer func() {
if tearDownSubTest, ok := suite.s.(TearDownSubTest); ok {
tearDownSubTest.TearDownSubTest()
}
suite.SetT(oldT)
}()

subtest()
})
}
Expand Down
19 changes: 16 additions & 3 deletions suite/suite_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,9 @@ type SuiteTester struct {
SetupSubTestRunCount int
TearDownSubTestRunCount int

SetupSubTestNames []string
TearDownSubTestNames []string

SuiteNameBefore []string
TestNameBefore []string

Expand All @@ -170,6 +173,8 @@ type SuiteTester struct {

TimeBefore []time.Time
TimeAfter []time.Time

SuiteT *testing.T
}

// The SetupSuite method will be run by testify once, at the very
Expand Down Expand Up @@ -245,23 +250,25 @@ func (suite *SuiteTester) TestSubtest() {
{"first"},
{"second"},
} {
suiteT := suite.T()
suite.SuiteT = suite.T()
suite.Run(t.testName, func() {
// We should get a different *testing.T for subtests, so that
// go test recognizes them as proper subtests for output formatting
// and running individual subtests
subTestT := suite.T()
suite.NotEqual(subTestT, suiteT)
suite.NotEqual(subTestT, suite.SuiteT)
})
suite.Equal(suiteT, suite.T())
suite.Equal(suite.SuiteT, suite.T())
}
}

func (suite *SuiteTester) TearDownSubTest() {
suite.TearDownSubTestNames = append(suite.TearDownSubTestNames, suite.T().Name())
suite.TearDownSubTestRunCount++
}

func (suite *SuiteTester) SetupSubTest() {
suite.SetupSubTestNames = append(suite.SetupSubTestNames, suite.T().Name())
suite.SetupSubTestRunCount++
}

Expand Down Expand Up @@ -319,6 +326,12 @@ func TestRunSuite(t *testing.T) {
assert.Contains(t, suiteTester.TestNameBefore, "TestSkip")
assert.Contains(t, suiteTester.TestNameBefore, "TestSubtest")

assert.Contains(t, suiteTester.SetupSubTestNames, "TestRunSuite/TestSubtest/first")
assert.Contains(t, suiteTester.SetupSubTestNames, "TestRunSuite/TestSubtest/second")

assert.Contains(t, suiteTester.TearDownSubTestNames, "TestRunSuite/TestSubtest/first")
assert.Contains(t, suiteTester.TearDownSubTestNames, "TestRunSuite/TestSubtest/second")

for _, suiteName := range suiteTester.SuiteNameAfter {
assert.Equal(t, "SuiteTester", suiteName)
}
Expand Down

0 comments on commit da0d3c8

Please sign in to comment.