Okarin note

頭の整理もかねて色々と書いていきます

TypeORMを使ったテストでケースの数が増えると失敗する

詰まったのでメモです。

概要

テストケースが5件までは通過するが、6件を超えるとJestのタイムアウトでテストが失敗する。(タイムアウトは5秒で設定している
単体でテストを実行した時は成功し、複数同時に実行時は失敗する。
失敗位置を入れ替えた場合でも必ず6件目で失敗する

原因

TypeORMのQueryRunnerの解放漏れ。
テストのセットアップでqueryRunnerを使っていたが、コネクションの解放をしておらずコネクションが残り続けていた。

queryRunner.query()を実行すると、下みたいな感じで処理が進行しますが、
プールされているコネクションがリリースされるまで待機するのでコネクションが確立できずに失敗する

queryRunner.query() [TypeORM]
-> this.connect() [TypeORM]
-> this.driver.obtainMasterConnection() [TypeORM]
-> this.pool.getConnection() [mysqljs]

対応方法

公式のドキュメントに記載がありましたが、queryRunnerを使う際は、
release()を使ってコネクションを解放しましょう。

typeorm.io f:id:SazanamiN:20211125002005p:plain

別の方法

テーブルのエンティティクラスを作っているならgetRepository()を使ってしまえばクエリの解放も自動で行ってくれるのでこちらを使った方が、
気にしなくて良くなるのでよいかもしれない。