はじめに
Goのテストを書くときにテストデータの挙動でかなり時間を使ってしまったのでまとめます
問題
テストデータをCreateUserで毎回同じユーザーを作成するようにしているのだが、なぜかメールアドレスのバリデーションエラーが発生してテストが失敗してしまう。
そして成功するときもあれば失敗するときもあるので挙動がよくわからなかったです
ユーザーは作成後(テスト終わり)に削除をしていました
2022/09/05 08:07:38 /go/src/models/db_test_setting.go:50 Error 1062: Duplicate entry 'test@sample.jp' for key 'users.email'
解決方法
Goのテストは並列で実行されるためユーザー作成のタイミングが被ることが起こり得ました
そしてそのタイミングになぜテストが失敗になるのかを調べたところ、インサートに失敗した際に以下のようなハンドリングをしていました
user.go
if err != nil {
log.Fatalln(err)
}
log.fatalln
はプログラムを強制で終了させてしまうのでテストが評価される前に失敗になってしまっていた
ユーザー作成で重複してもエラーハンドリングをすればうまくいくはずだが、これが原因だった
user.go
if err != nil {
log.Printf(err)
}
にしてログを表示するだけにしてテストを通すようにした
おわりに
エラーハンドリングで無意識に使っていましたが、ちゃんと使いどころを考えないと沼ってしまうことを学びました
参考