From fcedfe2aad54342ef7e5dd620ab3ce004ecd7d8a Mon Sep 17 00:00:00 2001 From: Esdras Beleza Date: Sun, 26 Jun 2016 18:35:37 -0300 Subject: [PATCH 1/3] Add callbacks to run before and after each test --- suite/interfaces.go | 12 ++++++++++++ suite/suite.go | 6 ++++++ suite/suite_test.go | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+) diff --git a/suite/interfaces.go b/suite/interfaces.go index 2096947..b37cb04 100644 --- a/suite/interfaces.go +++ b/suite/interfaces.go @@ -32,3 +32,15 @@ type TearDownAllSuite interface { type TearDownTestSuite interface { TearDownTest() } + +// BeforeTest has a function to be executed right before the test +// starts and receives the suite and test names as input +type BeforeTest interface { + BeforeTest(suiteName, testName string) +} + +// AfterTest has a function to be executed right after the test +// finishes and receives the suite and test names as input +type AfterTest interface { + AfterTest(suiteName, testName string) +} diff --git a/suite/suite.go b/suite/suite.go index f831e25..57d21a5 100644 --- a/suite/suite.go +++ b/suite/suite.go @@ -86,7 +86,13 @@ func Run(t *testing.T, suite TestingSuite) { if setupTestSuite, ok := suite.(SetupTestSuite); ok { setupTestSuite.SetupTest() } + if beforeTestSuite, ok := suite.(BeforeTest); ok { + beforeTestSuite.BeforeTest(methodFinder.Elem().Name(), method.Name) + } defer func() { + if afterTestSuite, ok := suite.(AfterTest); ok { + afterTestSuite.AfterTest(methodFinder.Elem().Name(), method.Name) + } if tearDownTestSuite, ok := suite.(TearDownTestSuite); ok { tearDownTestSuite.TearDownTest() } diff --git a/suite/suite_test.go b/suite/suite_test.go index c7c4e88..2a3964b 100644 --- a/suite/suite_test.go +++ b/suite/suite_test.go @@ -58,6 +58,12 @@ type SuiteTester struct { TestOneRunCount int TestTwoRunCount int NonTestMethodRunCount int + + SuiteNameBefore []string + TestNameBefore []string + + SuiteNameAfter []string + TestNameAfter []string } type SuiteSkipTester struct { @@ -75,6 +81,16 @@ func (suite *SuiteTester) SetupSuite() { suite.SetupSuiteRunCount++ } +func (suite *SuiteTester) BeforeTest(suiteName, testName string) { + suite.SuiteNameBefore = append(suite.SuiteNameBefore, suiteName) + suite.TestNameBefore = append(suite.TestNameBefore, testName) +} + +func (suite *SuiteTester) AfterTest(suiteName, testName string) { + suite.SuiteNameAfter = append(suite.SuiteNameAfter, suiteName) + suite.TestNameAfter = append(suite.TestNameAfter, testName) +} + func (suite *SuiteSkipTester) SetupSuite() { suite.SetupSuiteRunCount++ suite.T().Skip() @@ -145,6 +161,27 @@ 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) + + for _, suiteName := range suiteTester.SuiteNameAfter { + assert.Equal(t, "SuiteTester", suiteName) + } + + assert.Contains(t, suiteTester.TestNameAfter, "TestOne") + assert.Contains(t, suiteTester.TestNameAfter, "TestTwo") + assert.Contains(t, suiteTester.TestNameAfter, "TestSkip") + + assert.Contains(t, suiteTester.TestNameBefore, "TestOne") + assert.Contains(t, suiteTester.TestNameBefore, "TestTwo") + assert.Contains(t, suiteTester.TestNameBefore, "TestSkip") + + for _, suiteName := range suiteTester.SuiteNameBefore { + assert.Equal(t, "SuiteTester", suiteName) + } + // There are three test methods (TestOne, TestTwo, and TestSkip), so // the SetupTest and TearDownTest methods (which should be run once for // each test) should have been run three times. From bf7a93e70c813c8840759faeb23a063d4cace50b Mon Sep 17 00:00:00 2001 From: Esdras Beleza Date: Sun, 26 Jun 2016 18:36:07 -0300 Subject: [PATCH 2/3] Add timestamp --- suite/interfaces.go | 9 ++++++--- suite/suite.go | 5 +++-- suite/suite_test.go | 26 ++++++++++++++++++++------ 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/suite/interfaces.go b/suite/interfaces.go index b37cb04..e9246b2 100644 --- a/suite/interfaces.go +++ b/suite/interfaces.go @@ -1,6 +1,9 @@ package suite -import "testing" +import ( + "testing" + "time" +) // TestingSuite can store and return the current *testing.T context // generated by 'go test'. @@ -36,11 +39,11 @@ type TearDownTestSuite interface { // BeforeTest has a function to be executed right before the test // starts and receives the suite and test names as input type BeforeTest interface { - BeforeTest(suiteName, testName string) + BeforeTest(suiteName, testName string, when time.Time) } // AfterTest has a function to be executed right after the test // finishes and receives the suite and test names as input type AfterTest interface { - AfterTest(suiteName, testName string) + AfterTest(suiteName, testName string, when time.Time) } diff --git a/suite/suite.go b/suite/suite.go index 57d21a5..ae420c8 100644 --- a/suite/suite.go +++ b/suite/suite.go @@ -7,6 +7,7 @@ import ( "reflect" "regexp" "testing" + "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -87,11 +88,11 @@ func Run(t *testing.T, suite TestingSuite) { setupTestSuite.SetupTest() } if beforeTestSuite, ok := suite.(BeforeTest); ok { - beforeTestSuite.BeforeTest(methodFinder.Elem().Name(), method.Name) + beforeTestSuite.BeforeTest(methodFinder.Elem().Name(), method.Name, time.Now()) } defer func() { if afterTestSuite, ok := suite.(AfterTest); ok { - afterTestSuite.AfterTest(methodFinder.Elem().Name(), method.Name) + afterTestSuite.AfterTest(methodFinder.Elem().Name(), method.Name, time.Now()) } if tearDownTestSuite, ok := suite.(TearDownTestSuite); ok { tearDownTestSuite.TearDownTest() diff --git a/suite/suite_test.go b/suite/suite_test.go index 2a3964b..470cc11 100644 --- a/suite/suite_test.go +++ b/suite/suite_test.go @@ -5,6 +5,7 @@ import ( "io/ioutil" "os" "testing" + "time" "github.com/stretchr/testify/assert" ) @@ -64,6 +65,9 @@ type SuiteTester struct { SuiteNameAfter []string TestNameAfter []string + + TimeBefore []time.Time + TimeAfter []time.Time } type SuiteSkipTester struct { @@ -81,14 +85,16 @@ func (suite *SuiteTester) SetupSuite() { suite.SetupSuiteRunCount++ } -func (suite *SuiteTester) BeforeTest(suiteName, testName string) { +func (suite *SuiteTester) BeforeTest(suiteName, testName string, when time.Time) { suite.SuiteNameBefore = append(suite.SuiteNameBefore, suiteName) suite.TestNameBefore = append(suite.TestNameBefore, testName) + suite.TimeBefore = append(suite.TimeBefore, when) } -func (suite *SuiteTester) AfterTest(suiteName, testName string) { +func (suite *SuiteTester) AfterTest(suiteName, testName string, when time.Time) { suite.SuiteNameAfter = append(suite.SuiteNameAfter, suiteName) suite.TestNameAfter = append(suite.TestNameAfter, testName) + suite.TimeAfter = append(suite.TimeAfter, when) } func (suite *SuiteSkipTester) SetupSuite() { @@ -166,10 +172,6 @@ func TestRunSuite(t *testing.T) { assert.Equal(t, len(suiteTester.TestNameAfter), 3) assert.Equal(t, len(suiteTester.TestNameBefore), 3) - for _, suiteName := range suiteTester.SuiteNameAfter { - assert.Equal(t, "SuiteTester", suiteName) - } - assert.Contains(t, suiteTester.TestNameAfter, "TestOne") assert.Contains(t, suiteTester.TestNameAfter, "TestTwo") assert.Contains(t, suiteTester.TestNameAfter, "TestSkip") @@ -178,10 +180,22 @@ func TestRunSuite(t *testing.T) { assert.Contains(t, suiteTester.TestNameBefore, "TestTwo") assert.Contains(t, suiteTester.TestNameBefore, "TestSkip") + for _, suiteName := range suiteTester.SuiteNameAfter { + assert.Equal(t, "SuiteTester", suiteName) + } + for _, suiteName := range suiteTester.SuiteNameBefore { assert.Equal(t, "SuiteTester", suiteName) } + for _, when := range suiteTester.TimeAfter { + assert.False(t, when.IsZero()) + } + + for _, when := range suiteTester.TimeBefore { + assert.False(t, when.IsZero()) + } + // There are three test methods (TestOne, TestTwo, and TestSkip), so // the SetupTest and TearDownTest methods (which should be run once for // each test) should have been run three times. From 5e72f93a8982d548de051e5c3ce3898255bc86be Mon Sep 17 00:00:00 2001 From: Esdras Beleza Date: Mon, 26 Sep 2016 13:48:19 -0300 Subject: [PATCH 3/3] Remove timestamp from callback --- suite/interfaces.go | 9 +++------ suite/suite.go | 5 ++--- suite/suite_test.go | 8 ++++---- 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/suite/interfaces.go b/suite/interfaces.go index e9246b2..b37cb04 100644 --- a/suite/interfaces.go +++ b/suite/interfaces.go @@ -1,9 +1,6 @@ package suite -import ( - "testing" - "time" -) +import "testing" // TestingSuite can store and return the current *testing.T context // generated by 'go test'. @@ -39,11 +36,11 @@ type TearDownTestSuite interface { // BeforeTest has a function to be executed right before the test // starts and receives the suite and test names as input type BeforeTest interface { - BeforeTest(suiteName, testName string, when time.Time) + BeforeTest(suiteName, testName string) } // AfterTest has a function to be executed right after the test // finishes and receives the suite and test names as input type AfterTest interface { - AfterTest(suiteName, testName string, when time.Time) + AfterTest(suiteName, testName string) } diff --git a/suite/suite.go b/suite/suite.go index ae420c8..57d21a5 100644 --- a/suite/suite.go +++ b/suite/suite.go @@ -7,7 +7,6 @@ import ( "reflect" "regexp" "testing" - "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -88,11 +87,11 @@ func Run(t *testing.T, suite TestingSuite) { setupTestSuite.SetupTest() } if beforeTestSuite, ok := suite.(BeforeTest); ok { - beforeTestSuite.BeforeTest(methodFinder.Elem().Name(), method.Name, time.Now()) + beforeTestSuite.BeforeTest(methodFinder.Elem().Name(), method.Name) } defer func() { if afterTestSuite, ok := suite.(AfterTest); ok { - afterTestSuite.AfterTest(methodFinder.Elem().Name(), method.Name, time.Now()) + afterTestSuite.AfterTest(methodFinder.Elem().Name(), method.Name) } if tearDownTestSuite, ok := suite.(TearDownTestSuite); ok { tearDownTestSuite.TearDownTest() diff --git a/suite/suite_test.go b/suite/suite_test.go index 470cc11..6419234 100644 --- a/suite/suite_test.go +++ b/suite/suite_test.go @@ -85,16 +85,16 @@ func (suite *SuiteTester) SetupSuite() { suite.SetupSuiteRunCount++ } -func (suite *SuiteTester) BeforeTest(suiteName, testName string, when time.Time) { +func (suite *SuiteTester) BeforeTest(suiteName, testName string) { suite.SuiteNameBefore = append(suite.SuiteNameBefore, suiteName) suite.TestNameBefore = append(suite.TestNameBefore, testName) - suite.TimeBefore = append(suite.TimeBefore, when) + suite.TimeBefore = append(suite.TimeBefore, time.Now()) } -func (suite *SuiteTester) AfterTest(suiteName, testName string, when time.Time) { +func (suite *SuiteTester) AfterTest(suiteName, testName string) { suite.SuiteNameAfter = append(suite.SuiteNameAfter, suiteName) suite.TestNameAfter = append(suite.TestNameAfter, testName) - suite.TimeAfter = append(suite.TimeAfter, when) + suite.TimeAfter = append(suite.TimeAfter, time.Now()) } func (suite *SuiteSkipTester) SetupSuite() {