Hi everyone, The JUnit 5 migration is now complete; the final PR was merged this afternoon. I would like to share a brief summary of the journey, the main changes, and one known caveat. A long-running effort
This work began with issue #13948 <https://github.com/apache/druid/issues/13948>, proposed by @UngureanuSerg on March 20, 2023. The first migration PR, #16106 <https://github.com/apache/druid/pull/16106>, opened by @kgyrtkirk was merged on March 19, 2024. In April 2026, nearly two years later, @clintropolis resumed the effort by migrating druid-processing tests across 10 PRs. I had not initially planned to take on the remaining work. However, a reminder that new test cases should use JUnit 5 prompted me to revisit the migration last month. Since I had sufficient model budget available, I decided to complete the remaining work. Main changes - Removed JUnit 4, Vintage, JUnitParams, migration-support, and obsolete test-rule dependencies. - Retained Hamcrest and opentest4j only where active tests still require them. - Consolidated shared testing utilities under org.apache.druid.testing. - Updated AGENTS.md to guide contributors and coding agents toward JUnit 5 for new tests. Known caveat: @ParameterizedClass One known caveat is JUnit 5’s @ParameterizedClass. Depending on how it is used, class-level parameterization may introduce performance overhead. Where practical, @ParameterizedTest is preferred. For more technical details, see: - #19859 <https://github.com/apache/druid/pull/19859> - #20088 <https://github.com/apache/druid/pull/20088> - #20108 <https://github.com/apache/druid/pull/20108> I did not convert every @ParameterizedClass usage to @ParameterizedTest. Although AI can automate much of this conversion, doing so everywhere would have increased review effort and broadened the scope of the migration. Review and execution During the migration, @GWphua <https://github.com/GWphua> reviewed and approved all changes, which significantly accelerated the work so that the whole migration can be done in 3 weeks. Many thanks for the thorough reviews and support. For transparency, the implementation and validation work was performed with GPT-5.6 Luna models at maximum reasoning effort. Approximately at least 50 billion model tokens were used. Migration PRs The following list contains the migration-related PRs tracked by #13948. PRs #14488 <https://github.com/apache/druid/pull/14488> and #19911 <https://github.com/apache/druid/pull/19911> were closed without merging; their work was superseded by later PRs. - #14488 <https://github.com/apache/druid/pull/14488> — Druid server cache package migration to JUnit 5 (initial commit) @UngureanuSerg - #16106 <https://github.com/apache/druid/pull/16106> — Update Calcite*Test to use JUnit 5 @kgyrtkirk - #19289 <https://github.com/apache/druid/pull/19289> — Convert druid-processing tests to JUnit 5, pt. 1 @clintropolis - #19299 <https://github.com/apache/druid/pull/19299> — Convert druid-processing tests to JUnit 5, pt. 2 @clintropolis - #19302 <https://github.com/apache/druid/pull/19302> — Convert druid-processing tests to JUnit 5, pt. 3 @clintropolis - #19313 <https://github.com/apache/druid/pull/19313> — Convert druid-processing tests to JUnit 5, pt. 4 @clintropolis - #19327 <https://github.com/apache/druid/pull/19327> — Convert druid-processing tests to JUnit 5, pt. 5 @clintropolis - #19346 <https://github.com/apache/druid/pull/19346> — Convert druid-processing tests to JUnit 5, pt. 6 @clintropolis - #19360 <https://github.com/apache/druid/pull/19360> — Convert druid-processing tests to JUnit 5, pt. 7 @clintropolis - #19387 <https://github.com/apache/druid/pull/19387> — Convert druid-processing tests to JUnit 5, pt. 8 @clintropolis - #19601 <https://github.com/apache/druid/pull/19601> — Convert druid-processing tests to JUnit 5, pt. 9 @clintropolis - #19875 <https://github.com/apache/druid/pull/19875> — Migrate extensions-core and processing tests to JUnit 5 - #19876 <https://github.com/apache/druid/pull/19876> — Migrate extension-core format and lookup tests to JUnit 5 - #19877 <https://github.com/apache/druid/pull/19877> — Migrate extension-core catalog stats and security tests to JUnit 5 - #19878 <https://github.com/apache/druid/pull/19878> — Migrate extension-core Google, Kafka, and lookup tests to JUnit 5 - #19879 <https://github.com/apache/druid/pull/19879> — Migrate histogram extension tests to JUnit 5 - #19880 <https://github.com/apache/druid/pull/19880> — Migrate S3 extension tests to JUnit 5 - #19881 <https://github.com/apache/druid/pull/19881> — Migrate DataSketches extension tests to JUnit 5 - #19882 <https://github.com/apache/druid/pull/19882> — Convert druid-processing tests to JUnit 5, pt. 10 @clintropolis - #19908 <https://github.com/apache/druid/pull/19908> — Migrate nine extensions-contrib modules to JUnit 5 - #19909 <https://github.com/apache/druid/pull/19909> — Migrate SQL leaf and Quidem tests to JUnit 5 - #19910 <https://github.com/apache/druid/pull/19910> — Migrate task actions and compaction tests to JUnit 5 - #19911 <https://github.com/apache/druid/pull/19911> — Migrate server tests to JUnit 5 - #19915 <https://github.com/apache/druid/pull/19915> — Migrate the second extensions-contrib batch to JUnit 5 - #19916 <https://github.com/apache/druid/pull/19916> — Migrate the third extensions-contrib batch to JUnit 5 - #19917 <https://github.com/apache/druid/pull/19917> — Migrate the final extensions-contrib batch to JUnit 5 - #19920 <https://github.com/apache/druid/pull/19920> — Migrate common support tests to JUnit 5 - #19922 <https://github.com/apache/druid/pull/19922> — Migrate Overlord tests to JUnit 5 - #19923 <https://github.com/apache/druid/pull/19923> — Migrate seekable-stream tests to JUnit 5 - #19925 <https://github.com/apache/druid/pull/19925> — Migrate worker tests to JUnit 5 - #19926 <https://github.com/apache/druid/pull/19926> — Migrate ingestion and parallel tests to JUnit 5 - #19939 <https://github.com/apache/druid/pull/19939> — Migrate SQL core and schema tests to JUnit 5 - #19940 <https://github.com/apache/druid/pull/19940> — Migrate processing batch 1 to JUnit 5 - #19980 <https://github.com/apache/druid/pull/19980> — Migrate processing query tests to JUnit 5 - #19981 <https://github.com/apache/druid/pull/19981> — Migrate processing segment tests to JUnit 5 - #19982 <https://github.com/apache/druid/pull/19982> — Migrate processing batch 2 to JUnit 5 - #20031 <https://github.com/apache/druid/pull/20031> — Migrate the first server test batch to JUnit 5 - #20057 <https://github.com/apache/druid/pull/20057> — Migrate scoped server tests to JUnit 5 - #20058 <https://github.com/apache/druid/pull/20058> — Migrate coordination and service tests to JUnit 5 - #20059 <https://github.com/apache/druid/pull/20059> — Migrate coordinator tests to JUnit 5 - #20061 <https://github.com/apache/druid/pull/20061> — Migrate PR3 server tests to JUnit 5 - #20062 <https://github.com/apache/druid/pull/20062> — Migrate scoped server tests to JUnit 5 - #20064 <https://github.com/apache/druid/pull/20064> — Migrate MSQ tests to JUnit 5 - #20125 <https://github.com/apache/druid/pull/20125> — Finish the remaining JUnit 5 migration cleanup Thanks to everyone who proposed, implemented, reviewed, and supported this long-running effort.
