JUnit 4 против TestNG - обновление 2013–2014 гг. [Закрыто]

88

JUnit 4 и TestNG раньше были сопоставимы. Каковы плюсы и минусы двух сред тестирования?

ctekk
источник
Если вы смотрите на сравнение функций, есть хорошая статья mkyong о jUnit 4 Vs testNG, если вы хотите сослаться на сравнение использования. Есть хорошая статья Капила Надежды, которая помогает!
Anshu
71
Я считаю, что подобные вопросы чрезвычайно полезны для SO ... Я хотел поблагодарить вас за то, что рискнули задать его, и поздравить с тем, что он не закрылся!
user1445967
Способ пойти против подобных вашей аудитории: D
ctekk 03
2
Увидев этот вопрос снова после стольких лет. Самое смешное - я чую заговор! Мой вопрос был полностью сфокусирован на различных функциях, затем было редактирование «сообщества», которое изменило мой вопрос на «за и против», а затем вопрос был закрыт из-за мнения. Lmao.
ctekk

Ответы:

29

Сегодня я сравнивал 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 лучше поддерживается.

JeroenHoek
источник
5
Не то, чтобы существуют альтернативные реализации параметризованных тестов, например code.google.com/p/junitparams. И если вам не нравится какой-либо из них, вы можете написать свой собственный - это то, что мне нравится в расширяемости JUnit. ;)
Эско Луонтола
17

Исходя из моего опыта работы с обеими фреймворками, testng имеет несколько удобных функций, которые команда JUnit отказывалась реализовывать в течение нескольких лет. По этой причине я предпочитаю его JUnit. Преобразовать в testng легко, поскольку он в основном поддерживает почти все в JUnit (есть даже плагин конвертера для eclipse), обратное преобразование в JUnit не так уж и здорово из-за этих недостающих функций.

  • В testng @BeforeClassметоды не являются статическими и выполняются перед запуском тестов в этом классе, а не при загрузке тестового класса (поведение JUnit). Однажды у меня был проект JUnit, в котором все тесты базы данных (несколько десятков) инициализировали базу данных с самого начала, что было довольно идиотским поведением. В сообществе JUnit было много споров за и против этого. Суть его заключалась в том, что каждый тестовый метод должен иметь свое собственное тестовое устройство, и поэтому у вас не должно быть нестатического метода стиля beforeAll, потому что это позволит вам незаметно установить переменную экземпляра один раз, а затем использовать ее во всех ваших тестах. Допустимо, но очень неприятно для интеграционных тестов. TestNG дает пользователям выбор здесь. У Junit этого нет по дизайну, что раздражает.

  • Поставщики данных Testng немного более гибкие, чем эквивалент JUnit. Вы можете указать для каждого теста, какой метод поставщика данных должен предоставлять входные данные, вместо того, чтобы использовать единый подход для всего класса, как в JUnit. Таким образом, у вас могут быть поставщики положительных и отрицательных данных для ваших тестов в одном классе. Очень приятно иметь.

  • Вы можете пометить класс с помощью @Testin testng, что означает: каждый общедоступный метод является тестом. В Junit вам нужно копировать / вставлять @Testдля каждого метода.

Раздражает то, как hamcrest связан с JUnit, а как JUnit связан с testng. В maven есть альтернативные банки, у которых нет этой проблемы.

Меня больше всего беспокоит то, что оба фреймворка перестали развиваться. Релизы происходят все реже и имеют все менее примечательные особенности. Например, все движение BDD, похоже, мало повлияло на любую структуру. Кроме того, JUnit мог просто перенять большую часть того, что я перечислил выше. Нет веских технических причин, по которым JUnit не может реализовать что-либо из этих вещей; люди, стоящие за JUnit, просто предпочитают не реализовывать эти вещи. Оба проекта, похоже, также не имеют видения будущих направлений, и они, кажется, счастливы, внося лишь незначительные изменения в последние несколько лет.

Джиллес ван Гурп
источник
9

Я искал веские причины переключить TestNG на JUnit и нашел, что эти слайды Томека Качановски очень хорошо отвечают на этот вопрос. Томек - автор книги « Практическое модульное тестирование», которую, похоже, очень уважают разработчики и тестировщики.

MajiK
источник
1

Если вы работаете над проектом Java / Scala и Gradle - ваш предпочтительный инструмент сборки, имейте в виду, что ScalaTestфреймворк должен только JUnitRunnerзапускать ваши тесты scala. Другими словами, у вас есть выбор:

  • Тесты Java JUnit + тесты Scala запускаются с JUnitRunner => Лучшая интеграция с Gradle
  • Тесты Java testNG + тесты Scala запускаются с помощью Scala Runner => Плохая интеграция с Gradle, так как scala test runner - это отдельная массовая задача с точки зрения Gradle.
Иван Балашов
источник
0

Вы можете использовать Mockito в качестве фреймворка для насмешек. Он прекрасно интегрируется с TestNG. Вам не нужно расширять какой-либо класс, чтобы использовать Mockito с TestNG. Таким образом, ваш код тестирования менее связан, и если по какой-либо причине вам нужно использовать другие фреймворки для имитации, это легко сделать.

Эль До
источник
7
Этот ответ совершенно не имеет отношения к вопросу ....
Адриан Шам
11
@AdrianShum Я думаю, что Конрад пытался прокомментировать точку зрения JeroenHoek об интеграции PowerMock с TestNG, поскольку у него, похоже, нет привилегии «комментировать», я полагаю, он поместил свой комментарий в качестве ответа
Taoufik Mohdit
1
Этот ответ неправильно понимает, что такое PowerMock. Это не замена Mockito, а дополнение, которое позволяет Mockito издеваться над некоторыми вещами, которые сам Mockito не может делать (статические методы, финальные классы).
stickfigure
0

В двух словах..

Если ваша область действия ограничена мелкими подробными модульными тестами без каких-либо зависимостей между ними, тогда можно использовать JUnit.

Если ваша область требует функционального тестирования, которое может / не может требовать зависимостей и совместного использования данных (параметров) между тестами, выберите TestNG. Кроме того, TestNG может выполнять модульное тестирование, подобное JUnit. Итак, у вас может быть набор модульных тестов и набор функциональных тестов.

набстер
источник