Goのテストのお手軽分割実行gotesplit
TIME rest time current/total
TopicsPlaceHolder

Goのテストのお手軽分割実行gotesplit

開発×テスト LT会 - vol.2

Mar 15th, 2022

Me

songmu

Launchable

テストの会社から来ました

Launchable

https://www.launchableinc.com/

Goのテストのお手軽分割実行

スローテスト問題

各SaaSのジョブの並列実行機構

ただし、このままだと単にフルテストがそれぞれのジョブで走るだけ。

gotesplitコマンド

% gotesplit [options] [pkgs...] [-- go-test-arguments...]
% gotesplit -junit-dir=~/junit -total=5 -index=0 ./... -- -v

インストール

% go install github.com/Songmu/gotesplit/cmd/gotesplit@latest
% curl -sfL raw.githubusercontent.com/Songmu/gotesplit/main/install.sh | sh -s

CircleCIへの導入

version: 2.1
jobs:
  test:
    parallelism: 5
    docker:
      - image: golang:1.17.8
    steps:
      - checkout
      - run:
          command: |
            curl -sfL raw.githubusercontent.com/Songmu/gotesplit/main/install.sh | sh -s
            bin/gotesplit -junit-dir=~/junit ./... -- -v
      - store_test_results:
          path: ~/junit

GitHub Actionsへの導入

name: CI
on: [push, pull_request]
jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        parallelism: [5]
        index: [0,1,2,3,4]
    steps:
      - uses: actions/setup-go@v2
      - uses: actions/checkout@v2
      - name: Run tests parallelly
        run: |
          curl -sfL raw.githubusercontent.com/Songmu/gotesplit/main/install.sh | sh -s
          bin/gotesplit -total ${{ matrix.parallelism }} -index ${{ matrix.index }} ./... -- -v

サブセット分割ロジック

  1. go test -list . $pkg でテストケース(関数) 一覧を抽出
  2. 1で取得したテストケースを分割
  3. 2で分割されたテストケースからgo test -run に指定する正規表現を組み立てる
    • ex. ^(?:TestAAA|TestBBB|TestCCC)$
  4. 3の正規表現を指定して go test を実行
    • ex. go test -run '^(?:TestAAA|TestBBB|TestCCC)$'
    • go test には正規表現指定で一部のテストを実行する機能が標準で存在

想定問答

テストファイルの分割ではダメだったのか?

パッケージの分割ではダメなのか?

t.Parallel ではダメなの?

テストカバレッジを取りたい

今後の展望

単純なツールとしては完成されている。

宣伝