go-test-buckets

Split your go tests into buckets.

MIT License

Stars
1

go-test-buckets

Actions Status
Coverage Status
PkgGoDev
go-report

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

  1. Add to your package
    func TestMain(m *testing.M) {
        buckets.Buckets(m)
        os.Exit(m.Run())
    }
    
  2. Run EXCLUDE_PACKAGES=package/path/to/exclude,package/path/to/exclude-2 go test -count=1 -v ./...
  3. 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/)

Extra Github Actions

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 }}