Files
virtual-kubelet/internal/test/suite/suite_test.go
Ernest Wong f10a16aed7 Importable End-To-End Test Suite (#758)
* Rename VK to chewong for development purpose

* Rename basic_test.go to basic.go

* Add e2e.go and suite.go

* Disable tests in node.go

* End to end tests are now importable as a testing suite

* Remove 'test' from test files

* Add documentations

* Rename chewong back to virtual-kubelet

* Change 'Testing Suite' to 'Test Suite'

* Add the ability to skip certain testss

* Add unit tests for suite.go

* Add README.md for importable e2e test suite

* VK implementation has to be based on VK v1.0.0

* Stricter checks on validating test functions

* Move certain files back to internal folder

* Add WatchTimeout as a config field

* Add slight modifications
2019-09-04 22:25:43 +01:00

127 lines
3.2 KiB
Go

package suite
import (
"strings"
"testing"
"gotest.tools/assert"
is "gotest.tools/assert/cmp"
)
type basicTestSuite struct {
setupCount int
testFooCount int
testBarCount int
bazCount int
testFooBarCount int
testFooBazCount int
testBarBazCount int
teardownCount int
testsRan []string
}
func (bts *basicTestSuite) Setup() {
bts.setupCount++
}
func (bts *basicTestSuite) Teardown() {
bts.teardownCount++
}
func (bts *basicTestSuite) TestFoo(t *testing.T) {
bts.testFooCount++
bts.testsRan = append(bts.testsRan, t.Name())
}
func (bts *basicTestSuite) TestBar(t *testing.T) {
bts.testBarCount++
bts.testsRan = append(bts.testsRan, t.Name())
}
// Baz should not be executed by the test suite
// because it does not have the prefix 'Test'
func (bts *basicTestSuite) Baz(t *testing.T) {
bts.bazCount++
bts.testsRan = append(bts.testsRan, t.Name())
}
// TestFooBar should not be executed by the test suite
// because the number of function input is not 2 (*basicTestSuite and *testing.T)
func (bts *basicTestSuite) TestFooBar() {
bts.testFooBarCount++
bts.testsRan = append(bts.testsRan, "TestFooBar")
}
// TestFooBaz should not be executed by the test suite
// because the number of function output is not 0
func (bts *basicTestSuite) TestFooBaz(t *testing.T) error {
bts.testFooBazCount++
bts.testsRan = append(bts.testsRan, t.Name())
return nil
}
// TestBarBaz should not be executed by the test suite
// because the type of the function input is not *testing.T
func (bts *basicTestSuite) TestBarBaz(t string) {
bts.testBarBazCount++
bts.testsRan = append(bts.testsRan, "TestBarBaz")
}
func TestBasicTestSuite(t *testing.T) {
bts := new(basicTestSuite)
Run(t, bts)
assert.Equal(t, bts.setupCount, 1)
assert.Equal(t, bts.testFooCount, 1)
assert.Equal(t, bts.testBarCount, 1)
assert.Equal(t, bts.teardownCount, 1)
assert.Assert(t, is.Len(bts.testsRan, 2))
assertTestsRan(t, bts.testsRan)
assertNonTests(t, bts)
}
type skipTestSuite struct {
basicTestSuite
skippedTestCount int
}
func (sts *skipTestSuite) ShouldSkipTest(testName string) bool {
if testName == "TestBar" {
sts.skippedTestCount++
return true
}
return false
}
func TestSkipTest(t *testing.T) {
sts := new(skipTestSuite)
Run(t, sts)
assert.Equal(t, sts.setupCount, 1)
assert.Equal(t, sts.testFooCount, 1)
assert.Equal(t, sts.testBarCount, 0)
assert.Equal(t, sts.teardownCount, 1)
assert.Equal(t, sts.skippedTestCount, 1)
assert.Assert(t, is.Len(sts.testsRan, 1))
assertTestsRan(t, sts.testsRan)
assertNonTests(t, &sts.basicTestSuite)
}
func assertTestsRan(t *testing.T, testsRan []string) {
for _, testRan := range testsRan {
parts := strings.Split(testRan, "/")
// Make sure that the name of the test has exactly one parent name and one subtest name
assert.Assert(t, is.Len(parts, 2))
// Check the parent test's name
assert.Equal(t, parts[0], t.Name())
}
}
// assertNonTests ensures that any malformed test functions are not run by the test suite
func assertNonTests(t *testing.T, bts *basicTestSuite) {
assert.Equal(t, bts.bazCount, 0)
assert.Equal(t, bts.testFooBarCount, 0)
assert.Equal(t, bts.testFooBazCount, 0)
assert.Equal(t, bts.testBarBazCount, 0)
}