Разница между setUp () и setUpBeforeClass ()

159

При модульном тестировании с JUnit, есть два похожих метода, setUp()и setUpBeforeClass(). В чем разница между этими методами? Кроме того, в чем разница между tearDown()и tearDownAfterClass()?

Вот подписи:

@BeforeClass
public static void setUpBeforeClass() throws Exception {
}

@AfterClass
public static void tearDownAfterClass() throws Exception {
}

@Before
public void setUp() throws Exception {
}

@After
public void tearDown() throws Exception {
}
Сагар Варпе
источник

Ответы:

204

@BeforeClassИ @AfterClassаннотированные методы будут работать ровно один раз во время тестового прогона - в самом начале и в конце испытания в целом, прежде чем что -то еще работать. На самом деле они запускаются еще до того, как тестовый класс будет создан, поэтому они должны быть объявлены static.

@BeforeИ @Afterметоды будут работать до и после каждого теста, так, вероятно , будет запускать несколько раз во время тестового прогона.

Итак, давайте предположим, что у вас было три теста в вашем классе, порядок вызовов методов будет следующим:

setUpBeforeClass()

  (Test class first instance constructed and the following methods called on it)
    setUp()
    test1()
    tearDown()

  (Test class second instance constructed and the following methods called on it)
    setUp()
    test2()
    tearDown()

  (Test class third instance constructed and the following methods called on it)
    setUp()
    test3()
    tearDown()

tearDownAfterClass()
Анджей Дойл
источник
15

Думайте о «BeforeClass» как статическом инициализаторе для вашего тестового примера - используйте его для инициализации статических данных - вещей, которые не меняются в ваших тестовых случаях. Вы определенно хотите быть осторожным со статическими ресурсами, которые не являются потокобезопасными.

Наконец, используйте аннотированный метод «AfterClass», чтобы очистить все настройки, которые вы делали в аннотированном методе «BeforeClass» (если только их самоуничтожение не является достаточно хорошим).

«До» и «После» предназначены для конкретной инициализации модульного теста. Обычно я использую эти методы для инициализации / повторной инициализации макетов моих зависимостей. Очевидно, что эта инициализация не специфична для модульных тестов, но является общей для всех модульных тестов.

madhurtanwani
источник
Кстати, если вы начинаете писать модульный тест, я бы порекомендовал этот банк из моего блога. Также есть ссылки на другие замечательные материалы по юнит-тестированию: madhurtanwani.blogspot.com/search/label/mock
madhurtanwani
7

setUpBeforeClass запускается перед выполнением любого метода сразу после конструктора (запускается только один раз)

setUp запускается перед каждым выполнением метода

tearDown запускается после каждого выполнения метода

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

netbrain
источник
5

Из Javadoc :

Иногда несколько тестов должны использовать вычислительно дорогостоящие настройки (например, вход в базу данных). Хотя это может поставить под угрозу независимость тестов, иногда это является необходимой оптимизацией. Аннотирование public static voidбез аргументов методы с @BeforeClassпричинами его можно запускать один раз , прежде чем любые из методов испытаний в классе. В @BeforeClassметоды суперкласса будут выполняться до тех текущий класс.

Джастин кинг
источник
Разница в том, что setUpBeforeClass запускается перед любым из тестов и запускается один раз; setUp запускается один раз перед каждым тестом (и обычно используется для сброса состояния тестирования до заведомо хорошего значения между тестами).
Синтаксис