Hi forks,

I’d like to resume the discussion on migrating to JUnit 5. I’ve been working on 
a connector testing framework and recently have an exploration on JUnit 5. I 
think some features are very helpful for the development of the testing 
framework:

• Extensions

JUnit 5 introduces a new Extension model, which provide a pluggable mechanism 
for extending test classes, like managing test lifecycles and providing 
parameters. Also with the help of extension, we can get rid of some limitations 
introduced by class inheritance, like current TestLogger & KafkaTestBase. In 
testing framework this is helpful for handling the lifecycle of Flink cluster 
and external system.

• Annotations

JUnit 5 provides better support in annotations, working together with 
extensions. We can simple mark types/fields/methods in the test, then let 
extension to search these elements and manage their lifecycle in the test. For 
example test with annotation @MiniCluster will be provided with a 
lifecycle-managed MiniCluster automatically.

• Parameterized tests

JUnit 5 supports more powerful parameterized tests. Testing framework uses this 
to inject different test environments and external contexts into the same test 
case, to run the case under different scenarios.

So I think JUnit 5 is quite flexible for developing such a framework or test 
utility based on it. My suggestion is that we can take connector testing 
framework as a starting point of using JUnit 5, then we can expand our 
exploration to more modules, finally dive into the entire project.

--
Best Regards,

