Как я могу выполнить тесты JUnit в случайном порядке?
У меня есть классическая структура для тестов, у меня есть набор тестов из разных комплектов, таких как DatabaseTests, UnitTests и т.д. Иногда эти пакеты содержат другие пакеты, такие как SlowDatabaseTests, FastDatabaseTests и т.д.
Я хочу, чтобы рандомизировать текущий порядок тестов, поэтому я буду уверен, что они не зависят друг от друга. Рандомизация должна быть на каждом уровне, например, пакет должен перетасовывать порядок тестового класса, а класс проверки должен перемешать метод метода тестирования.
Если это возможно сделать в Eclipse, это будет лучшим.
Ответы
Ответ 1
У вас есть Sortable, но я не вижу, как вы его используете.
Вы можете расширить BlockJUnit4ClassRunner и computeTestMethods() возвращает рандомизированную копию super.computeTestMethods(). Затем используйте @RunWith, чтобы установить это как используемый бегун.
например.
package com.stackoverflow.mlk;
import java.util.Collections;
import org.junit.runners.BlockJUnit4ClassRunner;
import org.junit.runners.model.InitializationError;
public class RandomBlockJUnit4ClassRunner extends BlockJUnit4ClassRunner {
public RandomBlockJUnit4ClassRunner(Class<?> klass)
throws InitializationError {
super(klass);
}
protected java.util.List<org.junit.runners.model.FrameworkMethod> computeTestMethods() {
java.util.List<org.junit.runners.model.FrameworkMethod> methods = super.computeTestMethods();
Collections.shuffle(methods);
return methods;
}
}
Тогда
@RunWith(com.stackoverflow.mlk.RandomBlockJUnit4ClassRunner.class)
public class RandomOrder {
@Test
public void one() {
}
@Test
public void two() {
}
@Test
public void three() {
}
}
Ответ 2
https://github.com/KentBeck/junit/pull/386 вводит некоторые заказы, но не RANDOM
. Наверное, вы этого не хотите; тесты должны выполняться детерминистически. Если вам нужно проверить, что разные перестановки тестов все равно проходят, либо проверьте все перестановки; или, если это было бы непрактично медленным, ввести "случайное" семя для перетасовки, которое определяется переменной окружения или тому подобным, чтобы вы могли воспроизвести любые сбои. http://hg.netbeans.org/main/file/66d9fb12e98f/nbjunit/src/org/netbeans/junit/MethodOrder.java дает пример этого для JUnit 3.
Ответ 3
В общем, что вам нужно сделать, это написать свой собственный тестовый бегун, а в классе тестового runner агрегировать методы и произвольно запускать каждый тест (убедитесь, что вы дважды не запускаете тест).
Подробнее о тестовой структуре и о том, как написать свой собственный тестовый бегун здесь:
http://www.ddj.com/architect/184415674
Ответ 4
Я буду уверен, что они не зависят от друг друга
Вы должны убедиться, что это так, не полагаясь на случайный порядок выполнения. Почему вы опасаетесь, что могут существовать зависимости?