Skip to content

Commit 55fbc86

Browse files
committed
suite: add support for user-defined test filtering
1 parent 5c94955 commit 55fbc86

File tree

2 files changed

+176
-0
lines changed

2 files changed

+176
-0
lines changed

suite/suite.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,12 @@ type test = struct {
123123
// Run takes a testing suite and runs all of the tests attached
124124
// to it.
125125
func Run(t *testing.T, suite TestingSuite) {
126+
RunWithSkip(t, suite, func(_, _ string) bool { return false })
127+
}
128+
129+
// RunWithSkip takes a testing suite and a skip function allowing
130+
// for extra filtering on tests to be run
131+
func RunWithSkip(t *testing.T, suite TestingSuite, skip func(string, string) bool) {
126132
defer recoverAndFailOnPanic(t)
127133

128134
suite.SetT(t)
@@ -150,6 +156,10 @@ func Run(t *testing.T, suite TestingSuite) {
150156
continue
151157
}
152158

159+
if skip(suiteName, method.Name) {
160+
continue
161+
}
162+
153163
test := test{
154164
name: method.Name,
155165
run: func(t *testing.T) {

suite/suite_test.go

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -751,3 +751,169 @@ func TestUnInitializedSuites(t *testing.T) {
751751
})
752752
})
753753
}
754+
755+
var register = map[string]bool{"SuiteTesterTestTwo": true}
756+
757+
func skip(suiteName, testName string) bool {
758+
return register[suiteName+testName]
759+
}
760+
761+
// TestRunSuiteWithSkip will be run by the 'go test' command, so within it, we
762+
// can run our suite using the Run(*testing.T, TestingSuite) function.
763+
func TestRunSuiteWithSkip(t *testing.T) {
764+
suiteTester := new(SuiteTester)
765+
RunWithSkip(t, suiteTester, skip)
766+
767+
// Normally, the test would end here. The following are simply
768+
// some assertions to ensure that the Run function is working as
769+
// intended - they are not part of the example.
770+
771+
// The suite was only run once, so the SetupSuite and TearDownSuite
772+
// methods should have each been run only once.
773+
assert.Equal(t, 1, suiteTester.SetupSuiteRunCount)
774+
assert.Equal(t, 1, suiteTester.TearDownSuiteRunCount)
775+
776+
assert.Len(t, suiteTester.SuiteNameAfter, 3)
777+
assert.Len(t, suiteTester.SuiteNameBefore, 3)
778+
assert.Len(t, suiteTester.TestNameAfter, 3)
779+
assert.Len(t, suiteTester.TestNameBefore, 3)
780+
781+
assert.Contains(t, suiteTester.TestNameAfter, "TestOne")
782+
assert.NotContains(t, suiteTester.TestNameAfter, "TestTwo")
783+
assert.Contains(t, suiteTester.TestNameAfter, "TestSkip")
784+
assert.Contains(t, suiteTester.TestNameAfter, "TestSubtest")
785+
786+
assert.Contains(t, suiteTester.TestNameBefore, "TestOne")
787+
assert.NotContains(t, suiteTester.TestNameBefore, "TestTwo")
788+
assert.Contains(t, suiteTester.TestNameBefore, "TestSkip")
789+
assert.Contains(t, suiteTester.TestNameBefore, "TestSubtest")
790+
791+
assert.Contains(t, suiteTester.SetupSubTestNames, "TestRunSuiteWithSkip/TestSubtest/first")
792+
assert.Contains(t, suiteTester.SetupSubTestNames, "TestRunSuiteWithSkip/TestSubtest/second")
793+
794+
assert.Contains(t, suiteTester.TearDownSubTestNames, "TestRunSuiteWithSkip/TestSubtest/first")
795+
assert.Contains(t, suiteTester.TearDownSubTestNames, "TestRunSuiteWithSkip/TestSubtest/second")
796+
797+
for _, suiteName := range suiteTester.SuiteNameAfter {
798+
assert.Equal(t, "SuiteTester", suiteName)
799+
}
800+
801+
for _, suiteName := range suiteTester.SuiteNameBefore {
802+
assert.Equal(t, "SuiteTester", suiteName)
803+
}
804+
805+
for _, when := range suiteTester.TimeAfter {
806+
assert.False(t, when.IsZero())
807+
}
808+
809+
for _, when := range suiteTester.TimeBefore {
810+
assert.False(t, when.IsZero())
811+
}
812+
813+
// There are four test methods (TestOne, TestTwo, TestSkip, and TestSubtest), so
814+
// the SetupTest and TearDownTest methods (which should be run once for
815+
// each test) should have been run four times.
816+
assert.Equal(t, 3, suiteTester.SetupTestRunCount)
817+
assert.Equal(t, 3, suiteTester.TearDownTestRunCount)
818+
819+
// Each test should have been run once.
820+
assert.Equal(t, 1, suiteTester.TestOneRunCount)
821+
assert.Equal(t, 0, suiteTester.TestTwoRunCount)
822+
assert.Equal(t, 1, suiteTester.TestSubtestRunCount)
823+
824+
assert.Equal(t, 2, suiteTester.TearDownSubTestRunCount)
825+
assert.Equal(t, 2, suiteTester.SetupSubTestRunCount)
826+
827+
// Methods that don't match the test method identifier shouldn't
828+
// have been run at all.
829+
assert.Equal(t, 0, suiteTester.NonTestMethodRunCount)
830+
831+
suiteSkipTester := new(SuiteSkipTester)
832+
Run(t, suiteSkipTester)
833+
834+
// The suite was only run once, so the SetupSuite and TearDownSuite
835+
// methods should have each been run only once, even though SetupSuite
836+
// called Skip()
837+
assert.Equal(t, 1, suiteSkipTester.SetupSuiteRunCount)
838+
assert.Equal(t, 1, suiteSkipTester.TearDownSuiteRunCount)
839+
840+
}
841+
842+
// TestRunSuiteWithSkip will be run by the 'go test' command, so within it, we
843+
// can run our suite using the Run(*testing.T, TestingSuite) function.
844+
func TestRunSuiteWithSkipAll(t *testing.T) {
845+
suiteTester := new(SuiteTester)
846+
RunWithSkip(t, suiteTester, func(_, _ string) bool { return true })
847+
848+
// Normally, the test would end here. The following are simply
849+
// some assertions to ensure that the Run function is working as
850+
// intended - they are not part of the example.
851+
852+
// The suite was only run once, so the SetupSuite and TearDownSuite
853+
// methods should have each been run only once.
854+
assert.Equal(t, 0, suiteTester.SetupSuiteRunCount)
855+
assert.Equal(t, 0, suiteTester.TearDownSuiteRunCount)
856+
857+
assert.Len(t, suiteTester.SuiteNameAfter, 0)
858+
assert.Len(t, suiteTester.SuiteNameBefore, 0)
859+
assert.Len(t, suiteTester.TestNameAfter, 0)
860+
assert.Len(t, suiteTester.TestNameBefore, 0)
861+
862+
assert.NotContains(t, suiteTester.TestNameAfter, "TestOne")
863+
assert.NotContains(t, suiteTester.TestNameAfter, "TestTwo")
864+
assert.NotContains(t, suiteTester.TestNameAfter, "TestSkip")
865+
assert.NotContains(t, suiteTester.TestNameAfter, "TestSubtest")
866+
867+
assert.NotContains(t, suiteTester.TestNameBefore, "TestOne")
868+
assert.NotContains(t, suiteTester.TestNameBefore, "TestTwo")
869+
assert.NotContains(t, suiteTester.TestNameBefore, "TestSkip")
870+
assert.NotContains(t, suiteTester.TestNameBefore, "TestSubtest")
871+
872+
assert.NotContains(t, suiteTester.SetupSubTestNames, "TestRunSuiteWithSkipAll/TestSubtest/first")
873+
assert.NotContains(t, suiteTester.SetupSubTestNames, "TestRunSuiteWithSkipAll/TestSubtest/second")
874+
875+
assert.NotContains(t, suiteTester.TearDownSubTestNames, "TestRunSuiteWithSkipAll/TestSubtest/first")
876+
assert.NotContains(t, suiteTester.TearDownSubTestNames, "TestRunSuiteWithSkipAll/TestSubtest/second")
877+
878+
for _, suiteName := range suiteTester.SuiteNameAfter {
879+
assert.Equal(t, "SuiteTester", suiteName)
880+
}
881+
882+
for _, suiteName := range suiteTester.SuiteNameBefore {
883+
assert.Equal(t, "SuiteTester", suiteName)
884+
}
885+
886+
for _, when := range suiteTester.TimeAfter {
887+
assert.False(t, when.IsZero())
888+
}
889+
890+
for _, when := range suiteTester.TimeBefore {
891+
assert.False(t, when.IsZero())
892+
}
893+
894+
// There are four test methods (TestOne, TestTwo, TestSkip, and TestSubtest), so
895+
// the SetupTest and TearDownTest methods (which should be run once for
896+
// each test) should have been run four times.
897+
assert.Equal(t, 0, suiteTester.SetupTestRunCount)
898+
assert.Equal(t, 0, suiteTester.TearDownTestRunCount)
899+
900+
// Each test should have been run once.
901+
assert.Equal(t, 0, suiteTester.TestOneRunCount)
902+
assert.Equal(t, 0, suiteTester.TestTwoRunCount)
903+
assert.Equal(t, 0, suiteTester.TestSubtestRunCount)
904+
905+
assert.Equal(t, 0, suiteTester.TearDownSubTestRunCount)
906+
assert.Equal(t, 0, suiteTester.SetupSubTestRunCount)
907+
908+
// Methods that don't match the test method identifier shouldn't
909+
// have been run at all.
910+
assert.Equal(t, 0, suiteTester.NonTestMethodRunCount)
911+
912+
suiteSkipTester := new(SuiteSkipTester)
913+
Run(t, suiteSkipTester)
914+
915+
// All tests were skipped via skip function, so Setup/TearDownSuite should not run
916+
assert.Equal(t, 0, suiteSkipTester.SetupSuiteRunCount)
917+
assert.Equal(t, 0, suiteSkipTester.TearDownSuiteRunCount)
918+
919+
}

0 commit comments

Comments
 (0)