Skip to content

Commit

Permalink
Add support for subtests (go 1.7)
Browse files Browse the repository at this point in the history
  • Loading branch information
itzamna314 committed Sep 1, 2018
1 parent f35b8ab commit 709096d
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 8 deletions.
14 changes: 14 additions & 0 deletions suite/suite.go
Expand Up @@ -55,6 +55,20 @@ func (suite *Suite) Assert() *assert.Assertions {
return suite.Assertions
}

// Run provides suite functionality around golang subtests. It should be
// called in place of t.Run(name, func(t *testing.T)) in test suite code
// to expose setup and teardown functionality for each subtest. The passed-in
// func will be executed as a subtest with a fresh instance of t. Provides
// compatibility with go test pkg -run TestSuite/TestName/SubTestName.
func (suite *Suite) Run(name string, subtest func()) {
oldT := suite.T()
oldT.Run(name, func(t *testing.T) {
suite.SetT(t)
subtest()
suite.SetT(oldT)
})
}

// Run takes a testing suite and runs all of the tests attached
// to it.
func Run(t *testing.T, suite TestingSuite) {
Expand Down
44 changes: 36 additions & 8 deletions suite/suite_test.go
Expand Up @@ -59,6 +59,7 @@ type SuiteTester struct {
TearDownTestRunCount int
TestOneRunCount int
TestTwoRunCount int
TestSubtestRunCount int
NonTestMethodRunCount int

SuiteNameBefore []string
Expand Down Expand Up @@ -153,6 +154,30 @@ func (suite *SuiteTester) NonTestMethod() {
suite.NonTestMethodRunCount++
}

func (suite *SuiteTester) TestSubtest() {
beforeCount := suite.TestSubtestRunCount
suite.TestSubtestRunCount++

for _, t := range []struct {
testName string
}{
{"first"},
{"second"},
} {
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)
})
}

assert.Equal(suite.T(), suite.TestOneRunCount, beforeCount+1)
suite.Equal(suite.TestOneRunCount, beforeCount+1)
}

// TestRunSuite will be run by the 'go test' command, so within it, we
// can run our suite using the Run(*testing.T, TestingSuite) function.
func TestRunSuite(t *testing.T) {
Expand All @@ -168,18 +193,20 @@ func TestRunSuite(t *testing.T) {
assert.Equal(t, suiteTester.SetupSuiteRunCount, 1)
assert.Equal(t, suiteTester.TearDownSuiteRunCount, 1)

assert.Equal(t, len(suiteTester.SuiteNameAfter), 3)
assert.Equal(t, len(suiteTester.SuiteNameBefore), 3)
assert.Equal(t, len(suiteTester.TestNameAfter), 3)
assert.Equal(t, len(suiteTester.TestNameBefore), 3)
assert.Equal(t, len(suiteTester.SuiteNameAfter), 4)
assert.Equal(t, len(suiteTester.SuiteNameBefore), 4)
assert.Equal(t, len(suiteTester.TestNameAfter), 4)
assert.Equal(t, len(suiteTester.TestNameBefore), 4)

assert.Contains(t, suiteTester.TestNameAfter, "TestOne")
assert.Contains(t, suiteTester.TestNameAfter, "TestTwo")
assert.Contains(t, suiteTester.TestNameAfter, "TestSkip")
assert.Contains(t, suiteTester.TestNameAfter, "TestSubtest")

assert.Contains(t, suiteTester.TestNameBefore, "TestOne")
assert.Contains(t, suiteTester.TestNameBefore, "TestTwo")
assert.Contains(t, suiteTester.TestNameBefore, "TestSkip")
assert.Contains(t, suiteTester.TestNameBefore, "TestSubtest")

for _, suiteName := range suiteTester.SuiteNameAfter {
assert.Equal(t, "SuiteTester", suiteName)
Expand All @@ -197,15 +224,16 @@ func TestRunSuite(t *testing.T) {
assert.False(t, when.IsZero())
}

// There are three test methods (TestOne, TestTwo, and TestSkip), so
// There are four test methods (TestOne, TestTwo, TestSkip, and TestSubtest), so
// the SetupTest and TearDownTest methods (which should be run once for
// each test) should have been run three times.
assert.Equal(t, suiteTester.SetupTestRunCount, 3)
assert.Equal(t, suiteTester.TearDownTestRunCount, 3)
// each test) should have been run four times.
assert.Equal(t, suiteTester.SetupTestRunCount, 4)
assert.Equal(t, suiteTester.TearDownTestRunCount, 4)

// Each test should have been run once.
assert.Equal(t, suiteTester.TestOneRunCount, 1)
assert.Equal(t, suiteTester.TestTwoRunCount, 1)
assert.Equal(t, suiteTester.TestSubtestRunCount, 1)

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

0 comments on commit 709096d

Please sign in to comment.