テスト用データベースの失敗を調べる
テストが待ち続けたり、別のテストのデータが見えたりする場合は、ライフサイクルの修正が必要なことが多くあります。タイムアウトを延ばす前に、どの操作が失敗したかを確認してください。
| 症状 | 確認すること | 対処 |
|---|---|---|
snapshot 時の busy |
migration や seed の接続にトランザクションが残っている | 準備処理から戻る前に commit / rollback し、不要な接続を閉じる |
reset 時の busy |
テストがトランザクションを開いたままにしている | teardown 前に終了させる。開いたトランザクションがなければ pool を閉じる必要はない |
pool_timeout |
共有フォークも含めて枠が埋まっている | 不要なフォークを閉じる。一つの DB オブジェクトから両方の handle を取得できるなら二つ目の fork を作らない。その後で max_forks を検討する |
| アプリと検証でデータが違う | 別々の取得操作で handle を作った | Go は一つの fx.For(t)、Java は同じテンプレートとスコープのパラメータを使う |
| ORM が本番用や古い DB に接続する | 接続先の注入前にクライアントが作られた | Node はアプリの import 前に register を実行し、Python は選択された DSN から client fixture を作る |
| 共有する読み取りテストが実行順で失敗する | 共有テストが書き込んだ | fork または直列の reset モードに移す。マーカーや共有 helper は SQL の権限を強制しない |
withTestReset の実行が重なる |
包んだ二つのテスト本体がファイル用フォークを共有している | 同時書き込みには withFork を使い、URL ごとにクライアントを作る |
| Unix socket の起動が失敗する | 非対応ホスト、親ディレクトリの不在、長いパス | 既存の短いローカル SocketDir を選び、ホストの AF_UNIX stream 対応を確認する |
調査時はログを有効にします。Go 組み込みは Options.Log、Go 外部プロセスは Options.Log(io.Writer)、Python は log=True、Java は .log(true)、Node は log: true です。SQL セッションは pg_stat_activity と pg_locks でも確認できます。
テスト API はサーバーやフォーク、アプリの fixture はドライバのクライアントと pool を管理します。フォークを解放する前にクライアントを閉じてください。reset モードでは接続先が維持されるため、直列のテスト間で同じクライアントを使えます。複数サービスを組み合わせる場合は環境変数名を分け、クライアントの import 前にすべての接続先を書き出します。