Я создаю модульные тесты на Java, и для каждого метода я создаю одни и те же списки, переменные и т. Д. С другой стороны, конечно, я думал, что смогу создать все эти переменные как глобальные и установить их значения в setup()
способ (в @Before
), но я не уверен, что значения могут быть изменены при выполнении тестов из-за многопоточности и т. Д. Итак, каков наилучший выход из этой ситуации?
Не о чем беспокоиться. JUnit создаст новый экземпляр вашего тестового класса, а затем запустит каждый @Before
метод, и только после этого запустите @Test
метод, и он повторяет эту песню и танец снова и снова для каждого @Test
аннотированный метод в этом классе. Вы используете @Before
именно так, как и было задумано: он предназначен для хранения кода инициализации, необходимого для всех тестов в этом тестовом классе.
JUnit делает это таким образом, потому что приятно иметь "независимость от тестов": тесты, предпочтительно, проваливаются или проходят независимо от порядка, в котором вы их выполняете.
Время от времени процесс инициализации настолько дорог, что не стоит оплачивать "стоимость" его повторного запуска для каждого теста. Аннотация @BeforeClass
существует специально для этой цели. Явадок из @BeforeClass
даже указывается, что это ставит под угрозу независимость тестирования и поэтому должно использоваться только в том случае, если работа по настройке, выполняемая в рамках такого метода, является достаточно дорогостоящей (с точки зрения вычислений или иным образом) для достижения этого компромисса.
Другими словами:
Ваши опасения по поводу независимости тестов реальны, но они применимы к @BeforeClass
. @Before
не страдает от этой проблемы; этот код повторно запускается для каждого теста.
NB: Вы можете выбросить все это в окно, если у вас есть static
что-то происходит. В тестовом коде нет статических элементов, если вы действительно не знаете, что делаете. Я предполагаю, что у вас этого нет, и в этом случае - продолжайте, ваши тесты независимы.
@BeforeClass
и @Before
. Какие-либо разъяснения, пожалуйста? @Before
запускаются перед каждым тестом. Все методы с @BeforeClass
запускаются только один раз, перед любым тестом. Как правило, вы устанавливаете static
вещи с @BeforeClass
который затем используется повторно (таким образом, тесты больше не являются независимыми). Вы устанавливаете нестатические вещи с помощью @Before
, и, следовательно, тесты независимы. Просто прочитайте документы для этих заметок. @BeforeClass
(5 июня: @BeforeAll
) выполняется один раз для всего тестового класса, @Before
(5 июня: @BeforeEach
) выполняется перед каждым отдельным методом тестирования. @BeforeEach
против @BeforeAll
ну, из ваших объяснений. Однако я не уверен, следует ли мне очищать списки, используемые несколькими тестами, или нет. Мне нужно очистить их в @AfterEach
. Есть идеи? @Before
, и распечатайте кое - что-ничего не удаляя. Затем просто наблюдайте, что происходит. @AfterEach
. Итак, каков правильный подход к этой ситуации?. Есть идеи? @Before
. Я понятия не имею, что все еще может сбивать вас с толку на данный момент. В ответе все ясно сказано!