Skip to content

sho-hata/tparagen

Repository files navigation

tparagen

tparagen insert testing/T.Parallel() in a test function in a specific source file or in an entire directory.

ci

Background

To run go tests in parallel, you need to insert testing/T.Parallel() into the main/sub test you want to run in parallel.

func SampleTest(t *testing.T) {
	t.Parallel()

	testCases := []struct {
		name string
	}{{name: "foo"}}
	for _, tc := range testCases {
		t.Run(tc.name, func(x *testing.T) {
			x.Parallel()
			// do anything...
		})
	}
}

If there is your application in production already, you must add a testing/T.Parallel() into any main/sub test. It is a very time-consuming and tedious task.

Description

tparagen is cli tool for insert testing/T.Parallel() into all main/sub test in specified directory.

Before code is below,

package sample

import (
	"fmt"
	"testing"
)

func SampleTest(t *testing.T) {

	testCases := []struct {
		name string
	}{{name: "foo"}}
	for _, tc := range testCases {
		t.Run(tc.name, func(x *testing.T) {
			fmt.Println(tc.name)
		})
	}
}

After execute tparagen, modified code is below.

go version >= 1.22

package test

import (
	"fmt"
	"testing"
)

func SampleTest(t *testing.T) {
	t.Parallel()

	testCases := []struct {
		name string
	}{{name: "foo"}}
	for _, tc := range testCases {
		t.Run(tc.name, func(x *testing.T) {
			x.Parallel()
			fmt.Println(tc.name)
		})
	}
}

go version < 1.21

package test

import (
	"fmt"
	"testing"
)

func SampleTest(t *testing.T) {
	t.Parallel()

	testCases := []struct {
		name string
	}{{name: "foo"}}
	for _, tc := range testCases {
		tc := tc
		t.Run(tc.name, func(x *testing.T) {
			x.Parallel()
			fmt.Println(tc.name)
		})
	}
}

Demo

demo

The following cases are supported

  • Insert RunParallel helper function into the main/sub test function.
  • Loop variables are not re-initialised if the minimum version of Go is less than 1.22
  • Do not insert if t.Setenv() is called in the test function
  • Ignore specified directories with cli option -i/-ignore
  • nolint comment support: parallel,paralleltest

The following cases are not supported

  • Don't insert if the test function calls another function that calls Setenv().

Synopsis

$ tparagen

Options

$ tparagen --help
usage: tparagen [<flags>]


Flags:
  --[no-]help            Show context-sensitive help (also try --help-long and --help-man).
  --ignore=IGNORE        ignore directory names. ex: foo,bar,baz (testdata directory is always ignored.)
  --min-go-version=1.21  minimum go version

Installation

go install github.com/sho-hata/tparagen/cmd/tparagen@latest

Contribution

  1. Fork (https://github.com/sho-hata/tparagen/fork)
  2. Create a feature branch
  3. Commit your changes
  4. Rebase your local changes against the master branch
  5. Run test suite with the go test ./... command and confirm that it passes
  6. Run gofmt -s
  7. Create new Pull Request

License

MIT

Author

sho-hata

About

tparagen inserts `testing.T.Parallel()` in a test function in a specific source file or in an entire directory.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages