Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: H-HОтветов: 7

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

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

Спасибо

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

javatestingjunit

Ответы

Ответ 1 · рейтинг 30 · Jon Skeet

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

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

Ответ 2 · рейтинг 19 · mort

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

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

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

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

Ответ 3 · рейтинг 5 · Farmor

Да,

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

Ответ 4 · рейтинг 5 · Andreas Dolk

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

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

Ответ 5 · рейтинг 1 · Adam

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

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

Ответ 6 · Apoorv Gupta

По умолчанию 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");
    }
}

Ответ 7 · рейтинг -8 · sri

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

@Test

public ..... firstTest ()
{

}

@Test

public .... thirdTest()
{

}

@Test

public....secondTest()
{

}

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы