go-test-buckets
Split your go tests into buckets, or exclude some packages/directories.
Buckets
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) {
}
Excluding Packages/Directories
- Add to your package
func TestMain(m *testing.M) {
buckets.Buckets(m)
os.Exit(m.Run())
}
- Run
EXCLUDE_PACKAGES=package/path/to/exclude,package/path/to/exclude-2 go test -count=1 -v ./...
- Or
EXCLUDE_DIRECTORIES=/full/path/to/exclude go test -count=1 -v ./...
Because of go test
package separation, you have to call buckets.Buckets(m)
in every package you want to ignore.
Why?
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/checkout@v3.5.2
-
name: Get go.mod details
uses: Eun/go-mod-details@v1.0.6
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 }}