2015-10-30 4 views
1

В соответствии с этим answer, то @Before аннотаций выполняется один раз перед тем каждый тест, в то время как @BeforeClass аннотаций выполняется только один раз перед всех испытаний.JUnit с помощью @Before над @BeforeClass

Моя интуиция подсказывает мне всегда использовать @BeforeClass, поэтому вопрос в том, зачем использовать @Before? Есть ли случай, когда аннотация @Before работает лучше/быстрее, чем аннотация @BeforeClass?

+1

Выполнить лучше? Почему вы хотите, чтобы производительность в ваших тестах юнита? @Before полезно сбросить контекст перед каждым тестом ... –

+1

В моем конкретном случае я в настоящее время использую '@ Before' в паре с' acceptFalse' для исключения определенных тестов. Так что это не проблема производительности, я думаю, это больше, если мне не нужно проверять избыточные условия, я должен использовать '@ BeforeClass'. –

+0

Не могли бы вы привести пример того, что вы подразумеваете под этим? –

ответ

3

Каждый тест должен быть изолирован. Используя BeforeClass, состояние предыдущего теста могло бы повредить и испортить последующие тесты.

Обычно используется BeforeClass для установки дорогостоящего внешнего ресурса и Before для сброса мира (будь то внешний ресурс или локальный).

одно замечание:

работает лучше/быстрее

В этом случае я бы сказал, что два свойства должны рассматриваться независимо друг от друга здесь (что лучше = быстрее!). Пока общее время запуска вашего полного набора тестов составляет менее 10 минут, тогда «быстрее» просто не важно.

Как только вы пройдете выше этой магии десять минут (и в этот момент вы обязательно будете говорить об интеграционных тестах, а не о тестировании), тогда начните искать способы сделать вещи «быстрее».

1

Когда вы используете @BeforeClass, это предполагает, что вы выполняете инициализацию перед всеми тестами. Таким образом, один тест может зависеть от другого (например, если тесты меняют состояние полей), поэтому я бы рекомендовал использовать @Before или даже лучше сделать подготовку к методу тестирования внутри самого метода. Очень редко случаются случаи, когда ваши тесты нуждаются в том же начальном состоянии, поэтому зачем их объединять?

3

Я дам вам пример:

Предположим, вам нужно проверить форму в вашем веб-приложении. Вы собираетесь использовать Selenium для этого.

Ваш тестовый класс будет иметь 10 тестов. Вам не нужно открывать и закрывать браузер webdriver при каждом запуске набора тестов. В таком случае вы вбираете в браузер своего браузера webdrive метод @BeforeClass.

Однако для каждого теста валидации вам необходимо сбросить форму. Это действие вы будете выполнять по методу @Before.

Это очень простой пример, но может сделать все более ясным.