Как я могу заставить мои тесты JUnit работать в случайном порядке? - PullRequest
22 голосов
/ 18 сентября 2009

У меня есть классическая структура для тестов, у меня есть набор тестов различных наборов, таких как DatabaseTests, UnitTests и т. Д. Иногда эти наборы содержат другие наборы, например SlowDatabaseTests, FastDatabaseTests и т. Д.

Я хочу рандомизировать порядок выполнения тестов, чтобы убедиться, что они не зависят друг от друга. Рандомизация должна быть на каждом уровне, например, набор должен перемешивать порядок тестового класса, а тестовый класс должен перемешивать порядок тестового метода.

Если это возможно сделать в Eclipse, это будет лучшим.

Ответы [ 5 ]

14 голосов
/ 21 сентября 2009

У вас есть сортируемый , но я не могу понять, как вы его используете.

Вы можете расширить 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() {
    }
}
4 голосов
/ 17 сентября 2012

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 голосов
/ 18 сентября 2009

В общем, вам нужно написать свой собственный тестовый прогон и в классе тестового прогона агрегировать методы и случайным образом запускать каждый тест (убедитесь, что вы не запускаете тест дважды).

Узнайте больше о тестовой среде и о том, как написать свой собственный тестовый прогон, здесь: http://www.ddj.com/architect/184415674

0 голосов
/ 30 апреля 2018

Этот вопрос открыт на JUnit GitHub уже 2 года и указывает на 2 независимых вопроса:
- тесты в зависимости от порядка исполнения;
- Не повторяемые тесты.

Подумайте над решением проблемы в корне, а не пытайтесь использовать структуру для выполнения этой работы впоследствии. Используйте метод setUp и tearDown, чтобы гарантировать изоляцию, и тестируйте на минимальном уровне.

0 голосов
/ 18 сентября 2009

Я позабочусь, чтобы они не зависели от друг друга

Вы должны убедиться, что это так, не полагаясь на случайный порядок выполнения. Что заставляет вас бояться, что зависимости могут существовать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...