MySQL系アダプターのテスト実行時にAbstractMySQLのテストも自動収集するよう修正
MySQL系アダプター(mysql2、trilogy)のテスト実行時に、abstract_mysql_adapter 配下のテストが自動的に収集されない問題が修正されました。これにより、共通の抽象層に対するテストが漏れなく実行されるようになります。
背景
Rails の ActiveRecord は、MySQL系データベースに対して AbstractMysqlAdapter という共通の抽象アダプターを持ちます。Mysql2Adapter と TrilogyAdapter はいずれもこの抽象アダプターを継承しており、test/cases/adapters/abstract_mysql_adapter/ 配下にはその共通ロジックのテストが格納されています。
しかし、mysql2 や trilogy を対象にテストを実行する際、abstract_mysql_adapter 配下のテストは自動収集の対象外でした。各アダプター固有のテスト(test/cases/adapters/mysql2/ など)は収集されるものの、継承元の抽象クラスのテストは手動でパターン指定しない限り実行されていませんでした。
技術的な変更
activerecord/test/support/tools.rb の list_tests メソッドが修正され、mysql2 または trilogy を対象にした場合に abstract_mysql_adapter 配下のテストも自動収集されるようになりました。
変更前:
def list_tests(patterns)
tests = super
tests.concat FileList["test/cases/adapters/#{adapter_name}/**/*_test.rb"] if patterns.empty?
tests
end
変更後:
def list_tests(patterns)
tests = super
if patterns.empty?
tests.concat FileList["test/cases/adapters/#{adapter_name}/**/*_test.rb"]
case adapter_name
when "mysql2", "trilogy"
tests.concat(FileList["test/cases/adapters/abstract_mysql_adapter/**/*_test.rb"])
end
end
end
case 文で mysql2 と trilogy を明示的に列挙し、それぞれに対して abstract_mysql_adapter 配下のテストを追加収集するロジックが加えられています。patterns が空でない場合は if ブロックがスキップされ、tests 配列は変更されずにメソッドの処理を終えます。つまり、この変更の影響はテストパターンを明示しない通常の実行時に限定されます。
設計判断
この変更では、case 文を用いて対象アダプターを明示的に列挙する手法が採用されました。abstract_mysql_adapter のテストを追加収集する条件として、mysql2 と trilogy の2つのアダプター名がハードコードされています。他のアダプター(postgresql、sqlite3 など)に対しては追加収集は行われません。
まとめ
この修正により、MySQL系アダプターのテスト実行時に AbstractMysqlAdapter のテストが確実に含まれるようになります。テストの収集ロジックに継承関係を反映させることで、共通ロジックのデグレードを見逃すリスクが低減されます。