JUnit против TestNG

На работе мы все еще используем JUnit 3 для запуска наших тестов. Мы рассматривали возможность перехода на JUnit 4 для написания тестов new, но я некоторое время смотрел на TestNG. Какой опыт у вас был с JUnit 4 или TestNG, и который, похоже, работает лучше для очень большого количества тестов? Наличие гибкости при написании тестов также важно для нас, поскольку наши функциональные тесты охватывают широкий аспект и должны быть написаны различными способами для получения результатов.

Старые тесты не будут переписаны, поскольку они выполняют свою работу просто отлично. То, что я хотел бы видеть в новых тестах, - это гибкость в способе написания теста, естественных утверждений, группировки и легко распределенных тестовых исполнений.

Ответ 1

Я использовал оба, но я должен согласиться с Justin Standard, что вы не должны действительно переписывать свои существующие тесты в любой новый формат. Независимо от решения, довольно просто запустить оба. TestNG стремится быть гораздо более настраиваемым, чем JUnit, но в итоге они оба работают одинаково хорошо.

TestNG имеет опрятную функцию, где вы можете отмечать тесты как определенную группу, а затем легко запускать все тесты определенной группы или исключать тесты определенной группы. Таким образом, вы можете отмечать тесты, которые выполняются медленно, как в "медленной" группе, а затем игнорируют их, когда вам нужны быстрые результаты. Предложение из их документации состоит в том, чтобы отметить некоторые подмножества как "контрольные" тесты, которые должны выполняться всякий раз, когда вы проверяете новые файлы. Я никогда не видел такой функции в JUnit, но опять же, если у вас ее нет, t ДЕЙСТВИТЕЛЬНО пропустите это.

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

Самое большое преимущество TestNG - аннотации... которые JUnit добавили в версии 4 в любом случае.

Ответ 2

Сначала я бы сказал, не переписывайте все свои тесты, чтобы соответствовать последней причуде. Junit3 работает отлично, а введение аннотаций в 4 не покупает вас очень (на мой взгляд). Гораздо важнее, чтобы вы, ребята, записывали тесты, и это звучит так, как вы.

Используйте все, что кажется наиболее естественным, и поможет вам выполнить вашу работу.

Я не могу комментировать TestNG b/c. Я не использовал его. Но я бы рекомендовал unitils, отличную оболочку для JUnit/TestNG/DBUnit/EasyMock, независимо от того, какой маршрут вы берете. (Он поддерживает все вкусы, упомянутые выше)

Ответ 3

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

Мы решили придерживаться JUnit и никогда не оглядывались назад.

Ответ 4

Самые большие карты DrawNG для меня включают в себя его группы поддержки тестирования и, что более важно, - зависимости тестовой группы (маркировка теста как зависящего от группы заставляет тесты просто пропускать работу, когда зависимая группа выходит из строя).

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

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

(отказ от ответственности - я вообще не использовал JUnit 4.x, поэтому я не могу комментировать продвижение или новые функции там).

Ответ 5

Приветствует все вышеперечисленное. Некоторые другие вещи, которые я лично нашел, мне больше нравится в TestNG:

  • @BeforeClass для TestNG имеет место после создания класса, поэтому вы не ограничены тем, что можете называть в нем статические методы своего класса.

  • Параллельные и параметризованные тесты, возможно, мне просто не хватает жизни... но я просто получаю удар, пишущий один набор тестов Selenium, принимая имя драйвера в качестве параметра. Затем определите 3 параллельные тестовые группы, по 1 для драйверов IE, FF и Chrome, и просмотрите расы! Я изначально сделал 4, но слишком много страниц, над которыми я работал, разбил драйвер HtmlUnit по той или иной причине.

Да, наверное, нужно найти эту жизнь.;)

Ответ 6

