3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

テストコードでのMysql2::Error: MySQL client is not connectedの対処法

Posted at

皆さんはテストコードは得意ですか?
正直、私はあまり得意とは言えないです。
さて、今回はテストコード中に起きたエラー(エラーというより事故?)についてやっていきたいと思います

1.今回起こった事象

Rspecを使いテストコードの実行を行なっている最中に起こりました。

Image from Gyazo

とても長いエラー文が出てきました。(下の方をバッサリとカットしてますが、めちゃくちゃ長かったです)
上まで遡り、確認したエラーは
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秒で実験すると・・・

Image from Gyazo

Image from Gyazo

通った!!!!
どの程度まで縮められるかが気になったので、o.o1秒で試してみると・・・。

Image from Gyazo

Image from Gyazo

駄目でした。
しかも前よりひどくなっている始末・・・。
間をとって0.05秒で試してみる。

Image from Gyazo

Image from Gyazo

通りました!
ただ、今回は少ないテスト数でしたが、この先テストする数が増えることを見越して0.1秒を採用しました。

6.感想

sleepを使うと一回の処理に少し時間がかかるものの、そこまで気にするレベルではない感じがしました。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?