相対時刻フィクスチャは日付境界で別レコードと衝突しテストをフレーキーにする
テストで now - 1h のような現在時刻基準の相対時刻フィクスチャを使い、別のフィクスチャを now - 24h のように丸1日前に置くと、検索条件が「カレンダー日付」単位のとき(例: WHERE date(created_at) = '2026-06-13')に両者が同じ日へ重なり、特定の実行時刻でだけテストが落ちる。
発生条件: now - 1h は、現在時刻が日付が変わった直後の1時間以内(00:00〜00:59)だと前日に回り込む。一方 now - 24h も前日。両方が同じカレンダー日になるため、「1件ヒットするはず」のアサーションが2件ヒットで失敗する。深夜帯に走る CI で非決定的に再現するのが厄介。
原因の型: 「相対時刻の差(時間単位)」と「検索の粒度(日単位)」が噛み合っていない。時間単位ではフィクスチャを区別できているつもりでも、日付へ丸めた瞬間に区別が消える。
対策: 日付単位で照合するテストでは、フィクスチャの時刻差を検索粒度より十分大きく取り、実行時刻に関わらず別の日に落ちるよう隔離する。例えば「直近データ」を now - 1h、「対象日データ」を now - 48h(丸2日前)にすれば、-1h と -48h は時刻に関係なく必ず別カレンダー日になる。より堅牢にするなら現在時刻に依存しない固定日付を使う。
気づき方・検証: 「日付で絞り込むテストが特定時間帯だけ落ちる/件数が1多い」場合にこのパターンを疑う。フィクスチャの時刻を 00:30 など境界付近に固定して回すと再現でき、修正後も同条件で1件に収まることを確認する。
適用範囲: カレンダー日・週・月など、連続時刻を粗い粒度へ丸めて照合するテスト全般(DB の日付検索、集計のバケット境界、週またぎ判定など)。