コンテンツにスキップ

テスト用データベースの失敗を調べる

テストが待ち続けたり、別のテストのデータが見えたりする場合は、ライフサイクルの修正が必要なことが多くあります。タイムアウトを延ばす前に、どの操作が失敗したかを確認してください。

症状 確認すること 対処
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 前にすべての接続先を書き出します。