皆さんはテストコードは得意ですか?
正直、私はあまり得意とは言えないです。
さて、今回はテストコード中に起きたエラー(エラーというより事故?)についてやっていきたいと思います
1.今回起こった事象
Rspecを使いテストコードの実行を行なっている最中に起こりました。
とても長いエラー文が出てきました。(下の方をバッサリとカットしてますが、めちゃくちゃ長かったです)
上まで遡り、確認したエラーは
Mysql2::Error: MySQL client is not connected
という内容でした。
2.仮説
- まず考えたこと
1:なんでこんなところで引っかかるんだ?
エラーが出ている場所から推測すると、エラーが出ているその前の部分からも出てないとおかしいはず。
postal_codeが空だと購入できないのに、他の場所はみんなエラーになっている、という部分からそう推測できました。
2:Mysql2::Error: MySQL client is not connectedの意味
そのまま英訳するとMySQLのクライアントが接続されていない
という意味
すなわち、何かが原因で接続が切れてしまったなどが考えられます。
これはRspec側のエラーの可能性があるかもしれない。
と思い調べ始めました。
3.原因
max_allowed_packetの値が足りないとこのエラーが出るようです。
max_allowed_packetとは、
MySQLのクライアントとサーバー間の通信のパケットサイズの最大値の設定で、
1回のリクエストでここの大きさより大きいリクエストは送り込無ことができない。
というもののようです。
4.対処法
1:max_allowed_packetの最大値を変更する
これにより解決することが多いようです。
ただ、実際どうなのかはわかりませんが、PCに負荷がかかりそうで怖かったので違う方法を探しました。
2:sleepを記述し、処理の間に休憩を挟んであげる
sleep 指定した秒数
と事前に記述しておくことで、
インスタンス変数を生成するたびに指定した秒数
、処理を停止するというもの。
この方法を試してみて、一回のテストが長引くようならmax_allowed_packetの最大値をいじることを決めて実践。
5.実践
まず試しに0.1秒で実験すると・・・
通った!!!!
どの程度まで縮められるかが気になったので、o.o1秒で試してみると・・・。
駄目でした。
しかも前よりひどくなっている始末・・・。
間をとって0.05秒で試してみる。
通りました!
ただ、今回は少ないテスト数でしたが、この先テストする数が増えることを見越して0.1秒を採用しました。
6.感想
sleepを使うと一回の処理に少し時間がかかるものの、そこまで気にするレベルではない感じがしました。