Skip to content

TearDownTest called before all sub-tests are done? #5

Description

@marco-alban-atomic

Should this fork address stretchr/testify#934 such that TearDownTest gets called after all the subtests are done? The line in the readme below this header: https://github.com/huma-engineering/testify#parallel-test-suites seems to imply this is the case.

This reproducible example shows that TearDownTest is called before the subsets are complete:

package example

import (
	"math/rand"
	"testing"
	"time"

	"github.com/huma-engineering/testify/v2/suite"
)

func TestSuiteParallelSubTests(t *testing.T) {
	suite.Run(t, &Suite{})
}

type Suite struct{}

func (s *Suite) TearDownSuite(t *suite.T) {
	t.Log(">> suite tear down", time.Now().Format(time.ANSIC))
}

func (s *Suite) SetupTest(t *suite.T) {
	t.Log(">> single test setup", t.Name())
}

func (s *Suite) TearDownTest(t *suite.T) {
	t.Log(">> single test tear down", t.Name(), time.Now().Format(time.ANSIC))
}

func (s *Suite) TestOne(t *suite.T) {
	for _, v := range []string{"sub1", "sub2", "sub3"} {
		t.Run(v, func(a *suite.T) {
			a.Parallel()
			r := rand.Intn(3)
			a.Log("started to run: ", a.Name(), "will wait: ", r, time.Now().Format(time.ANSIC))
			time.Sleep(time.Duration(r) * time.Second)
			a.Log("end  run: ", a.Name(), time.Now().Format(time.ANSIC))
		})
	}
}

func (s *Suite) TestTwo(t *suite.T) {
	for _, v := range []string{"sub1", "sub2", "sub3"} {
		t.Run(v, func(a *suite.T) {
			a.Parallel()
			r := rand.Intn(3)
			a.Log("started to run: ", a.Name(), "will wait: ", r, time.Now().Format(time.ANSIC))
			time.Sleep(time.Duration(r) * time.Second)
			a.Log("end  run: ", a.Name(), time.Now().Format(time.ANSIC))
		})
	}
}

The output of a sample run is:

=== RUN   TestSuiteParallelSubTests
=== CONT  TestSuiteParallelSubTests
    suite.go:64: >> suite tear down Fri May 31 01:52:06 2024
--- PASS: TestSuiteParallelSubTests (4.00s)
=== RUN   TestSuiteParallelSubTests/All
    --- PASS: TestSuiteParallelSubTests/All (4.00s)
=== RUN   TestSuiteParallelSubTests/All/TestOne
    suite.go:64: >> single test setup TestSuiteParallelSubTests/All/TestOne
=== CONT  TestSuiteParallelSubTests/All/TestOne
    suite.go:64: >> single test tear down TestSuiteParallelSubTests/All/TestOne Fri May 31 01:52:02 2024
        --- PASS: TestSuiteParallelSubTests/All/TestOne (0.00s)
=== RUN   TestSuiteParallelSubTests/All/TestOne/sub1
=== PAUSE TestSuiteParallelSubTests/All/TestOne/sub1
=== CONT  TestSuiteParallelSubTests/All/TestOne/sub1
=== CONT  TestSuiteParallelSubTests/All/TestOne/sub1
    suite.go:64: started to run:  TestSuiteParallelSubTests/All/TestOne/sub1 will wait:  2 Fri May 31 01:52:02 2024
=== CONT  TestSuiteParallelSubTests/All/TestOne/sub1
    suite.go:64: end  run:  TestSuiteParallelSubTests/All/TestOne/sub1 Fri May 31 01:52:04 2024
            --- PASS: TestSuiteParallelSubTests/All/TestOne/sub1 (2.00s)
=== RUN   TestSuiteParallelSubTests/All/TestOne/sub2
=== PAUSE TestSuiteParallelSubTests/All/TestOne/sub2
=== CONT  TestSuiteParallelSubTests/All/TestOne/sub2
    suite.go:64: started to run:  TestSuiteParallelSubTests/All/TestOne/sub2 will wait:  2 Fri May 31 01:52:02 2024
