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

При модульном тестировании с помощью 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 {
}

Ответ 1

Аннотированные методы @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()

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Ответ 4

Из Javadoc:

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