学園校歌
自動テストを行う際は~更新日時に気をつけよ~
更新日時は過去にせよ~現在日時とするなかれ~
現在日時にするならば~データ作ったら少し待て~
更新前後のテストデータが~別となるデータを持て~
あぁわれら~われらの学園~
自動テストの更新日時を現在日時にするな学園~
ここから真面目な話
先に結論
MySQLの仕様として「更新前後の値が全く同じデータは更新したものとして扱われない」というのがあるため、更新日時が現在だったり実際のデータをコピーしたりして、テスト前後のデータが同じになってしまう状況は作らないようにすべきである
いきさつ
PHP(Laravel)で作成していたプロジェクトのテストがべらぼうに多かったため、自動テストで対応することにした
なんとか全て作成し、いざテストするぞというタイミングで、特定のテストだけ失敗するという結果になった
それ以外の類似テストは全て合格だし、何ならデバッグモードで実施しても問題なかった。だが、デバッグモードでのテストと自動テストで結果が変わってしまっては自動テストの信頼性が低くなってしまう
さすがにこのエラーのためだけに4000件以上のテストを手動でやるのは嫌だぞ……
同じ苦しみを持つ人はいなかった
クエリビルダやPHP、Laravelで調べても同様のエラーで苦しんでいる人はネット上にはいなかった
絶望しつつMySQLで色々調べた結果、結論のような仕様を見つけたわけである
解決
自動テストデータ作成と実施の時間が非常に短く、更新されても更新日時が変わらなかったため、失敗していたということが判明した。デバッグモードでは成功していた理由も、プロセスごとに確認していたため、その分更新日時がずれたのだろう
まとめ
自動テストデータを作成する際は更新日時を過去日にしたり、実際のデータでは設定されないような値にしたりして、更新前後で同じようなデータとなる状態にはならないようにしよう
最後に
参考資料について記載したかったのですが、対応したのが2年以上前のことだったので、忘れてしまいました
思い出したら追記していきます