IDE (что IDEA, что NetBeans, с Eclipse не работал, не знаю) имеют обыкновение запускать тесты в алфавитном порядке. Это не всегда хорошо, если нужно гарантировать полную независимость тестов друг от друга, что важно для функциональных тестов, работающих с "живой" системой.
Сначала делаем аннотацию, которая будет указывать, что методы класса должны выполняться в случайном порядке:
@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface Shuffle {
}
А затем пишем перехватчик, на которые так богат TestNG
public class UniversalListener implements IMethodInterceptor {
@Override
public List intercept(List methods, ITestContext context) {
Shuffle sh = null;
for (IMethodInstance m : methods) {
if (sh == null) {
sh = (Shuffle) m.getMethod().getRealClass().getAnnotation(Shuffle.class);
}
}
if (sh != null) {
Collections.shuffle(methods);
}
return methods;
}
}
Зачем нужен цикл, почему не проверить на одном методе? В списке методов может прилететь метод из родительского класса (мне вот так и прилетел с первой же попытки), а тот не обязательно должен иметь аннотацию @Shuffle.
И, главное, не забудем указать этот Listener для класса:
@Listener({UniversalListener.class})
@Shuffle
public class SomeTests {
...
}