JUnit vs TestNG


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

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

13 112

13 ответов:

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

TestNG имеет аккуратную функцию, где вы можете пометить тесты как определенную группу, а затем легко запустить все тесты определенной группы или исключить тесты определенной группы. Таким образом, вы можете отметить тесты, которые выполняются медленно, как в "медленной" группе, а затем игнорировать их, когда вы хотите получить быстрые результаты. Предложение из их документации состоит в том, чтобы пометить некоторое подмножество как тесты "checkin", которые должны выполняться всякий раз, когда вы проверяете новые файлы. Я никогда не видел такой функции в JUnit, но опять же, если у вас ее нет, вы не пропустите ее.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

можно писать

assertThat(operation, isActive());

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

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

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

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

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

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

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

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

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

In simple terms, TestNG = JUnit + lot more...So, Why debate ? go and grab TestNG :-)

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

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

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

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

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

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

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

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

мое мнение о том, что делает 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.

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

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

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

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

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

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

  4. Зависимостей Тестирования: в TestNG, если первоначальный тест не удается, то все последующие зависимые тесты будут пропущены, а не помечен как сбойный. Но Джунит отметила, что это не удалось.

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

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

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

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

@Test(dependsOnMethods = {"dependOnSomething" })

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

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

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

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

Ссылка На Ресурс:

  1. быстрый вывод полученных против сравнения
  2. JUnit против TestNG: какую структуру тестирования вы должны выбрать?

хорошая разница дается в этом уроке бок о бок:TestNG против JUnit: в чем разница?