Должен ли я использовать одни и те же переменные во всем модульном тесте?

0

Вопрос

Я создаю модульные тесты на Java, и для каждого метода я создаю одни и те же списки, переменные и т. Д. С другой стороны, конечно, я думал, что смогу создать все эти переменные как глобальные и установить их значения в setup() способ (в @Before), но я не уверен, что значения могут быть изменены при выполнении тестов из-за многопоточности и т. Д. Итак, каков наилучший выход из этой ситуации?

java junit junit5 testing
2021-11-23 13:33:22
1

Лучший ответ

2

Не о чем беспокоиться. JUnit создаст новый экземпляр вашего тестового класса, а затем запустит каждый @Before метод, и только после этого запустите @Test метод, и он повторяет эту песню и танец снова и снова для каждого @Test аннотированный метод в этом классе. Вы используете @Before именно так, как и было задумано: он предназначен для хранения кода инициализации, необходимого для всех тестов в этом тестовом классе.

JUnit делает это таким образом, потому что приятно иметь "независимость от тестов": тесты, предпочтительно, проваливаются или проходят независимо от порядка, в котором вы их выполняете.

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

Другими словами:

Ваши опасения по поводу независимости тестов реальны, но они применимы к @BeforeClass. @Before не страдает от этой проблемы; этот код повторно запускается для каждого теста.

NB: Вы можете выбросить все это в окно, если у вас есть static что-то происходит. В тестовом коде нет статических элементов, если вы действительно не знаете, что делаете. Я предполагаю, что у вас этого нет, и в этом случае - продолжайте, ваши тесты независимы.

2021-11-23 13:38:26

Большое спасибо, есть какой-нибудь пример кода, который показывает правильное использование?
rzwitserloot

Я не понимал разницы между @BeforeClass и @Before. Какие-либо разъяснения, пожалуйста?
Amadán

все методы с @Before запускаются перед каждым тестом. Все методы с @BeforeClass запускаются только один раз, перед любым тестом. Как правило, вы устанавливаете static вещи с @BeforeClass который затем используется повторно (таким образом, тесты больше не являются независимыми). Вы устанавливаете нестатические вещи с помощью @Before, и, следовательно, тесты независимы. Просто прочитайте документы для этих заметок.
rzwitserloot

@BeforeClass (5 июня: @BeforeAll) выполняется один раз для всего тестового класса, @Before (5 июня: @BeforeEach) выполняется перед каждым отдельным методом тестирования.
rzwitserloot

Я использую JUnit5, тогда я вижу разницу между @BeforeEach против @BeforeAll ну, из ваших объяснений. Однако я не уверен, следует ли мне очищать списки, используемые несколькими тестами, или нет. Мне нужно очистить их в @AfterEach. Есть идеи?
avandeursen

Не очищайте список. Это также звучит так, как будто вам следует немного поиграть с этим, потому что, очевидно, ответа SO для вас недостаточно. Это хороший инстинкт! Просто.. сделайте несколько тестов, добавьте некоторые элементы в список, инициализированный только один раз в @Before, и распечатайте кое - что-ничего не удаляя. Затем просто наблюдайте, что происходит.

Да, в это можно было бы сыграть, но я думаю, что это действительно обычная ситуация, и для этого должен быть общий подход. Итак, мне просто нужно уточнить соглашение о модульном тестировании для повторного использования одних и тех же переменных (например, просто определив один раз в @beforeach ИЛИ @beforeAll, очистите переменные на @AfterEach. Итак, каков правильный подход к этой ситуации?. Есть идеи?

Воспользуйся @Before. Я понятия не имею, что все еще может сбивать вас с толку на данный момент. В ответе все ясно сказано!

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................