Split your go tests into buckets.
MIT License
Split your go tests into buckets, or exclude some packages/directories.
package main_test
import (
"testing"
"os"
"github.com/Eun/go-test-buckets"
)
func TestMain(m *testing.M) {
buckets.Buckets(m)
os.Exit(m.Run())
}
// run with BUCKET=0 TOTAL_BUCKETS=2 go test -count=1 -v ./...
// will run TestA and TestB
// run with BUCKET=1 TOTAL_BUCKETS=2 go test -count=1 -v ./...
// will run TestC
func TestA(t *testing.T) {
}
func TestB(t *testing.T) {
}
func TestC(t *testing.T) {
}
func TestMain(m *testing.M) {
buckets.Buckets(m)
os.Exit(m.Run())
}
EXCLUDE_PACKAGES=package/path/to/exclude,package/path/to/exclude-2 go test -count=1 -v ./...
EXCLUDE_DIRECTORIES=/full/path/to/exclude go test -count=1 -v ./...
Because of
go test
package separation, you have to callbuckets.Buckets(m)
in every package you want to ignore.
Speed up ci pipelines by parallelizing go tests without thinking about t.Parallel.
And getting rid of weird piping go test $(go list ./... | grep -v /ignore/)
You can use following github action when using test buckets:
on:
push:
name: "push"
jobs:
test:
strategy:
matrix:
platform: [ubuntu-latest]
bucket: [0, 1, 2, 3]
env:
TOTAL_BUCKETS: 4
runs-on: ${{ matrix.platform }}
steps:
-
name: Checkout code
uses: actions/[email protected]
-
name: Get go.mod details
uses: Eun/[email protected]
id: go-mod-details
-
name: Install Go
uses: actions/setup-go@v4
with:
go-version: ${{ steps.go-mod-details.outputs.go_version }}
-
name: Test
run: go test -v -count=1 ./...
env:
BUCKET: ${{ matrix.bucket }}