...

Package subtest

import "gotest.tools/v3/x/subtest"
Overview
Index
Examples

Overview ▾

Package subtest provides a TestContext to subtests which handles cleanup, and provides a testing.TB, and context.Context.

This package was inspired by github.com/frankban/quicktest.

DEPRECATED

With the addition of T.Cleanup() in go1.14 this package provides very little value. A context.Context can be managed by tests that need it with little enough boilerplate that it doesn't make sense to wrap testing.T in a TestContext.

func Run

func Run(t *testing.T, name string, subtest func(t TestContext)) bool

Run a subtest. When subtest exits, every cleanup function added with TestContext.AddCleanup will be run.

Example (TableTest)

Code:

var testcases = []struct {
    data     io.Reader
    expected int
}{
    {
        data:     strings.NewReader("invalid input"),
        expected: 400,
    },
    {
        data:     strings.NewReader("valid input"),
        expected: 200,
    },
}

for _, tc := range testcases {
    subtest.Run(t, "test-service-call", func(t subtest.TestContext) {
        // startFakeService can shutdown using t.AddCleanup
        url := startFakeService(t)

        req, err := http.NewRequest("POST", url, tc.data)
        assert.NilError(t, err)
        req = req.WithContext(t.Ctx())

        client := newClient(t)
        resp, err := client.Do(req)
        assert.NilError(t, err)
        assert.Equal(t, resp.StatusCode, tc.expected)
    })
}

Example (TestSuite)

Code:

// do suite setup before subtests

subtest.Run(t, "test-one", func(t subtest.TestContext) {
    assert.Equal(t, 1, 1)
})
subtest.Run(t, "test-two", func(t subtest.TestContext) {
    assert.Equal(t, 2, 2)
})

// do suite teardown after subtests

type TestContext

TestContext provides a testing.TB and a context.Context for a test case.

type TestContext interface {
    testing.TB
    // AddCleanup function which will be run when before Run returns.
    //
    // Deprecated: Go 1.14+ now includes a testing.TB.Cleanup(func()) which
    // should be used instead. AddCleanup will be removed in a future release.
    AddCleanup(f func())
    // Ctx returns a context for the test case. Multiple calls from the same subtest
    // will return the same context. The context is cancelled when Run
    // returns.
    Ctx() context.Context
    // Parallel calls t.Parallel on the testing.TB. Panics if testing.TB does
    // not implement Parallel.
    Parallel()
}