はじめに
先日、参加出来なかったGENBA #1 〜RubyとRails開発の現場〜 の資料が公開されていて、その中でikuma-t
さんが紹介されていた Railsアプリをコスパよく読むための環境整備
の中で実装されていた「テストをシュッと実行する」を拝見して自分でも取り入れたいと思い、今回実装しました。
Monorepo(モノレポ)で実装
ほぼ上記の資料通りの実装ですが、自分の開発環境が Monorepo なので、ディレクトリを意識して現状にあった実装に少しだけ修正しています。自分と同じような構成で実装している方、しようとしている方の参考に少しでもなれば幸いです。
こちらのPRが今回実装した差分になります
Monorepo(モノレポ)って何?
という方向けに、簡単に説明すると1つのリポジトリにサービスを構成する全てのコードを管理している管理手法です。自分のリポジトリですがREADMEに簡単にディレクトリのイメージを記載していますので良ければ参考にしてください。
実装の概要
- プロジェクトのrootディレクトリ配下に
.vscode/tasks.json
を作成 - 実装したコードが下記になります
// tasks.json { "version": "2.0.0", "tasks": [ { "label": "Run RSpec current file with line", "type": "shell", // localとコンテ内のディレクトリ構成が違うため、sedコマンドで不要なディレクトリを削除 "command": "docker compose -f docker-compose.yml exec -it app /bin/bash -c \"bundle exec rspec -fd -ff ./$(echo ${relativeFile} | sed 's|apps/backend/||'):${input:LineNumber}\"", "group": "test", "problemMatcher":[ { "owner": "ruby", "fileLocation": [ "relative", "${workspaceFolder}" ], "pattern": { "regexp": "^rspec\\s+(.*):(\\d+)\\s+#\\s+(.*)$", "file": 1, "line": 2, "message": 3 } } ] } ], "inputs": [ { "id": "LineNumber", "type": "promptString", "description": "Enter the line number to run RSpec on:" } ] }
自分の環境に合わせて実装したところ
こちらがlocal環境とコンテナ内のディレクトリを合わせた箇所になります。
// localとコンテ内のディレクトリ構成が違うため、sedコマンドで不要なディレクトリを削除
"command": "docker compose -f docker-compose.yml exec -it app /bin/bash -c \"bundle exec rspec -fd -ff ./$(echo ${relativeFile} | sed 's|apps/backend/||'):${input:LineNumber}\"",
長いので、それぞれ分けて解説
コンテナ内でRSpecを実行するので、docker-compose.yml
ファイルを指定してDocker Composeコマンドを実行しています。
docker compose -f docker-compose.yml
-it
オプションでインタラクティブモードで実行してターミナル入力を可能にしています。/bin/bash -c
で、Bashシェルを使用して、引き続き指定されたコマンドを実行させるようにしています。
exec -it app /bin/bash -c
-fd
、-ff
がRSpecのフォーマットオプションになります。
-
-fd
(format documentation) はテストの説明を詳細に表示 -
-ff
(format failures) は失敗したテストの詳細を表示
bundle exec rspec -fd -ff
-
${relativeFile}
はテストファイルのlocal環境のパスになりますが、コンテナ内のディレクトリにapps/backend/
は存在しないので、sed
コマンドでsed 's|apps/backend/||'
として、コードで不要な文字列を空にして渡しています。 -
:${input:LineNumber}
はRSpecの行番号指定をするためのもので、VSCodeからの入力を受け取って行番号を指定して実行することができます。
./$(echo ${relativeFile} | sed 's|apps/backend/||'):${input:LineNumber}\"
実行手順
ちょっと雑ではありますが、Wikiに実行手順をまとめているのでそちらをそのまま、記載します。
使い方
テスト実装しているファイルがあったという前提の説明です
-
実装中のテストファイルをVSCodeで開いたままにして下さい(スクショは例として
user_spec.rb
を開いています) -
VSCodeで、
cmd
+shift
+P
を実行 -
Enter
-
"Run RSpec current file with line"
のタスクを選択または検索(ピン留めしておいてもいいかもしれません)
-
Enter
-
Enter
まとめ
実行のイメージが湧いたと思いますので、この辺りでおしまいにしたいと思います。この記事が誰かの何かの役に立てれば幸いです。
私のこと
気が向いたらnoteにブログも書いているので、良ければ見てやって下さい。
最後までお読みいただきまして、どうもありがとうございました。