Hatena-Textbook 2018 学習日記(3) - $shibayu36->blog;の続き。
https://github.com/shibayu36/go-Intern-Diary/pull/2 で、ダイアリー作成とダイアリー一覧まで作った。記事作成系は出来てないけど、とりあえずここまでやれば次のGraphQLやReactあたりの学習ができるはず。
次のようなことが学習できてよかった。
- jmoiron/sqlx の使い方
- goのテストのやり方いろいろ
- monkey.Patchによるメソッド置き換え
jmoiron/sqlx の使い方
最初はgodocの https://godoc.org/github.com/jmoiron/sqlx の方を読んでいたら全く分からなかったのだが、途中でgithubのREADME.mdを見れば良いことが分かってようやく使い方がわかった感じ。より詳しい使い方を知るには http://jmoiron.github.io/sqlx/ や https://github.com/jmoiron/sqlx/blob/master/sqlx_test.go を見ると良い。
ちなみにsqlxのコードを軽く読んでて面白いなーと思ったのは https://github.com/jmoiron/sqlx/blob/38398a30ed8516ffda617a04c822de09df8a3ec5/sqlx.go#L876..L985 あたり。reflexで代入先の変数の型を見ながら、SELECTの結果をいい感じに代入してくれる。すごい。
goのテストのやり方いろいろ
次の資料がいろいろ参考になった。
- Go advanced testing tips & tricks | by Povilas Versockas | Medium
- テストのTipsをいくつか教えてくれる
- GoのAPIのテストにおける共通処理. GoのAPIを書くとき、参考になるユニットテストの話は非常によく見ます。Tabl… | by timakin | Medium
- 時刻固定やモックの方法を教えてくれる
- GoのAPI開発現場におけるユニットテストTips - BASEプロダクトチームブログ
- テストに便利に使える外部ライブラリとか
- Big Sky :: golang 1.5 の internal パッケージの使い方。
- internalパッケージについて。ライブラリを作っていて、テストのユーティリティ関数を作りたい、しかしライブラリ外には公開したくないというときに便利に使える
- テストの共通処理はtestutilパッケージにまとめることが多そう
一つ分からなかったことがある。実装したドメインロジックを使ってテストデータ作成用テストユーティリティを作るときに、どこに置けばよいかが分からない。
例えばテスト用にCreateTestUserというメソッドを作るとして、このメソッドはservice.CreateNewUserという本番でも使うメソッドを使って実装したい。この時
- testutil/testutil.goの中にCreateTestUserを置くと、service/service_test.goみたいなところでCreateTestUserを使ったときにimport cycle not allowedのエラーが出てしまう
- service/service_test.goにCreateTestUserを置くと、service package以外から参照できない。例えばweb/web_test.goからCreateTestUserが使えない
- service/testutil.goみたいなところに置くと、この関数をテスト以外でも使えてしまって事故りそう
ということで置き場所が分からない。testing - import cycle in golang with test packages - Stack Overflowのコメント欄でも困っている様子だが、答えが出ていない。
どうすれば良いかご意見募集。
monkey.Patchによるメソッド置き換え
bou.ke/monkey.Patchを使うと、メソッドを置き換えられるようだ。いろいろ使い道ありそう。例えば https://github.com/tkuchiki/faketime/blob/master/faketime.go ではテスト時に時刻をfakeするためmonkey.Patchを使っている。