Open39

goでapiのテストを書く

nozominozomi

少し話がずれるかもしれないけど、gormでdb接続するときにdsnでdbnameを指定すると接続できないのどうにかしたい

nozominozomi

docker-compose.ymlのdbのenvironmentにPOSTGRES_DB=を追加することで解決

nozominozomi

https://qiita.com/ngplus6655/items/084a38be7da4c706a46e

これとか割とまさに探していたもの感がある

nozominozomi

環境変数によってdbの接続先を変えたいっていうのはあるけど、それってどうやってやるんだ?
gorm, ginにはrailsでいうrails db:createの機能はどうやってつくれば良いんだろう?

nozominozomi

docker内のpostgresの中身を確認する方法

  1. docker-compose exec db bashでコンテナの中に入る
  2. psql -U <USER_NAME> <DB_NAME>でデータベースの中に入る
  3. # \dでテーブルを確認できる
nozominozomi

dockerのコンテナで複数のdbを作成する方法

https://dev.to/bgord/multiple-postgres-databases-in-a-single-docker-container-417l
scriptを実行する方法

nozominozomi

なんか手が動かない
正解か自分の中で分からないっていうのが理由だと思う
あと30分くらい探してみて、良い方法が見つからなかったら手を動かしながら考えるっていう方法にシフトしよう

nozominozomi

dockertestっていうgoのパッケージを使うのも有りな気はする

nozominozomi

scriptを実行する方法scriptを実行する方法dbを作成したら次はdbをリセットする関数を作って、いざテストへ!
って感じにしたい

nozominozomi

なんかrailsライクに開発していくっていう方向性がそもそも違う気がしてきた
今開発していて違和感しかない
手が動かないときはだいたい嫌な予感があって、その予感はだいたい当たる or そもそも自分の考え方が間違えている

nozominozomi

一回整理すると
自分は「rest apiを作りきる」っていうのが絶対の目標である
どうやって作るかで今自分は迷っていて、その指針としてrailsのディレクトリ構成を参考にしようと考えている

そもそも今回で正解のディレクトリ構成を作り切るのは不可能

そして言語が違う性質上railsと完璧に同じようにはできない

あと、自分がここまでやってみた感想としてはgoのrest apiの記事は思ったよりも少なく、フレームワークも色々あるから自分に合った記事を見つけるのがすごく難しいということ

nozominozomi

方針としてはrailsを参考に多少コードで気に入らないことが合っても自分の開発の理想をgoで実現できるように頑張る

理想を実現できていればコードのリファクタは大したことない
設計を返るほうがはるかに大変

nozominozomi

factory_botを使用して、テスト用のデータを作成したい

これも良さそうなライブラリはなさそうなので、自分で自作するのも考慮にいれないとかも

具体的な要件としては

  1. create(model名), create_list(model名, 数字)で任意のテストデータが作れる
  2. テストデータの値を自由に書き換えできる
  3. ユニークな値を作成できる

結構めんどくさそうだけど、、、
ライブラリで良い感じのないのかな?

nozominozomi

普通にモックデータ手書きでそのたびに作ろうかな

nozominozomi

ちなみにテストはdockerのコンテナ内に入らないとできないので注意

nozominozomi

testの時にenvファイルを読み込む処理をどこに書けば良いのか問題

nozominozomi

やっとのことでテスト環境ができた
めちゃくちゃ時間かかったな。。。

時間かかった理由としてはやりたいことに対するやり方を調べるのに時間がかかっている
ってことだな

公式のドキュメント呼んで、検索文で英語で良い感じのを作ることができたらあとは記事をじっくり呼んで、分からないところは調べるとかが良さそう
色々な記事見てみると情報過多になるし、目的を見失いがちな気がしている

nozominozomi

golangでbefore each, after eachを実現したい]

具体的にはテストごとにdbをリセットしたいのだが、今の所テストの関数ごとにdbリセットの関数を書くというやり方しか見つけられていない

また、テストが失敗したときでもdbリセットの処理は動くようにしたい

nozominozomi

assert.MatchRegex(t, w.Body.String(), account.Email)
この書き方良いかも