junit-team / junit4

A programmer-oriented testing framework for Java.
https://junit.org/junit4
Eclipse Public License 1.0
8.53k stars 3.29k forks source link

OrderWith in parameterized tests #1701

Open phoenix384 opened 3 years ago

phoenix384 commented 3 years ago

The ordering introduced with #1130 is a great feature. Also the fact that the annotation is inherited is really helpful in some cases.

But when a parameterized test inherits an OrderWith annotation, its parameters get reordered as well. Another case where this behaviour could be a problem would be a parameterized test with more than one test method, where you add an OrderWith annotation in order to sort the test methods but not the parameters.

As long as the parameters name value starts with "{index}" and the amount of parameters is <10 there is no problem, because the order remains the same (at least with the provided alphanumeric ordering). If there are >10 parameters, the alphabetical order is 1, 10, 11, 2, 3, ...

I could think of the following possibilites to solve this:

kcooney commented 2 years ago

Sorry for the delay. We aren't actively planning another major release of JUnit, so I don't often review bugs.

OrderWith should only sort test methods - not parameters

The ordering is based on the Description values. The code doing the ordering has no knowledge that the description represents a parameter, so I don't see how we could do this.

Add leading zeros to the {index} placeholder value

This could be done, but has a small chance of breaking current users (then again, I suspect having more than nine parameters may be uncommon). I might be willing to approve a pull request for this proposal, but, again, we don't currently plan on releasing another major version of JUnit, so the changes might never be released.

add an additional placeholder that outputs the index with leading zeros.

I'm not thrilled with this approach. It would complicate the code and the surface area of the API, and would only solve the problem for people that knew about the the placeholders and understood when they should be used.

Add an ordering to use with the OrderWith annotation ... to be able to override an inherited ordering

In my experience, base test classes are over-used. One of the reasons we introduced Rules was to provide code reuse by composition instead of inheritance. Having a special way to "undo" inherited behavior seems like a step backwards.