JUnit4 начал поддерживать порядок тестирования? Это намеренно? - PullRequest
9 голосов
/ 21 октября 2011

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

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

        })
public class ProfileTestSuite {

}

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

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

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

Ответы [ 6 ]

19 голосов
/ 21 октября 2011

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

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

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

Упорядочение классов тестов в наборе тестов

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

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

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

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

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

5 голосов
/ 21 октября 2011

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

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

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

3 голосов
/ 21 октября 2011

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

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

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

1 голос
/ 06 ноября 2014

Вы можете расширить программу Runner 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).

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

0 голосов
/ 28 января 2015

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

0 голосов
/ 17 января 2013

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

...