Railsでマルチスレッド処理のテストを書く際の設定

Railsアプリケーションにおいて、マルチスレッド処理でレコード取得処理を行う処理を書くときに、Rspecの設定周りでいろいろと知ることができたのでメモ。

テスト環境は Rspec + FactoryGirl + DatabaseCleaner という感じ。

まず、テストの流れとして、
FactoryGirlなどからデータベースにデータが挿入される。これは一般的にTransactionで行われる。

そして、テストが終了するとTransactionはロールバックされてデータベースは元の状態に戻る。

しかし、マルチスレッドでレコード取得を行っていると、
テスト開始時にTransaction内でデータは挿入されるが、それぞれ別のスレッドからはTransaction内のデータを参照できないため、レコードの取得ができずに、テストは落ちることになる。

そこでrspecの設定でTransactionでのテストを無効にする。

これにより、挿入されたデータはトランザクションではなく、Truncationされる。
しかし、この処理はTransactionよりも重くテスト全体の実行時間に影響を与えることなった。
そこでdatabase_cleanerで、データ削除の設定を行う。

この設定では、マルチスレッドのテストにだけ、multithreadオプションをつけてテストを実行する。

このオプションのときはTransactionをおこなわないので、別のスレッドからでもデータを参照できる。

database_cleanerの設定が若干ややこしい感じだが、これで問題なくテストがぱすできるようになった。

Comments