After sending this mail, the more I think of it, I am not too sure introducing a new task (junitlauncher) is serving any useful purpose. Of course it does allow me to keep the task implementation simpler without using the existing JUnitTask as an entry point of the call. But that is an internal implementation detail, now that I think of it. So perhaps just using the existing <junit> task and introducing relevant attribute(s) to support this JUnit 5 launcher might be a better idea. Even if we do stop supporting non-launcher based approach in some distant future, we could still do that just by changing the internal implementation detail of this task (and maybe removing support for certain attributes).

Either way, I would still like to hear others thoughts on this.

-Jaikiran


On 14/12/17 3:39 PM, Jaikiran Pai wrote:
I've started some experiments in adding support for the recently released JUnit5 [1] in Ant. I don't mean using JUnit5 for test cases written within our Ant project, instead I am talking about allowing users to use a Ant task to be able to run JUnit5 based test cases as requested here [2].

Before I get into the details of what I have tried so far, I would like to quickly explain what JUnit5 brings for us (build tool developers). As they note in their documentation, JUnit 5 has introduced proper APIs targetted towards build tools and IDEs to be able to launch tests, in a simple way. Furthermore, they have separated out these APIs from the core of the tests itself. What that means is, the JUnit platform launcher APIs, allow build tools to launch the JUnit platform and then once launched, the ability to "identify" tests that need to be run depends on the plugged in engine, which is/can be controlled by the user's environment. So essentially the launched platform can be used to run JUnit 5 test cases (written using JUnit 5 test APIs) or can be used to run JUnit 4 test cases (they call these vintage). This decision is done by a pluggable test engine, typically placed within the classpath.

With that context, I would like to explain what I have attempted so far and I would like inputs on whether I should follow this path and/or if there are other suggestions on how we should go ahead. As you are probably aware, the JUnitTask (the Ant task backing the <junit> element) has very complex logic which deals with launching the test runners responsible for running JUnit tests (3.x or 4.x). IMO, most this logic can now be handed off to the JUnit 5 platform launcher, using their APIs.

So one way to add JUnit 5 support would probably be to introduce a new attribtue on the <junit> task, something like "use-junit-launcher" which when set, will let us rely on this JUnit 5 launcher APIs. Of course, we would also document that the usage of this attribute would imply that they will have to setup their library dependencies to include all relevant JUnit 5 related jars that provide this support, plus the relevant JUnit test engine that suits their needs. This will allow them to use the existing <junit> task and just add a new attribtue to deal with JUnit5.

The other approach is to introduce a new task (say <junitlauncher>) which has the exact same support in terms of what attributes and nested elements are supported but its implementation is completely going to rely on the JUnit 5 platform launcher to deal with the test execution. Practically, that means, all the existing complex code in JUnitTask need no longer be used with this task and instead it will be a much simpler implementation. Users who want "pure" junit 3.x or 4.x can still stick to <junit> task, whereas users who want to use JUnit 5 based platform, either to run JUnit 4.x or 5.x can use this newer <junitlauncher> task. Over time, in some release, we might probably just advertise <junitlauncher> and deprecate <junit> (that's a long way away of course, if we do indeed do that)

In my experiment, I have implemented the latter approach to show its usage. The code/commit resides here [3]. It by no means is complete, but does currently support JUnit 5 (and JUnit 4) in its current form. Before I actually spend more time on this approach, I would like inputs and thoughts on it. The usage of this task would be something like this (just a snippet from my experimental build.xml):

<target name="test" depends="compile-tests">
        <junitlauncher>
            <!-- Multiple tests contained in the build.classes.dir-->
            <batchtest>
              <fileset dir="${build.classes.dir}"/>
            </batchtest>
            <!-- A specific test -->
            <test name="org.myapp.FooTest"/>
            <!-- classpath to be used for the tests -->
            <classpath refid="test.classpath" />
        </junitlauncher>
</target>


[1] http://junit.org/junit5/
[2] https://bz.apache.org/bugzilla/show_bug.cgi?id=61796
[3] https://github.com/jaikiran/ant/commit/42c7f221a8cd0848df0a2d6cac2897c07d446bda

-Jaikiran



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@ant.apache.org
For additional commands, e-mail: dev-h...@ant.apache.org

Reply via email to