Выполняет ли JUnit тестовые примеры последовательно?

В этом сообщении я задал небольшой вопрос как часть более крупного проблема. Поскольку я еще не получил ответов, я задаю свой вопрос здесь:

Разумно ли предположить, что JUnit выполняет тестовые примеры последовательно: тестовый пример заканчивается раньше, чем начинается следующий. Отличается ли он между версиями JUnit (мой приоритет - JUnit4)? А если нет, есть ли простой способ заставить JUnit выполнять тесты последовательно?

Спасибо


person H-H    schedule 01.09.2011    source источник
comment
В качестве примечания, вот еще немного о параллельном выполнении тестов с использованием JUnit 4.7: stackoverflow.com/questions/423627/   -  person mort    schedule 01.09.2011
comment
Если вы используете JUnit в своей сборке Maven, и ваша сборка настроена на многопоточность с использованием параметра -T (например, -T 4C), тогда тесты будут выполняться параллельно, где это возможно.   -  person Tom Chamberlain    schedule 18.08.2015


Ответы (7)


Да, я считаю, что по умолчанию тесты запускаются последовательно.

JUnit 4.6 представил экспериментальный ParallelRunner для параллельного запуска тестов - я не знаю его текущего статуса. Тем не менее, я ожидаю, что параллелизм по умолчанию останется функцией «согласия». (Судя по другим ответам, похоже, что теперь он здесь, чтобы остаться, но в немного другой форме - и все еще есть.)

person Jon Skeet    schedule 01.09.2011
comment
Как правило, лучше проводить тесты параллельно, а не последовательно? Какое оборудование должно быть у нас, чтобы проводить тесты параллельно? - person MasterJoe; 09.03.2018
comment
Похоже ли это на приемлемый способ подтверждения последовательности, кроме отладки? Создайте тестовый класс с 10 тестовыми методами. Создайте список целых чисел в тестовом классе. Каждый тестовый метод вводит свою позицию в классе в список. Выполните все тесты 10 раз. Каждый раз целые числа всегда должны быть в правильном порядке. - person MasterJoe; 09.03.2018
comment
@ testerjoe2: Честно говоря, я бы не стал на это полагаться. Я бы доверял документации больше, чем просто специальному тестированию - было бы очень легко использовать некоторые эвристики (возможно, последовательные для 10 или менее методов, параллельные для большего количества, например), которые дадут ложное срабатывание. - person Jon Skeet; 09.03.2018

Параллельное выполнение тестов поддерживается начиная с JUnit 4.7. Но, насколько я знаю, это никогда не делается автоматически, вам нужно специально настроить его, например как здесь: http://java.dzone.com/articles/running-junit-tests-parallel

Но не забывайте, что:

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

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

person mort    schedule 01.09.2011

Да,

А также подумайте о @before и @after, где у вас может быть код, который восстанавливает состояние для следующего теста.

person Farmor    schedule 01.09.2011
comment
не могли бы вы объяснить немного больше? - person MasterJoe; 09.03.2018

Сильное и разумное предположение: да, JUnit по умолчанию является однопоточным.

В противном случае нельзя было бы узнать, провалился ли тест из-за поломки кода или из-за проблем с параллелизмом, если некоторые тесты выполнялись параллельно.

person Andreas Dolk    schedule 01.09.2011
comment
Если в каждом тесте используются собственные тестовые данные (что не всегда возможно), то лучше ли запускать тесты параллельно? - person MasterJoe; 09.03.2018

да. Как упоминалось где-то в комментариях, вам следует тщательно спланировать настройку и разборку тестового набора (все суперклассы влияют на эти действия), а также настройку и разбор тестового набора.

Кроме того, второстепенное замечание, насколько я помню, JUnit не гарантирует порядок выполнения тестовых наборов (то есть, если они не входят в набор, я полагаю). Это важно и должно подтолкнуть вас к очень точной очистке и восстановлению состояния SUT между тестами, а также избегать тестовых примеров, полагающихся на результаты других тестов. можно сказать, что это своего рода антипаттерн :).

person Adam    schedule 07.09.2011

По умолчанию JUnit запускает тесты в детерминированном, но непредсказуемом порядке (MethodSorters.DEFAULT).

В Junit 5:, если вы хотите запускать тесты последовательно

  • используйте @TestMethodOrder для управления порядком выполнения тестов.
  • А затем используйте аннотацию @Order, чтобы заставить тесты запускаться в определенном порядке.
  • Пример:

@TestMethodOrder(OrderAnnotation.class)
public class OrderAnnotationUnitTest {
    private static StringBuilder output = new StringBuilder("");

    @Test
    @Order(1)
    public void firstTest() {
        output.append("a");
    }

    @Test
    @Order(2)
    public void secondTest() {
        output.append("b");
    }

    @Test
    @Order(3)
    public void thirdTest() {
        output.append("c");
    }

    @AfterAll
    public static void assertOutput() {
        assertEquals(output.toString(), "abc");
    }
}
person Apoorv Gupta    schedule 17.07.2021
comment
Ссылка для справки: baeldung.com/junit-5-test-order - person Apoorv Gupta; 17.07.2021

По своему опыту могу сказать, что мы можем сериализовать тесты в классе, назвав имя метода, в котором есть Test. бывший:

@Test

public ..... firstTest ()
{

}

@Test

public .... thirdTest()
{

}

@Test

public....secondTest()
{

}

Порядок: firstTest, thirdTest, secondTest.

person sri    schedule 08.03.2013
comment
Это не ответ на вопрос. - person Karl Richter; 14.08.2018
comment
IMHO, тест не может быть запущен в этом точном порядке, и это действительно плохой дизайн для проверки функциональности на основе определенного порядка. - person Paul Rey; 04.04.2019