エンジニアのkuroseです。2020/10/10に仙台で開催されましたGo Conference'20 in Autumn SENDAIでスポンサー枠でLT登壇してきました。
www.slideshare.net
概要と経緯
私は半年前の入社をきっかけにして本格的にGoに触りはじめました。
例えば下記のような資料で勉強していく中で、「実例としてGoの標準パッケージのコードが参考になる」という説明をよく見かけました。そのため、何か実装例を見たい時には標準パッケージのコードを参考にするようになりました。
社内のETL処理で利用している内製のパイプラインライブラリのテスト作成を担当した際にも、Goの標準パッケージのテストコードを参考にしました。今回の登壇内容は、その過程で学んだ具体的な手法から、下記に示す3点を選んでお話ししたものになります。
内容
1. Exampleテストの配置方法
テスト作成においては、関数レベルの挙動を確認するための単体テストだけでなく、それらを組み合わせて動かしたときの挙動も確認するためExampleテストも併せて用意しました。
この時、Goのリポジトリのディレクトリ構成を考えるにあたって、下記のリポジトリを参考にしていました。そして、ここに書いてあるexamples
ディレクトリに倣ってExampleテストをこのディレクトリに配置していました。
ところが実例を見ていくと、このexamples
ディレクトリはExampleテストとは別の趣旨になっていて、そのままmain
で実行できる例を置く場所だということに後に気づきました。
標準パッケージでは例えば下記のように、パッケージのコードと同じディレクトリにexample_test.go
というファイル名で置いておくのが通例ということが分かりました。
2. プロセス自体が終了するテストの方法
担当したパイプラインライブラリにおいても、パイプラインの途中で指定の条件が成立したときにそのパイプラインの処理を終了する機能が実装されています。
このようにプロセス自体を終了させる関数をそのままテストコードの中で実行するとテスト自体もそこでとまってしまいます。
標準パッケージでは、このような関数を、テストの中で呼んだexec.Commandの中で呼びなおす方法をとっています。 この時、所定の環境変数が設定されていない場合には、そのテスト関数が実行されないようにしています。 この方法はos/execやos/pipeなどのパッケージで利用されています。
3. テストで循環参照を避ける方法
テストコードの中で、テスト対象あるいはインポートしているパッケージの間に循環参照が発生すると、コンパイルでエラーが発生するためテストを実行できません。
そこで、テスト対象のパッケージ名に_testをつけて別のパッケージとし、 テスト対象のパッケージをドットインポートすることで、この循環参照を回避している例がfmtやioパッケージなどで見られました。 ドットインポートはあまりやらない方がよいようなのですが、このように目的や範囲が限定されている場合には有効なやり方だといえるようです。
そのほか参考にした内容
今回の登壇では触れませんでしたが、他にも例えば次の内容を参考にしていました。
テスト一般の話
Goのテストでよく使われる手法について説明している講演です。 www.youtube.com
こちらの講演を基にした記事も公開されています。 about.sourcegraph.com
より実例に即してテストの手法を説明している講演です。 www.youtube.com
DSLを避ける
Goでテストを書くにあたって、使うライブラリをどうしようか悩んでいました。初めはassert
相当のことをやるためにいろいろ調べていましたが、下記を読んで別のアプローチをとることにしました。
そして、下記などを読む中で標準のtesting
だけを使うことにしていました。その時の判断は正解だったと思っています。初心者目線になってしまいますが、テストを書くために必要な知識が最低限に抑えられ、のちの振り返りもしやすくなりました。
感想
内容について
今回登壇にあたっては、説明ができるレベルに理解を深めるために様々な資料をあたったり考えたりしながら内容の検討をしました。その過程で、標準パッケージのソースコードのおおまかな構成や裏の仕組みを理解することができました。
今回はテストが題材でしたが、他のケースにおいても標準パッケージのコードを読んでみるという習慣は、今後も続けていきたいと思います。
登壇について
私としては初の登壇経験でしたが、当日は特にトラブルなく発表を終えることができました。運営スタッフの皆さんありがとうございました!
事情により私は今回オンラインでの参加になりましたが、次はオフラインで参加者の方とお会いできればと思っております。
さいごに
今回の登壇ではGo初心者目線の内容でしたが、弊社TVer TechnologiesにはたくさんのGoの玄人が在籍しています。Goに興味のある方も必ずしもそうでない方も、もし弊社にご興味がありましたら、下記よりご連絡いただけるとうれしいです!