Начал ли JUnit4 поддержку заказа тестов? Это намеренно?
Автор вопроса: TarunОтветов: 6
Новичок в JUnit (на самом деле JUnit 4) и наткнулся на удобный способ выполнения теста.
@RunWith(Suite.class)
@Suite.SuiteClasses(
{
CreateNewProfile.class,
EditProfile.class,
})
public class ProfileTestSuite {
}
Это пример кода, с которым я столкнулся, просматривая тестовую базу кода у моего нового работодателя. Во время выполнения я финансирую это - сначала выполняются тесты CreateNewProfile, а затем EditProfile, что имеет смысл, но затем вводит зависимость между тестами.
Я следил за независимым механизмом тестирования пару месяцев (хотя раньше использовал TestNG, а не JUnit) и ожидал, что EditProfile также сможет выполняться изолированно. То есть профиль редактирования должен позаботиться о создании профиля, а затем его редактировании и последующем утверждении операций.
У меня вопрос: в Junit 4 введена функция тестового заказа. Предназначена ли эта функция или одна пасхалка, как я всегда чувствовал, JUnit = независимые тесты.
Никакой JUnit не поддерживает упорядочивание тестов, кроме как так, как вы говорите, через Suite. Это определяет только порядок, в котором выполняются тестовые классы. Это было там в течение долгого времени, включая классы JUnit 3 Suite.
Для более полного объяснения нам нужно поговорить о трех вещах:
порядок классов тестов в наборе тестов
порядок тестовых классов, когда они найдены путем отражения Eclipse или Maven
порядок тестовых методов (с аннотацией @Test) в тестовом классе.
Порядок классов тестов в наборе тестов
Когда вы указываете список классов, которые должны выполняться в наборе тестов, вы определяете массив, и эти тестовые классы будут выполняться по порядку, за исключением случаев, когда вы выполняете параллельное выполнение. К сожалению, это позволяет вводить зависимости между вашими тестовыми классами.
Порядок тестовых классов, когда они найдены отражением
При поиске классов в пути к классам порядок их нахождения не гарантируется, поэтому на него нельзя полагаться. На самом деле поиском занимается не JUnit, а плагин Eclipse Junit или maven surefire или failsafe.
Порядок тестовых методов в тестовом классе
JUnit не гарантирует порядок выполнения тестов внутри класса. В большинстве случаев на большинстве JVM до версии 7 порядок, в котором они находятся с использованием отражения, соответствует порядку объявления, т. е. порядку, в котором они находятся в файле. Это порядок, в котором они выполняются. Однако с JVM 7 это больше не гарантируется, поэтому последовательного порядка не будет. Существует проблема github #293 Сортировать методы тестирования для обеспечения предсказуемости с предлагаемыми решениями, и в списке рассылки junit есть ветка: Алфавитизация порядка выполнения методов тестирования? а>. Таким образом, вы не можете зависеть от порядка выполнения тестов с использованием JUnit, но в настоящее время это обсуждается.
Если вам нужна эта функция, вы можете использовать TestNG с его @Test(sequential = true).
Ответ 3 · рейтинг 3 · Tomasz Nurkiewicz
Ответ @jeha очень хороший, но он говорит о порядке методов тестирования (тех, которые помечены @Test). Этот порядок действительно не указан, вероятно, потому, что порядок методов в классе, полученном посредством отражения, не обязательно соответствует порядку методов в исходном файле.
Однако из моего опыта они выполняются в том же порядке, в котором они были определены большую часть времени.
Вы спрашиваете о порядке тестовых занятий. Это не должно быть сюрпризом: вы явно перечисляете тестовые классы, используя @Suite.SuiteClasses, и JUnit, вероятно, не нужно их перемешивать и запускать в другом порядке. Вы беспокоитесь о введении зависимости между тестами просто потому, что вы явно заказали их?
Ответ 4 · рейтинг 1 · Masáč
Вы можете расширить бегун 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 · рейтинг 1 · Aleksandr Dubinsky
JUnit 4.11 теперь поддерживает указание порядка выполнения с помощью аннотации @FixMethodOrder.
Ответ 6 · Kelly Ryan
Просто обойдите его, упорядочив имена классов, используя _# перед именем класса. Ex _1testcaselogin _2testcaseverify