Qingsheng Ren
Email: renqs...@gmail.com
On Dec 1, 2020, 4:54 PM +0800, Khachatryan Roman , wrote:
> +1 for the migration
>
> (I agree with Dawid, for me the most important benefit is better support of
> parameterized tests).
>
> Regards,
> Roman
>
>
> On Mon, Nov 30, 2020 at 9:42 PM Arvid Heise <ar...@ververica.com> wrote:
>
> > Hi Till,
> >
> > immediate benefit would be mostly nested tests for a better test structure
> > and new parameterized tests for less clutter (often test functionality is
> > split into parameterized test and non-parameterized test because of JUnit4
> > limitation). Additionally, having Java8 lambdas to perform fine-grain
> > exception handling would make all related tests more readable (@Test only
> > allows one exception per test method, while in reality we often have more
> > exceptions / more fine grain assertions and need to resort to try-catch --
> > yuck!). The extension mechanism would also make the mini cluster much
> > easier to use: we often have to start the cluster manually because of
> > test-specific configuration, which can be easily avoided in JUnit5.
> >
> > In the medium and long-term, I'd also like to use the modular
> > infrastructure and improved parallelization. The former would allow us
> > better to implement cross-cutting features like TestLogger (why do we need
> > to extend that manually in every test?). The latter is more relevant for
> > the next push on CI, which would be especially interesting with e2e being
> > available in Java.
> >
> > On Mon, Nov 30, 2020 at 2:07 PM Dawid Wysakowicz <dwysakow...@apache.org>
> > wrote:
> >
> > > Hi all,
> > >
> > > Just wanted to express my support for the idea. I did miss certain
> > > features of JUnit 5 already, an important one being much better support
> > > for parameterized tests.
> > >
> > > Best,
> > >
> > > Dawid
> > >
> > > On 30/11/2020 13:50, Arvid Heise wrote:
> > > > Hi Chesnay,
> > > >
> > > > The vintage runner supports the old annotations, so we don't have to
> > > change
> > > > them in the first step.
> > > >
> > > > The only thing that we need to change are all rules that do not extend
> > > > ExternalResource (e.g., TestWatcher used in TestLogger). This change
> > > needs
> > > > to be done swiftly as this affects the shared infrastructure as you
> > have
> > > > mentioned.
> > > >
> > > > Only afterwards, we start to actually migrate the individual tests.
> > That
> > > > can be done module by module or as we go. I actually found a nice
> > article
> > > > that leverages the migration assist of IntelliJ [1].
> > > >
> > > > As the last stop, we remove the vintage runner - all JUnit4 tests have
> > > been
> > > > migrated and new tests cannot use old annotation etc. anymore.
> > > >
> > > > [1]
> > > >
> > >
> > https://blog.jetbrains.com/idea/2020/08/migrating-from-junit-4-to-junit-5/
> > > >
> > > > On Mon, Nov 30, 2020 at 1:32 PM Chesnay Schepler <ches...@apache.org>
> > > wrote:
> > > >
> > > > > I presume we cannot do the migration module-wise due to shared test
> > > > > utilities that rely on JUnit interfaces?
> > > > >
> > > > > On 11/30/2020 1:30 PM, Chesnay Schepler wrote:
> > > > > > Is it feasible that 2 people can do the migration within a short
> > > > > > time-frame (say, a week)?
> > > > > > Must the migration of a test be done in one go, or can we for 
> > > > > > example
> > > > > > first rename all the Before/After annotations and then to the rest?
> > > > > > Are there any issues with other test dependencies (i.e., hamcrest,
> > > > > > powermock (PowerMockRunner), mockito) that we should be aware of?
> > > > > >
> > > > > > I generally like the idea of using JUnit 5, but am wary of this
> > > > > > migration dragging on for too long.
> > > > > >
> > > > > > On 11/27/2020 3:29 PM, Arvid Heise wrote:
> > > > > > > Dear devs,
> > > > > > >
> > > > > > > I'd like to start a discussion to migrate to a higher JUnit 
> > > > > > > version.
> > > > > > >
> > > > > > > The main motivations are:
> > > > > > > - Making full use of Java 8 Lambdas for writing easier to read 
> > > > > > > tests
> > > > > > > and a
> > > > > > > better performing way of composing failure messages.
> > > > > > > - Improved test structures with nested and dynamic tests.
> > > > > > > - Much better support for parameterized tests to avoid separating
> > > > > > > parameterized and non-parameterized parts into different test
> > classes.
> > > > > > > - Composable dependencies and better hooks for advanced use cases
> > > > > > > (TestLogger).
> > > > > > > - Better exception verification
> > > > > > > - More current infrastructure
> > > > > > > - Better parallelizable
> > > > > > >
> > > > > > > Why now?
> > > > > > > - JUnit5 is now mature enough to consider it for such a complex
> > > project
> > > > > > > - We are porting more and more e2e tests to JUnit and it would be 
> > > > > > > a
> > > > > > > pity to
> > > > > > > do all the work twice (okay some already has been done and would
> > > > > > > result in
> > > > > > > adjustments, but the sooner we migrate, the less needs to be 
> > > > > > > touched
> > > > > > > twice)
> > > > > > >
> > > > > > > Why JUnit5?
> > > > > > > There are other interesting alternatives, such as TestNG. I'm 
> > > > > > > happy
> > > > > > > to hear
> > > > > > > specific alternatives. For now, I'd like to focus on JUnit4 for an
> > > > > > > easier
> > > > > > > migration path.
> > > > > > >
> > > > > > > Please discuss if you would also be interested in moving onward. 
> > > > > > > To
> > > get
> > > > > > > some overview, I'd like to see some informal +1 for the options:
> > > > > > >
> > > > > > > [ ] Stick to JUnit4 for the time being
> > > > > > > [ ] Move to JUnit5 (see migration path below)
> > > > > > > [ ] Alternative idea + advantages over JUnit5 + some very rough
> > > > > > > migration
> > > > > > > path
> > > > > > >
> > > > > > > ---
> > > > > > >
> > > > > > > Migrating from JUnit4 to JUnit5 can be done in some steps, so that
> > we
> > > > > > > can
> > > > > > > gradually move from JUnit4 to JUnit5.
> > > > > > >
> > > > > > > 0. (There is a way to use JUnit4 + 5 at the same time in a 
> > > > > > > project -
> > > > > > > you'd
> > > > > > > use a specific JUnit4 runner to execute JUnit5. I'd like to skip
> > this
> > > > > > > step
> > > > > > > as it would slow down migration significantly)
> > > > > > > 1. Use JUnit5 with vintage runner. JUnit4 tests run mostly out of
> > the
> > > > > > > box.
> > > > > > > The most important difference is that only 3 base rules are
> > supported
> > > > > > > and
> > > > > > > the remainder needs to be migrated. Luckily, most of our rules
> > derive
> > > > > > > from
> > > > > > > the supported ExternalResource. So in this step, we would need to
> > > > > > > migrate
> > > > > > > the rules.
> > > > > > > 2. Implement new tests in JUnit5.
> > > > > > > 3. Soft-migrate old tests in JUnit5. This is mostly a renaming of
> > > > > > > annotation (@Before -> @BeforeEach, etc.). Adjust parameterized
> > tests
> > > > > > > (~400), replace rule usages (~670) with extensions, exception
> > handling
> > > > > > > (~1600 tests), and timeouts (~200). This can be done on a test 
> > > > > > > class
> > > by
> > > > > > > test class base and there is no hurry.
> > > > > > > 4. Remove vintage runner, once most tests are migrated by doing a
> > > final
> > > > > > > push for lesser used modules.
> > > > > > >
> > > > > > > Let me know what you think and I'm happy to answer all questions.
> > > > > > >
> > > > > >
> > > > >
> > >
> > >
> >
> > --
> >
> > Arvid Heise | Senior Java Developer
> >
> > <https://www.ververica.com/>
> >
> > Follow us @VervericaData
> >
> > --
> >
> > Join Flink Forward <https://flink-forward.org/> - The Apache Flink
> > Conference
> >
> > Stream Processing | Event Driven | Real Time
> >
> > --
> >
> > Ververica GmbH | Invalidenstrasse 115, 10115 Berlin, Germany
> >
> > --
> > Ververica GmbH
> > Registered at Amtsgericht Charlottenburg: HRB 158244 B
> > Managing Directors: Timothy Alexander Steinert, Yip Park Tung Jason, Ji
> > (Toni) Cheng
> >

Reply via email to