Різниця між 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.blogspot.com/search/label/mock
madhurtanwani

7

setUpBeforeClass запускається перед виконанням будь-якого методу відразу після конструктора (запускається лише один раз)

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

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

tearDownAfterClass запускається після всіх інших виконань методу, це останній метод, який слід виконати. (запустити лише один раз деконструктор)


5

Від Javadoc :

Іноді кілька тестів потребують спільного використання обчислювальної установки (наприклад, вхід у базу даних). Хоча це може поставити під загрозу незалежність тестів, іноді це необхідна оптимізація. Анотування public static voidметоду no-arg з @BeforeClassпричиною його запуску один раз перед будь-яким із методів тестування в класі. В @BeforeClassметоди суперкласу будуть виконуватися до тих поточний клас.


Різниця полягає в тому, що setUpBeforeClass запускається перед будь-яким із тестів і запускається один раз; setUp запускається один раз перед кожним тестом (і зазвичай використовується для скидання стану тестування до загальновідомого значення між тестами).
Синтаксис
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.