背景
E2EテストでTestcontainers(docker)を使ってMySQLを動かしてたが、サーバー側でデータを作成したときに created_at の値が一定にならず、snapshotテストが毎回落ちる問題があった。
内部でNOW() や CURRENT_TIMESTAMP を使った処理が日によって変わるのが原因。
libfaketimeがメジャーな解決策だが、dockerと相性があまりよくないのでもっとシンプルな解決策を探した。
解決策
次のコマンドを使ったら時刻を固定できた。
SET GLOBAL init_connect = 'SET TIMESTAMP = UNIX_TIMESTAMP("2025-08-04 12:00:00")';
これで NOW() や CURRENT_TIMESTAMP が常に同じ値を返してくれるようになり、snapshotテストも安定。
注意点
- SUPER権限を持つユーザーだと
init_connectが効かない - テスト用ユーザーにはSUPER権限を付けないようにする必要がある
まとめ
MySQLでのE2Eテストで時間依存の差分に悩んでいるなら、この方法で時刻を固定するとテストが安定する。