Skip to content

Commit 865fb2c

Browse files
itzamna314georgelesica-wf
authored andcommitted
Add support for subtests (go 1.7)
1 parent c45a138 commit 865fb2c

File tree

2 files changed

+46
-8
lines changed

2 files changed

+46
-8
lines changed

suite/suite.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,19 @@ func failOnPanic(t *testing.T) {
6363
}
6464
}
6565

66+
// Run provides suite functionality around golang subtests. It should be
67+
// called in place of t.Run(name, func(t *testing.T)) in test suite code.
68+
// The passed-in func will be executed as a subtest with a fresh instance of t.
69+
// Provides compatibility with go test pkg -run TestSuite/TestName/SubTestName.
70+
func (suite *Suite) Run(name string, subtest func()) bool {
71+
oldT := suite.T()
72+
defer suite.SetT(oldT)
73+
return oldT.Run(name, func(t *testing.T) {
74+
suite.SetT(t)
75+
subtest()
76+
})
77+
}
78+
6679
// Run takes a testing suite and runs all of the tests attached
6780
// to it.
6881
func Run(t *testing.T, suite TestingSuite) {

suite/suite_test.go

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ type SuiteTester struct {
152152
TearDownTestRunCount int
153153
TestOneRunCount int
154154
TestTwoRunCount int
155+
TestSubtestRunCount int
155156
NonTestMethodRunCount int
156157

157158
SuiteNameBefore []string
@@ -246,6 +247,27 @@ func (suite *SuiteTester) NonTestMethod() {
246247
suite.NonTestMethodRunCount++
247248
}
248249

250+
func (suite *SuiteTester) TestSubtest() {
251+
suite.TestSubtestRunCount++
252+
253+
for _, t := range []struct {
254+
testName string
255+
}{
256+
{"first"},
257+
{"second"},
258+
} {
259+
suiteT := suite.T()
260+
suite.Run(t.testName, func() {
261+
// We should get a different *testing.T for subtests, so that
262+
// go test recognizes them as proper subtests for output formatting
263+
// and running individual subtests
264+
subTestT := suite.T()
265+
suite.NotEqual(subTestT, suiteT)
266+
})
267+
suite.Equal(suiteT, suite.T())
268+
}
269+
}
270+
249271
// TestRunSuite will be run by the 'go test' command, so within it, we
250272
// can run our suite using the Run(*testing.T, TestingSuite) function.
251273
func TestRunSuite(t *testing.T) {
@@ -261,18 +283,20 @@ func TestRunSuite(t *testing.T) {
261283
assert.Equal(t, suiteTester.SetupSuiteRunCount, 1)
262284
assert.Equal(t, suiteTester.TearDownSuiteRunCount, 1)
263285

264-
assert.Equal(t, len(suiteTester.SuiteNameAfter), 3)
265-
assert.Equal(t, len(suiteTester.SuiteNameBefore), 3)
266-
assert.Equal(t, len(suiteTester.TestNameAfter), 3)
267-
assert.Equal(t, len(suiteTester.TestNameBefore), 3)
286+
assert.Equal(t, len(suiteTester.SuiteNameAfter), 4)
287+
assert.Equal(t, len(suiteTester.SuiteNameBefore), 4)
288+
assert.Equal(t, len(suiteTester.TestNameAfter), 4)
289+
assert.Equal(t, len(suiteTester.TestNameBefore), 4)
268290

269291
assert.Contains(t, suiteTester.TestNameAfter, "TestOne")
270292
assert.Contains(t, suiteTester.TestNameAfter, "TestTwo")
271293
assert.Contains(t, suiteTester.TestNameAfter, "TestSkip")
294+
assert.Contains(t, suiteTester.TestNameAfter, "TestSubtest")
272295

273296
assert.Contains(t, suiteTester.TestNameBefore, "TestOne")
274297
assert.Contains(t, suiteTester.TestNameBefore, "TestTwo")
275298
assert.Contains(t, suiteTester.TestNameBefore, "TestSkip")
299+
assert.Contains(t, suiteTester.TestNameBefore, "TestSubtest")
276300

277301
for _, suiteName := range suiteTester.SuiteNameAfter {
278302
assert.Equal(t, "SuiteTester", suiteName)
@@ -290,15 +314,16 @@ func TestRunSuite(t *testing.T) {
290314
assert.False(t, when.IsZero())
291315
}
292316

293-
// There are three test methods (TestOne, TestTwo, and TestSkip), so
317+
// There are four test methods (TestOne, TestTwo, TestSkip, and TestSubtest), so
294318
// the SetupTest and TearDownTest methods (which should be run once for
295-
// each test) should have been run three times.
296-
assert.Equal(t, suiteTester.SetupTestRunCount, 3)
297-
assert.Equal(t, suiteTester.TearDownTestRunCount, 3)
319+
// each test) should have been run four times.
320+
assert.Equal(t, suiteTester.SetupTestRunCount, 4)
321+
assert.Equal(t, suiteTester.TearDownTestRunCount, 4)
298322

299323
// Each test should have been run once.
300324
assert.Equal(t, suiteTester.TestOneRunCount, 1)
301325
assert.Equal(t, suiteTester.TestTwoRunCount, 1)
326+
assert.Equal(t, suiteTester.TestSubtestRunCount, 1)
302327

303328
// Methods that don't match the test method identifier shouldn't
304329
// have been run at all.

0 commit comments

Comments
 (0)