Ruby Test ExplorerでRailsのMinitestを走らせた時にbreakpointが効かない

# 背景

VSCodeの自動テストを取り扱う拡張機能に [Test Explorer UI](https://marketplace.visualstudio.com/items?itemName=hbenl.vscode-test-explorer)がある。
この拡張機能のruby用のadapterが[Ruby Test Explorer](https://marketplace.visualstudio.com/items?itemName=connorshea.vscode-ruby-test-adapter)で、rspecとminitestを扱える。

また、Rubyを対象にBreakpointやstep実行が使えるようになる[Ruby](https://marketplace.visualstudio.com/items?itemName=rebornix.Ruby)という拡張機能もある。
こちらのバックエンドは`ruby-debug-ide`, `debase`というgemで実現されている。


Ruby Test Explorerは、debug iconの駆動の際に、拡張機能としての"Ruby"を使う。

![Ruby with VSCode.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40474/4502ffdb-7e2c-e395-9a90-9615b993500f.png)

だいたいこんなイメージじゃないかという予想図

# 問題

Railsが自動生成するminitestに対してTest Explorer UIのビューからテストを走らせた時に、Breakpointが効かない。
もう少し細かく言うと、テストファイルの(main)コンテキストではbreakpointが効くが、テストブロックの中では効かない。

![VSCode Breakpoint.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40474/d2ba35f7-33c7-4efb-8175-b5969cabb8b5.png)


# 原因？

rails newした時のminitestは、デフォルトで並列テストを行なうようになっている。

```test/test_helper.rb
ENV['RAILS_ENV'] ||= 'test'
require_relative '../config/environment'
require 'rails/test_help'

class ActiveSupport::TestCase
  # Run tests in parallel with specified workers
  parallelize(workers: :number_of_processors) # <= ここ！！

  # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
  fixtures :all

  # Add more helper methods to be used by all tests here...
end
```

[Rails Guide](https://railsguides.jp/testing.html#%E4%B8%A6%E5%88%97%E3%83%86%E3%82%B9%E3%83%88) によれば、これはDRbで実現されており、異なるRubyVMのインスタンス上で実行されるという事のようだ。
前図の理解が正しいならば、異なるRubyVMになる = ruby-debug-ide がdebaseを設定していないVMになる、ということで、breakpointが効かない。

というか、コントローラーには数件のテストがあるはずなのに、
Ruby Test Explorerのログ上は、全0件で成功0件…といったような情報が返ってしまっているように見える。

# 試行錯誤

可能なら「Test Explorerからの通常実行のときはparallelizeが効き、デバッグ実行のときはシングルで動く」ようにしたい。
が、結論から言うと難しかった。

## 環境変数で…

たとえば、与えるコマンドを指定する設定があるので、環境変数で切り替えられるかと思ったが…

```rb
  parallelize(workers: :number_of_processors) unless ENV['TEST_SERIAL'].present?
```
```
{
  "rubyTestExplorer.minitestCommand": "TEST_SERIAL=1 ./bin/rake"
}
```

これは通常実行の時のコマンドを指定するもので、
デバッグアイコンを実行すると、結果はこうなってしまう。

```
[2020-11-06 17:34:09.425] [INFO] Debugging test(s) ["controllers"] of /.................
[2020-11-06 17:34:09.425] [INFO] Running Ruby tests ["controllers"]
[2020-11-06 17:34:09.425] [INFO] Starting the debug session
[2020-11-06 17:34:09.426] [INFO] Running test file: /............../test/controllers/posts_controller_test.rb
[2020-11-06 17:34:09.426] [INFO] Running command: rdebug-ide --host 127.0.0.1 --port 1234 -- $EXT_DIR/debug_minitest.rb 'test/controllers/posts_controller_test.rb'
...
```
残念ながら、Ruby Test Explorerはdebugのときのコマンドはカスタマイズできない。

## processがダメならthreadで

parallelize(workers: :number_of_processors, with: :threads)

Threadなら同じRubyVMで動くはず…と思ったが、どうやらダメ。

# 暫定的な対処

結局、並列実行を完全に捨ててしまえば解決はする。

```test/test_helper.rb
ENV['RAILS_ENV'] ||= 'test'
require_relative '../config/environment'
require 'rails/test_help'

class ActiveSupport::TestCase
  # Run tests in parallel with specified workers
  # parallelize(workers: :number_of_processors) # <= comment out or delete this line.

  # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
  fixtures :all

  # Add more helper methods to be used by all tests here...
end
```