[Rails] minitest-bisectの`--bisect`オプションをサポート: サーバープラグインの明示的なロード
Context: なぜこの変更が必要だったのか
Railsのテストスイートでminitest --bisectオプションを使用すると、invalid option: --serverというエラーが発生していました。これは、Minitest 6でminitest-bisect機能が本体に統合された際、すべてのプラグインがopt-in方式に変更されたためです。つまり、プラグインを使用するには明示的にロードする必要があるようになりました。
--bisectオプションは、テストの実行順序に依存する不安定なテスト(flaky tests)の原因を特定するための重要な機能です。この機能が動作しない状態では、順序依存のバグを効率的にデバッグできませんでした。
Technical Detail: 実装の詳細
この問題を解決するため、Minitestのserverプラグインを明示的にロードするコードが追加されました。
変更内容:
# Explicitly load minitest server plugin for --bisect option
Minitest.load :server if Minitest.respond_to? :load
変更のポイント
プラグインの明示的ロード:
Minitest.load :serverを呼び出すことで、bisect機能に必要なserverプラグインを有効化します。後方互換性の維持:
Minitest.respond_to? :loadでloadメソッドの存在を確認しているため、古いバージョンのMinitestでも問題なく動作します。既存のrailsプラグインと同様の扱い: すでに存在していた
Minitest.load :railsと同じパターンで実装されています。
bisect機能の使用例
この変更により、以下のように--bisectオプションが正常に動作するようになりました:
$ MTB_VERBOSE=2 ARCONN=postgresql bundle exec minitest \
"test/cases/active_record_test.rb" \
"test/cases/adapter_test.rb" \
--bisect --seed 7149
reproducing...Using postgresql
Run options: --seed 7149 --server 21091
# Running:
...
Finished in 70.669433s, 143.3010 runs/s, 490.0846 assertions/s.
10127 runs, 34634 assertions, 0 failures, 0 errors, 24 skips
技術的背景
Minitest 6のプラグインシステムは、明示的なロードを要求するようになりました。これは、不要な機能を自動ロードしないことでメモリ使用量と起動時間を最適化するための設計変更です。bisect機能は内部的にクライアント・サーバーアーキテクチャを使用してテストを分割実行するため、serverプラグインが必要になります。
この変更は小さいですが、Railsの開発者がテストの不安定性をデバッグする際の生産性に直接影響する重要な修正です。