=== CONT  TestSuiteParallelSubTests/All/TestOne/sub2
    suite.go:64: end  run:  TestSuiteParallelSubTests/All/TestOne/sub2 Fri May 31 01:52:04 2024
            --- PASS: TestSuiteParallelSubTests/All/TestOne/sub2 (2.00s)
=== RUN   TestSuiteParallelSubTests/All/TestOne/sub3
=== PAUSE TestSuiteParallelSubTests/All/TestOne/sub3
=== CONT  TestSuiteParallelSubTests/All/TestOne/sub3
=== CONT  TestSuiteParallelSubTests/All/TestOne/sub3
    suite.go:64: started to run:  TestSuiteParallelSubTests/All/TestOne/sub3 will wait:  0 Fri May 31 01:52:02 2024
    suite.go:64: end  run:  TestSuiteParallelSubTests/All/TestOne/sub3 Fri May 31 01:52:02 2024
            --- PASS: TestSuiteParallelSubTests/All/TestOne/sub3 (0.00s)
=== RUN   TestSuiteParallelSubTests/All/TestTwo
    suite.go:64: >> single test setup TestSuiteParallelSubTests/All/TestTwo
=== CONT  TestSuiteParallelSubTests/All/TestTwo
    suite.go:64: >> single test tear down TestSuiteParallelSubTests/All/TestTwo Fri May 31 01:52:04 2024
        --- PASS: TestSuiteParallelSubTests/All/TestTwo (0.00s)
=== RUN   TestSuiteParallelSubTests/All/TestTwo/sub1
=== PAUSE TestSuiteParallelSubTests/All/TestTwo/sub1
=== CONT  TestSuiteParallelSubTests/All/TestTwo/sub1
    suite.go:64: started to run:  TestSuiteParallelSubTests/All/TestTwo/sub1 will wait:  2 Fri May 31 01:52:04 2024
=== CONT  TestSuiteParallelSubTests/All/TestTwo/sub1
    suite.go:64: end  run:  TestSuiteParallelSubTests/All/TestTwo/sub1 Fri May 31 01:52:06 2024
            --- PASS: TestSuiteParallelSubTests/All/TestTwo/sub1 (2.00s)
=== RUN   TestSuiteParallelSubTests/All/TestTwo/sub2
=== PAUSE TestSuiteParallelSubTests/All/TestTwo/sub2
=== CONT  TestSuiteParallelSubTests/All/TestTwo/sub2
    suite.go:64: started to run:  TestSuiteParallelSubTests/All/TestTwo/sub2 will wait:  0 Fri May 31 01:52:04 2024
    suite.go:64: end  run:  TestSuiteParallelSubTests/All/TestTwo/sub2 Fri May 31 01:52:04 2024
            --- PASS: TestSuiteParallelSubTests/All/TestTwo/sub2 (0.00s)
=== RUN   TestSuiteParallelSubTests/All/TestTwo/sub3
=== PAUSE TestSuiteParallelSubTests/All/TestTwo/sub3
=== CONT  TestSuiteParallelSubTests/All/TestTwo/sub3
    suite.go:64: started to run:  TestSuiteParallelSubTests/All/TestTwo/sub3 will wait:  1 Fri May 31 01:52:04 2024
=== CONT  TestSuiteParallelSubTests/All/TestTwo/sub3
    suite.go:64: end  run:  TestSuiteParallelSubTests/All/TestTwo/sub3 Fri May 31 01:52:05 2024
            --- PASS: TestSuiteParallelSubTests/All/TestTwo/sub3 (1.00s)
PASS

Process finished with the exit code 0

In particular note that:

single test tear down TestSuiteParallelSubTests/All/TestOne Fri May 31 01:52:02 2024

is called before:

suite.go:64: end  run:  TestSuiteParallelSubTests/All/TestOne/sub1 Fri May 31 01:52:04 2024

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions