goでapiのテストを書く
Rubyのようにtest用のdbを作成するのが良いのかなとか考えてる
これ参考になるかな?
mockDBを使ってtestを書く方法もあるらしい
これもみてみる
個人的にはmockを作るよりもtest用のdbを作りたい
少し話がずれるかもしれないけど、gormでdb接続するときにdsnでdbnameを指定すると接続できないのどうにかしたい
docker-compose.ymlのdbのenvironmentにPOSTGRES_DB=
を追加することで解決
goでもmigrateできるようになるパッケージはあるのか
こっちのほうがrails ライクにできそう
これとか割とまさに探していたもの感がある
docker内のpostgresの中身を確認する方法
-
docker-compose exec db bash
でコンテナの中に入る -
psql -U <USER_NAME> <DB_NAME>
でデータベースの中に入る -
# \d
でテーブルを確認できる
dockerのコンテナで複数のdbを作成する方法
scriptを実行する方法
scriptを実行する方法scriptを実行する方法dbを作成したら次はdbをリセットする関数を作って、いざテストへ!
って感じにしたい
GORMにはLaravelにあるような、DBのリフレッシュが用意されていません。
この事実を受け入れた上でtestを書かないと行けないのか。。。
model追加するたびにコードを変えないと行けない点が気に入らないが、とりあえず以下を参考に作った
なんかrailsライクに開発していくっていう方向性がそもそも違う気がしてきた
今開発していて違和感しかない
手が動かないときはだいたい嫌な予感があって、その予感はだいたい当たる or そもそも自分の考え方が間違えている
一回整理すると
自分は「rest apiを作りきる」っていうのが絶対の目標である
どうやって作るかで今自分は迷っていて、その指針としてrailsのディレクトリ構成を参考にしようと考えている
そもそも今回で正解のディレクトリ構成を作り切るのは不可能
そして言語が違う性質上railsと完璧に同じようにはできない
あと、自分がここまでやってみた感想としてはgoのrest apiの記事は思ったよりも少なく、フレームワークも色々あるから自分に合った記事を見つけるのがすごく難しいということ
方針としてはrailsを参考に多少コードで気に入らないことが合っても自分の開発の理想をgoで実現できるように頑張る
理想を実現できていればコードのリファクタは大したことない
設計を返るほうがはるかに大変
factory_botを使用して、テスト用のデータを作成したい
これも良さそうなライブラリはなさそうなので、自分で自作するのも考慮にいれないとかも
具体的な要件としては
- create(model名), create_list(model名, 数字)で任意のテストデータが作れる
- テストデータの値を自由に書き換えできる
- ユニークな値を作成できる
結構めんどくさそうだけど、、、
ライブラリで良い感じのないのかな?
普通にモックデータ手書きでそのたびに作ろうかな
やっぱりgoではfactoryを使っている例はあまり見られなそう
このリポジトリも参考になりそう
外部キーが原因でtruncateできなかったので、無理やりテーブルを削除する方法
ちなみにテストはdockerのコンテナ内に入らないとできないので注意
testの時にenvファイルを読み込む処理をどこに書けば良いのか問題
しかし、同じ階層(package)内に入れないとpublic function以外参照できないので同じ階層に入れている様でした。
これが理由でgoでは同じ階層testファイルを作ってたのか
結局最後は公式を使った
メールこれで作るのもありっぽいな
template.ParseFilesで指定するファイルパスがmain.goとテスト環境で違うせいでテストが通らない
やっとできた。。。!!
TestMainを使用したテストの共通処理
やっとのことでテスト環境ができた
めちゃくちゃ時間かかったな。。。
時間かかった理由としてはやりたいことに対するやり方を調べるのに時間がかかっている
ってことだな
公式のドキュメント呼んで、検索文で英語で良い感じのを作ることができたらあとは記事をじっくり呼んで、分からないところは調べるとかが良さそう
色々な記事見てみると情報過多になるし、目的を見失いがちな気がしている
golangでbefore each, after eachを実現したい]
具体的にはテストごとにdbをリセットしたいのだが、今の所テストの関数ごとにdbリセットの関数を書くというやり方しか見つけられていない
また、テストが失敗したときでもdbリセットの処理は動くようにしたい
結局関数ごとにdbリセットをするっていうので落ち着いた
その時に遅延関数のdeferを使用してる
assert.MatchRegex(t, w.Body.String(), account.Email)
この書き方良いかも