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) {
}
- 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 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/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 }}