JUnit 4 и TestNG раньше были сопоставимы. Каковы плюсы и минусы двух сред тестирования?
JUnit 4 и TestNG раньше были сопоставимы. Каковы плюсы и минусы двух сред тестирования?
Ответы:
Сегодня я сравнивал TestNG и JUnit4, и главное преимущество, которое я могу отметить с моим ограниченным опытом в тестовых фреймворках, заключается в том, что TestNG имеет более элегантный способ обработки параметризованных тестов с концепцией поставщика данных.
Насколько я могу судить с JUnit4, вам нужно создать отдельный тестовый класс для каждого набора параметров, с которыми вы хотите тестировать (запускать @RunWith(Parameterized.class)
). С TestNG у вас может быть несколько поставщиков данных в одном тестовом классе, поэтому вы также можете хранить все свои тесты для одного класса в одном тестовом классе.
Пока что это единственное, что я могу отметить как преимущество TestNG перед JUnit4.
Intellij IDEA включает поддержку TestNG и JUnit из коробки. Однако Eclipse "из коробки" поддерживает только JUnit, и для его работы требуется установленный плагин TestNG.
Однако более неприятная проблема, с которой я столкнулся с TestNG, заключается в том, что ваши тестовые классы должны расширяться, PowerMockTestCase
если вы используете PowerMock для имитации зависимостей в своих тестах. По-видимому, есть способы настроить объектную фабрику, о которой должна знать ваша тестовая среда при использовании PowerMock с помощью специального метода или testng.xml
определения набора, но в настоящий момент они, похоже, не работают . Мне не нравится, когда тестовые классы расширяют классы тестовой среды, это кажется хакерским.
Если вы не используете PowerMock, это, конечно, не проблема, но в целом у меня создается впечатление, что JUnit4 лучше поддерживается.
Исходя из моего опыта работы с обеими фреймворками, testng имеет несколько удобных функций, которые команда JUnit отказывалась реализовывать в течение нескольких лет. По этой причине я предпочитаю его JUnit. Преобразовать в testng легко, поскольку он в основном поддерживает почти все в JUnit (есть даже плагин конвертера для eclipse), обратное преобразование в JUnit не так уж и здорово из-за этих недостающих функций.
В testng @BeforeClass
методы не являются статическими и выполняются перед запуском тестов в этом классе, а не при загрузке тестового класса (поведение JUnit). Однажды у меня был проект JUnit, в котором все тесты базы данных (несколько десятков) инициализировали базу данных с самого начала, что было довольно идиотским поведением. В сообществе JUnit было много споров за и против этого. Суть его заключалась в том, что каждый тестовый метод должен иметь свое собственное тестовое устройство, и поэтому у вас не должно быть нестатического метода стиля beforeAll, потому что это позволит вам незаметно установить переменную экземпляра один раз, а затем использовать ее во всех ваших тестах. Допустимо, но очень неприятно для интеграционных тестов. TestNG дает пользователям выбор здесь. У Junit этого нет по дизайну, что раздражает.
Поставщики данных Testng немного более гибкие, чем эквивалент JUnit. Вы можете указать для каждого теста, какой метод поставщика данных должен предоставлять входные данные, вместо того, чтобы использовать единый подход для всего класса, как в JUnit. Таким образом, у вас могут быть поставщики положительных и отрицательных данных для ваших тестов в одном классе. Очень приятно иметь.
Вы можете пометить класс с помощью @Test
in testng, что означает: каждый общедоступный метод является тестом. В Junit вам нужно копировать / вставлять @Test
для каждого метода.
Раздражает то, как hamcrest связан с JUnit, а как JUnit связан с testng. В maven есть альтернативные банки, у которых нет этой проблемы.
Меня больше всего беспокоит то, что оба фреймворка перестали развиваться. Релизы происходят все реже и имеют все менее примечательные особенности. Например, все движение BDD, похоже, мало повлияло на любую структуру. Кроме того, JUnit мог просто перенять большую часть того, что я перечислил выше. Нет веских технических причин, по которым JUnit не может реализовать что-либо из этих вещей; люди, стоящие за JUnit, просто предпочитают не реализовывать эти вещи. Оба проекта, похоже, также не имеют видения будущих направлений, и они, кажется, счастливы, внося лишь незначительные изменения в последние несколько лет.
Я искал веские причины переключить TestNG на JUnit и нашел, что эти слайды Томека Качановски очень хорошо отвечают на этот вопрос. Томек - автор книги « Практическое модульное тестирование», которую, похоже, очень уважают разработчики и тестировщики.
Если вы работаете над проектом Java / Scala и Gradle - ваш предпочтительный инструмент сборки, имейте в виду, что ScalaTest
фреймворк должен только JUnitRunner
запускать ваши тесты scala. Другими словами, у вас есть выбор:
Вы можете использовать Mockito в качестве фреймворка для насмешек. Он прекрасно интегрируется с TestNG. Вам не нужно расширять какой-либо класс, чтобы использовать Mockito с TestNG. Таким образом, ваш код тестирования менее связан, и если по какой-либо причине вам нужно использовать другие фреймворки для имитации, это легко сделать.
В двух словах..
Если ваша область действия ограничена мелкими подробными модульными тестами без каких-либо зависимостей между ними, тогда можно использовать JUnit.
Если ваша область требует функционального тестирования, которое может / не может требовать зависимостей и совместного использования данных (параметров) между тестами, выберите TestNG. Кроме того, TestNG может выполнять модульное тестирование, подобное JUnit. Итак, у вас может быть набор модульных тестов и набор функциональных тестов.