Я хотел поделиться тем, с которым я столкнулся сегодня. Я обнаружил, что встроенный параметрированный бегун довольно груб в Junit4 по сравнению с TestNG (я знаю, что каждая структура имеет свои сильные стороны, но все же). Параметры @annamation @Junit4 ограничены одним набором параметров. Я столкнулся с этой проблемой при проверке действительного и недопустимого поведения для функциональности в том же классе тестов. Таким образом, будет использован первый публичный, статический аннотированный метод, который он найдет, но он может найти их в любом порядке. Это заставляет нас писать разные классы без необходимости. Однако TestNG предоставляет чистый способ предоставления различных типов поставщиков данных для каждого метода. Таким образом, мы можем протестировать одну и ту же единицу кода с допустимым и недопустимым способом в одном классе тестов, поместив действительные/недопустимые данные отдельно. Я поеду с TestNG.

Ответ 7

Также еще одно преимущество TestNG - поддержка параллельного тестирования. В нашу эпоху мультикоросов это важно, я думаю.

Я также использовал обе структуры. Но я использую hamcrest для утверждений. Hamcrest позволяет вам легко написать свой собственный метод assert. Поэтому вместо

assertEquals(operation.getStatus(), Operation.Status.Active);

Вы можете написать

assertThat(operation, isActive());

Это дает вам возможность использовать более высокий уровень абстракции в ваших тестах. И это делает ваши тесты более надежными.

Ответ 8

JUnit 4 Vs TestNG - Сравнение от mkyong.com (обновлено в 2013 году).

Заключение: Я предлагаю использовать TestNG в качестве основы базового модульного тестирования для проекта Java, поскольку TestNG более продвинут в тестировании параметризации, тестировании зависимостей и тестировании комплектов (концепция группировки).

TestNG предназначен для функционального тестирования высокого уровня и комплексного тестирования интеграции. Его гибкость особенно полезна для больших наборов тестов.

Кроме того, TestNG также охватывает всю функциональность ядра JUnit4. Мне просто больше не нужно использовать JUnit.

Проще говоря, TestNG = JUnit + намного больше. Итак, зачем спорить? иди и возьми TestNG :-)

Вы можете найти более подробное сравнение здесь.

Ответ 9

Несколько дополнений к ответу Майка Стоуна:

1) Чаще всего я использую группы TestNG, когда я хочу запустить один метод тестирования в наборе тестов. Я просто добавляю этот тест в группу "Фил", а затем запускаю эту группу. Когда я использовал JUnit 3, я закомментировал записи для всех методов, кроме того, который я хотел запустить в методе "suite", но затем обычно забывал раскомментировать их перед проверкой. С группами у меня больше нет этой проблемы.

2) В зависимости от сложности тестов, перенос тестов из JUnit3 в TestNG может выполняться несколько автоматически с помощью sed и создания базового класса для замены TestCase, который статически импортирует все методы TestNG assert.

У меня есть информация о моей миграции из JUnit в TestNG здесь и здесь.

Ответ 10

Почему мы используем TestNG вместо JUnit?

  • Объявление метода @BeforeClass и @AfterClass должно быть статичным в JUnit, тогда как в TestNG в объявлении метода больше гибкости, у него нет этих ограничений.

  • В TestNG мы можем параметризовать тесты, используя 2 способа. @Parameter или @DataProvider.

    i) @Parameter для простых случаев, когда требуется сопоставление значений ключей (данные предоставляются через XML файл)

    ii) @DataProvider для сложных случаев. Используя 2-мерный массив, он может предоставлять данные.

  • В TestNG, поскольку метод @DataProvider не обязательно должен быть статическим, мы можем использовать несколько методов поставщика данных в том же классе тестов.

  • Тестирование зависимостей: В TestNG, если исходный тест завершился с ошибкой, все последующие зависимые тесты будут пропущены, а не отмечены как сбой. Но JUnit отметил, что это не удалось.

  • Группирование: Отдельные тесты могут принадлежать нескольким группам, а затем работать в разных контекстах (например, медленные или быстрые тесты). Подобная функция существует в категориях JUnit, но не содержит аннотаций @BeforeGroups/@AfterGroups TestNG, которые позволяют инициализировать тест/отторжение.

  • Parallelism: Если вам нравится запускать один и тот же тест параллельно в нескольких потоках, TestNG вы использовали простую в использовании аннотацию, в то время как JUnit не предлагает простой способ сделать поэтому из коробки.

  • TestNG @DataProvider также может поддерживать XML для подачи данных, CSV или даже текстовых файлов.

  • TestNG позволяет объявлять зависимости между тестами и пропускать их, если тест зависимости не прошел.

