ライブラリが古びていたのでまずはバージョンを上げました。メジャーバージョンアップ上等で、ぱっと見で明らかに壊れていないならいいでしょう、という方針で進めました。VSCodeのformat on saveにもprettierを使っているはずですが、format on saveと prettier --write でコードの整形結果が違う*1のを目撃したけど、見なかったことにします。
ところで、開発が進むにつれてinterface定義の数が多くなり、//go:generate コマンドの数も多くなると思います。こうなってくるとよくある問題として、mockgenのコード生成にかかる時間がどんどん長くなります。ひどい場合は go generate ./... を実行している間に長めに休憩できるかもしれません。
mockgenのコード生成に時間がかかる
mockgenのコード生成に時間がかかる理由としては、大きく2つのことが挙げられるでしょう。
//go:generate コメントに書いたコマンドは逐次実行される
mockgenのreflect modeが遅い
前者は go help generate にも書いてあるように、 go generate コマンドがそのように設計されているためです。
Within a package, generate processes the source files in a package in file name order, one at a time. Within a source file, generate runs generators in the order they appear in the file, one at a time.
go generate を並列実行できるようにしたい、というproposalが提出されたことがありますがrejectされています*2。
package bar
type BarModel struct {
Id string`transform_struct:"dst_field=Id"`
Name string`transform_struct:"dst_field=Name"`
Age int`transform_struct:"dst_field=Age"`
CreatedAt time.Time `transform_struct:"-"`
UpdatedAt time.Time `transform_struct:"-"`
}
ということで、tparseが生成するMarkdown形式のテストサマリをJob Summaryとして出力できるようにしてみましょう。Job Summaryを生成するステップを分ける場合は、以下のように go test の出力を tee コマンドで一時ファイルに出しつつ引き回したり、if: always() でテストがコケたときも実行されるようにしたりなどいくつか気をつけるポイントがあります。
- name: Test
run: |
set -o pipefail
go test ./... -json | tee ./go-test.out | go run github.com/mfridman/tparse -all
- name: Add job summary
if: always()
run: |
go run github.com/mfridman/tparse -file ./go-test.out -format markdown >> $GITHUB_STEP_SUMMARY