Начал ли JUnit4 поддерживать заказ теста? Это намеренно?

Новичок в JUnit (на самом деле JUnit 4) и наткнулся на пакетный способ выполнения теста

@RunWith(Suite.class)
@Suite.SuiteClasses(
        {                               
                CreateNewProfile.class,
                EditProfile.class,

        })
public class ProfileTestSuite {

}

Это образец кода, с которым я столкнулся при просмотре базы тестового кода у моего нового работодателя. Во время выполнения я финансирую это - сначала выполняются тесты CreateNewProfile, а затем EditProfile, что имеет смысл, но затем оно вводит зависимость между тестами.

Я наблюдал за независимым механизмом проверки с нескольких месяцев (хотя я использовал TestNG, а не JUnit) и ожидал, что EditProfile сможет быть выполнен изолированно. Это профиль редактирования должен заботиться о создании профиля, а затем редактировать его, а затем утверждать операции.

Мой вопрос здесь - имеет Junit 4 введенную функцию заказа заказа. Является ли эта функция предназначенной или одно пасхальное яйцо, поскольку я всегда чувствовал JUnit = независимые тесты.

Ответ 1

Нет JUnit не поддерживает тестовое упорядочение, за исключением того, что вы говорите, через Suite. Это определяет только порядок выполнения тестов классов. Это было там в течение длительного времени, включая классы JUnit 3 Suite.

Для более полного объяснения нам нужно поговорить о трех вещах:

  • упорядочение классов тестов в тестовом пакете
  • упорядочение тестовых классов, когда они обнаруживаются отражением Eclipse или Maven
  • порядок тестовых методов (аннотированный с помощью @Test) в тестовом классе.

Порядок тестирования классов тестов в наборе тестов

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

Порядок упорядочивания тестовых классов, когда они найдены отражением

При поиске пути к классам для классов порядок, в котором они найдены, не гарантируется, поэтому на него нельзя полагаться. На самом деле это не JUnit, который выполняет поиск, а плагин Eclipse Junit, или maven surefire или отказоустойчивый.

Порядок тестовых методов в тестовом классе

JUnit не гарантирует порядок выполнения тестов внутри класса. В большинстве случаев на большинстве JVM до версии 7 порядок, в котором они найдены с использованием отражения, находится в порядке объявления, то есть в порядке, в котором они находятся в файле. Это порядок, в котором они выполняются. Однако с JVM 7 это больше не гарантируется, поэтому не будет последовательного порядка. Существует проблема github # 293 Сортировка методов тестирования для предсказуемости с предлагаемыми решениями, и есть поток в списке рассылки junit: Порядок запуска метода проверки алфавита?. Поэтому вы не можете зависеть от порядка выполнения тестов с помощью JUnit, но это в настоящее время обсуждается.

Ответ 2

Нет, порядок не поддерживается. И да, это намерение:

KentBeck прокомментировал (30 декабря 2010 г.): Независимые тесты более ценны, поэтому JUnit по дизайну не поддерживает порядок тестирования.

Если вам нужна эта функция, вы можете использовать TestNG с ней @Test(sequential = true).

Ответ 3

Ответ на

@jeha очень хорош, но он говорит о методах тестирования (тех, которые были аннотированы с @Test). Этот порядок действительно неуточнен, вероятно, потому, что порядок методов в классе, полученном с помощью отражения, не гарантированно соответствует порядку методов в исходном файле.

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

Вы спрашиваете о порядке тестовых классов. Это не должно быть неожиданностью: вы явно перечисляете тестовые классы, используя @Suite.SuiteClasses, а JUnit, вероятно, не имеет никакого дела в том, чтобы перетасовывать их и работать в другом порядке. Вас беспокоит введение зависимости между тестами просто потому, что вы явно их заказали?

Ответ 4

Вы можете расширить линейку Suite:

public class MySuite extends Suite {

    public SuiteRunner(Class<?> klass, RunnerBuilder builder) throws InitializationError {
        super(klass, builder);
    }

    @Override
    protected List<Runner> getChildren() {
        List<Runner> children = super.getChildren();
        ... here modify the children list - you can remove or reorder test...
        return children;
    }
}

Затем аннотируйте свой пакет:

@RunWith(MySuite.class)
@Suite.SuiteClasses({                               
        CreateNewProfile.class,
        EditProfile.class})
public class ProfileTestSuite { }

Тестировки, отмеченные @Ignore, будут представлены IgnoredClassRunner, а регулярный тест будет представлен BlockJUnit4ClassRunner (или любой бегун, на который вы их аннотируете), что будет, вероятно, расширением BlockJUnit4ClassRunner).

От бегуна вы можете получить тестовый класс. Затем вы можете использовать собственные аннотации.

Ответ 5

Просто обходите его, заказывая имена класса с помощью _ # перед именем класса. бывший _1testcaselogin _2testcaseverify

Ответ 6

JUnit 4.11 теперь поддерживает указание порядка выполнения с помощью аннотации @FixMethodOrder.