simple-web-system technology

Webに関する技術をシンプルに扱うブログ

TestcontainersでMySQLの時刻を固定した話

背景

E2EテストでTestcontainers(docker)を使ってMySQLを動かしてたが、サーバー側でデータを作成したときに created_at の値が一定にならず、snapshotテストが毎回落ちる問題があった。

内部でNOW()CURRENT_TIMESTAMP を使った処理が日によって変わるのが原因。

libfaketimeがメジャーな解決策だが、dockerと相性があまりよくないのでもっとシンプルな解決策を探した。

github.com

解決策

次のコマンドを使ったら時刻を固定できた。

SET GLOBAL init_connect = 'SET TIMESTAMP = UNIX_TIMESTAMP("2025-08-04 12:00:00")';

これで NOW()CURRENT_TIMESTAMP が常に同じ値を返してくれるようになり、snapshotテストも安定。

注意点

  • SUPER権限を持つユーザーだと init_connect が効かない
  • テスト用ユーザーにはSUPER権限を付けないようにする必要がある

まとめ

MySQLでのE2Eテストで時間依存の差分に悩んでいるなら、この方法で時刻を固定するとテストが安定する。