@@ -152,6 +152,7 @@ type SuiteTester struct {
152
152
TearDownTestRunCount int
153
153
TestOneRunCount int
154
154
TestTwoRunCount int
155
+ TestSubtestRunCount int
155
156
NonTestMethodRunCount int
156
157
157
158
SuiteNameBefore []string
@@ -246,6 +247,27 @@ func (suite *SuiteTester) NonTestMethod() {
246
247
suite .NonTestMethodRunCount ++
247
248
}
248
249
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
+
249
271
// TestRunSuite will be run by the 'go test' command, so within it, we
250
272
// can run our suite using the Run(*testing.T, TestingSuite) function.
251
273
func TestRunSuite (t * testing.T ) {
@@ -261,18 +283,20 @@ func TestRunSuite(t *testing.T) {
261
283
assert .Equal (t , suiteTester .SetupSuiteRunCount , 1 )
262
284
assert .Equal (t , suiteTester .TearDownSuiteRunCount , 1 )
263
285
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 )
268
290
269
291
assert .Contains (t , suiteTester .TestNameAfter , "TestOne" )
270
292
assert .Contains (t , suiteTester .TestNameAfter , "TestTwo" )
271
293
assert .Contains (t , suiteTester .TestNameAfter , "TestSkip" )
294
+ assert .Contains (t , suiteTester .TestNameAfter , "TestSubtest" )
272
295
273
296
assert .Contains (t , suiteTester .TestNameBefore , "TestOne" )
274
297
assert .Contains (t , suiteTester .TestNameBefore , "TestTwo" )
275
298
assert .Contains (t , suiteTester .TestNameBefore , "TestSkip" )
299
+ assert .Contains (t , suiteTester .TestNameBefore , "TestSubtest" )
276
300
277
301
for _ , suiteName := range suiteTester .SuiteNameAfter {
278
302
assert .Equal (t , "SuiteTester" , suiteName )
@@ -290,15 +314,16 @@ func TestRunSuite(t *testing.T) {
290
314
assert .False (t , when .IsZero ())
291
315
}
292
316
293
- // There are three test methods (TestOne, TestTwo, and TestSkip ), so
317
+ // There are four test methods (TestOne, TestTwo, TestSkip, and TestSubtest ), so
294
318
// 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 )
298
322
299
323
// Each test should have been run once.
300
324
assert .Equal (t , suiteTester .TestOneRunCount , 1 )
301
325
assert .Equal (t , suiteTester .TestTwoRunCount , 1 )
326
+ assert .Equal (t , suiteTester .TestSubtestRunCount , 1 )
302
327
303
328
// Methods that don't match the test method identifier shouldn't
304
329
// have been run at all.
0 commit comments