rspecの並列実行の設定をしてみた。
gem parallel_tests導入
- Gemfileにgemを追加する
Gemfile
gem 'parallel_tests'
- bundle install
$ bundle install
DB関連設定
-
parallel_testsを使った並列テストでは、CPUのコア数だけ並列するので、コア数分、テスト用のデータベースを用意する必要がある。
- localの場合、macのcpuのコア数に依存
- dockerの場合、dockerのcpuのコア数の設定に依存
-
config/database.ymlのデータベース名の末尾にTEST_ENV_NUMBERという変数追加する必要がある
database.yml
test:
database: テスト用データベース名<%= ENV['TEST_ENV_NUMBER'] %>
- テスト用DBのセットアップコマンド時に以下の権限が必要なため、入れてなければ入れる必要
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER ON *.* TO 'テスト用DBユーザー名'@'%' WITH GRANT OPTION;
- dockerの場合、docker-compose up時にprovisioningを走らせることができるので、そこで設定してしまう方が良さそう
provisioning/sql.d/setup.sql
CREATE USER 'テスト用DBユーザー名'@'%' IDENTIFIED BY 'パスワード';
GRANT ALL PRIVILEGES ON テスト用データベース名.* TO 'テスト用DBユーザー名'@'%';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER ON *.* TO 'テスト用DBユーザー名'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
docker-compose.yml
mysql:
image: mysql:5.7
platform: linux/x86_64
container_name: hoge-mysql
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci
environment:
MYSQL_ROOT_PASSWORD: password
volumes:
- ./provisioning/sql.d:/docker-entrypoint-initdb.d ←ここで実行
- mysql_data:/var/lib/mysql
ports:
- 3306:3306
※volumeにデータベースの古い設定データが残っていると実行されないので、volumeを消してからbuildする。docker-compose down --rmi all -v
- テスト用DBのセットアップコマンド
# テスト用DBを並列化する分だけ作成する。CPUのコア数分だけ並列化される。
# DBのスキーマに変更があった場合はその度prepareしなおす必要
$ bundle exec rake parallel:create
$ bundle exec rake parallel:prepare
テスト実行
$ bundle exec rake parallel:spec
参考記事