В JUnit 4 против для TestNG - обновления 2013 - 2014 [закрыт]


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

6 86

6 ответов:

сегодня я сравнивал TestNG и JUnit4, и главное преимущество, которое я могу указать с моим ограниченным опытом в тестировании-фреймворках, заключается в том, что TestNG имеет более элегантный способ обработки параметризованных тестов с концепцией поставщика данных.

насколько я могу судить с JUnit4 вы должны создать отдельный тестовый класс для каждого набора параметров, которые вы хотите проверить с (ran with @RunWith(Parameterized.class)). С помощью TestNG вы можете иметь несколько поставщиков данных в одном тестовом классе, поэтому вы можете сохранить все ваши тесты для одного класса в одном тестовом классе.

пока это единственное, что я могу указать в качестве преимущества TestNG над JUnit4.

Intellij идея включает в себя поддержку TestNG и JUnit из коробки. Однако Eclipse поддерживает только JUnit из коробки и нуждается в установленном плагине TestNG, чтобы заставить его работать.

однако более раздражающая проблема, с которой я столкнулся с TestNG, заключается в том, что ваши тестовые классы должны расширяться PowerMockTestCase Если вы используете PowerMock для макета зависимостей в ваших тестах. По-видимому, есть способы настроить объект-фабрику, о которой ваша тестовая платформа должна знать при использовании PowerMock с помощью специального метода или через testng.xml определение suite, но они, похоже, нарушены на данный момент. Мне не нравится, что тестовые классы расширяют классы test-framework, это кажется хакерским.

Если вы не используете PowerMock это не проблема, конечно, но в целом у меня создается впечатление, что JUnit4 лучше поддерживаемый.

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

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

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

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

раздражение с обоими является то, как hamcrest в комплекте с JUnit и то, как JUnit в комплекте с testng. Есть alterate банки в maven, которые не имеют этого вопрос.

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

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

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

  • Java JUnit tests + Scala тесты выполняются с JUnitRunner = > лучше Gradle integration
  • тесты Java testNG + тесты Scala выполняются с помощью Scala Runner = > плохая интеграция Gradle, так как Scala Test runner-это одна массовая задача с точки зрения Gradle.

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

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

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

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