はじめに
こんにちは!
株式会社HRBrainでエンジニアをしているZamaです。
この記事はHRBrain Advent Calendar 2023 カレンダー2の19日目の記事です。
前提
HRBrainでは
- Goを用いてバックエンドの開発を行っており、
- lintにはgolangci-lintが使われ、
- 単体テストのassertionにはtestifyが使われることが多いです。
単体テストがlintの対象でなかった
先日golangci-lint
の設定ファイル(.golangci.yaml
)を覗くことがあり、そこでtests: false
という記述を見つけました。
何だこれ?と確認してみると、
# Include test files or not.
# Default: true
とのことで、単体テストがlintの対象になっていなかったことが分かりました。
たしかに思い返すと単体テストの記述についてlintで指摘された覚えがなく、このためだったのかと納得するとともに、じゃあtrue
にしてみようぜとなるのがエンジニア。
見事に真っ赤になりました。
golangci-lint様がお怒りです😡
testifylintとの出会い
これはよろしくないと指摘を確認していくと、require-error
という見慣れない指摘がありました。
エラーが必要?何かエラーハンドリングの間違いかな?とググってみるとtestifylintというGitHubのレポジトリが出てきました。
そしてこのような記述が...
どうやらtestify
のスマートな使い方を教えてくれているようです。
下記はたしかにそういうassertionを簡単に書けたらと思っていました。
testify/require allows to stop test execution when a test fails.
これはすてきなものを見つけたぞとREADMEを読んでいくと、Problem statementというセクションに次のような記述がありました。
testify is the most popular Golang testing framework in recent years. But it has a terrible ambiguous API in places, and the purpose of this linter is to protect you from annoying mistakes.
激しく同意です。
このtestifylint
がgolangci-lintのgo.modに含まれており、lint時に実行されていたようです。
チェック項目
このtestifylint
にはv1.0.2の時点で14個のチェック項目があります。
- bool-compare
- compares
- empty
- error-is-as
- error-nil
- expected-actual
- float-compare
- go-require
- len
- nil-compare
- require-error
- suite-dont-use-pkg
- suite-extra-assert-call
- suite-thelper
上述のrequire-error
の他に助かりそうなものとしては
compares
empty
expected-actual
などがあります。
このtestifylint
さんの力を借りて、単体テストを今後きれいにしていこうと思います!
まとめ
単体テストのファイルもlintの対象にしましょう。
lintによってはテストライブラリーの上手な使い方を教えてくれます。
単体テストはとても大事ですが、実際のコードを書いている時間と同じくらい、場合によってはそれ以上の時間を要することがよくあります。
それだけ時間をかけて書いたものなので、lintでさらに磨きをかけてPUSHしてやりましょう!
まあ、もうAIさんが色々いい感じに書いてくれる時代ではありますが...
We are hiring!
株式会社HRBrainでは、Power to the peopleを合言葉に多種多様な人事課題を解決するプロダクトを開発・運営しています。
日本の労働環境を良くしてやるぜ!みんなが元気に活躍できる社会にしてやるぜ!
そんな熱い気持ちを持った方、一緒に働きませんか?
皆様のご応募をお待ちしております!