@Test (dependOnMethods = { "dependOnSomething" })

Эта функция не существует в JUnit

  1. Отчетность:

Отчеты TestNG по умолчанию генерируются в папку тестового вывода, которая включает в себя отчеты HTML со всеми тестовыми данными, переданные/сбойные/пропущенные, сколько времени они выполняли, какой вход использовался и все тестовые журналы. Кроме того, он также экспортирует все в XML файл, который можно использовать для создания собственного шаблона отчета.

На фронте JUnit все эти данные также доступны через XML, но нет отчета из коробки, и вам нужно полагаться на плагины.

Ссылка на ресурс:

В этом руководстве дается хорошая разница: TestNG Vs JUnit: Какая разница?

Ответ 11

Мне нравится аккуратная и простая интеграция TestNG с Guice.

Ответ 12

Ваш вопрос кажется мне сложенным. На одном вы хотели бы сравнить две тестовые рамки, с другой стороны, вы хотели бы легко выполнять тесты, иметь естественные утверждения и т.д.

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

JUnit по-прежнему требует, чтобы определенные методы before/after были статическими, что ограничивает то, что вы можете сделать до запуска тестов, TestNG никогда не сталкивается с этой проблемой.

TBH, в основном различия между этими двумя структурами не означают многого, если только вы не сосредоточитесь на тестировании интеграции/автоматизации. JUnit из моего опыта строится с нуля для модульного тестирования и в настоящее время подталкивается к более высоким уровням тестирования, что ИМО делает его неправильным инструментом для работы. TestNG отлично справляется с модульным тестированием и благодаря своим надежным средствам передачи данных и отличным возможностям тестирования, работает еще лучше на уровне тестирования интеграции/автоматизации.

Теперь я считаю, что это отдельная проблема, как писать хорошо структурированные, читаемые и поддерживаемые тесты. Большинство из этого, я уверен, вы знаете, но такие вещи, как Factory Шаблон, Шаблон команды и PageObjects (если ваши веб-сайты тестирования), очень важно иметь слой абстракции между тем, что ваше тестирование (SUT) и каков фактический тест (утверждения бизнес-логики). Чтобы иметь более приятные утверждения, вы можете использовать Hamcrest. Используйте javas-наследование/интерфейсы для уменьшения повторения и обеспечения общности.

Почти забыл, также используйте шаблон построения тестовых данных, это в сочетании с аннотацией к DataTrovider TestNG очень полезно.

Ответ 13

Мое мнение о том, что делает TestNG еще более мощным:

1.  JUnit still requires the before/after class methods to be static, which limits
    what you can do prior to the running of tests, TestNG never has this issue.

2.  TestNG @Configuration methods can all take an optional argument to their 
    annotated methods in the form of a ITestResult, XmlTest, Method, or 
    ITestContext.  This allows you to pass things around that JUnit wouldn't 
    provide you.  JUnit only does this in listeners and it is limited in use.

3.  TestNG comes with some pre-made report generation classes that you can copy
     and edit and make into your own beautiful test output with very little 
     effort. Just copy the report class into your project and add a listener 
     to run it.  Also, ReportNG is available.

4.  TestNG has a handful of nice listeners that you can hook onto so you can do
     additional AOP style magic at certain phases during testing.

Ответ 14

оба почти одинаковы. TestNG имеет некоторые дополнительные функции, такие как тестовые костюмы и зависимость. пожалуйста, найдите прилагаемый скриншот, чтобы получить полное сравнение. полное сравнение Juni5 и TestNG

Ответ 15

Пожалуйста, используйте режим люстры:

public class MultiplyTwoNumbers {
    public static void main(String[] args) {
        float first = 1.5f;
        float second = 2.0f;
        float product = first * second;
        System.out.println("The product is: " + product);
    }
}