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.

Reply via email to