TestNG против Спока для автоматизации
Мы смотрим на реализацию тестового фреймворка и интересуемся, какой фреймворк использовать. Мы выбираем между TestNG и Spock. Это будет среда автоматизации пользовательского интерфейса, поэтому она должна обрабатывать как можно меньше ложных данных. Наша кодовая база будет состоять из Geb (Groovy).
При этом у Спока есть три преимущества перед TestNG:
Подробная информация Среда выполнения Спока собирает огромное количество информации и предоставляет ее вам при необходимости. Условие не выполнено:
max(a, b) == c
| | | | |
3 1 3 | 2
false
Прекрасный язык Выразите свои мысли на красивом и очень выразительном языке спецификаций.
def "subscribers receive published events at least once"() {
when: publisher.send(event)
then: (1.._) * subscriber.receive(event)
where: event << ["started", "paused", "stopped"]
}
Расширяемый для всех@Transaction? @SpringBean? @DeployApp? С помощью механизма расширений Spock, основанного на перехвате, вы можете легко создавать свои собственные расширения.
У кого-нибудь есть мнение, почему один может быть лучше другого?
Есть ли недостатки либо?
Есть ли способ создать "красивый язык" в отчетах для TestNG? По сути, я могу создать свои собственные теги и иметь программу для их анализа? Или уже есть сторонняя библиотека для добавления?
Спасибо за вашу помощь в продвинутом.
2 ответа
Для автоматизации пользовательского интерфейса взгляните на Geb, прежде чем пытаться создать новую среду. http://www.gebish.org/
Geb будет работать как со споком, так и с TestNG.
В целом, у меня был действительно хороший опыт работы со споком, но я не могу говорить с TestNG.
Хотелось бы, чтобы у spock были отчеты в стиле BDD, такие как Cucumber, и тестирование стиля свойств, например, ScalaCheck, но, поскольку это простое тестирование в стиле TDD, спок является выразительным, простым в использовании, многофункциональным и действительно хорошо разработанным. По сравнению с такими вещами, как JUnit, спок - это радость - требуется очень мало церемоний.
Я использую TestNG в течение нескольких лет, нескольких проектов, и я вполне доволен этим. Отвечая на конкретные вопросы вашего вопроса
Красивый язык
Имя метода тестирования должно быть допустимым именем метода Java. Это означает, что нет пробелов. Я начинаю свои методы с следует, поэтому я бы назвал ваш метод subscribers receive published events at least once
как shouldSubscrbersReceiveEvents
, Я считаю, что это короткое имя описывает намерение достаточно хорошо. Имена верблюдов не так удобны для чтения, как правильные предложения, но другого выбора нет.
Разделы с указанием, когда тогда
TestNG не имеет встроенной функции для поддержки этого. Я делаю это вручную, используя комментарии. Нет фреймворковой поддержки для таких функций, как:
- параметры, поступающие из
where:
разделы. Вы можете использовать@DataProviders
для этого. - утверждения для заявлений в
then:
раздел. Вы должны написать утверждения (assertThat
) самостоятельно.
Мой образец теста:
public void shouldUnmarshalDataHeader() throws IOException {
//given DataHeader unmarshalled from InputStream
DataHeader actual = sut.parseDataHeader(stringToInputStream(BINARY_DATA_HEADER));
//when we create DataHeader using java API
DataHeader expected = DataHeaderBuilder
.sampleInstance(sut.dateTimeProvider.getLocalDateTime());
//then those two objects are equal
Assertions.assertThat(actual).isEqualTo(expected);
}
Подробная информация
Эта функция принадлежит библиотеке утверждений, а не библиотеке тестов. TestNG имеет встроенную библиотеку утверждений, но вы можете использовать любую другую библиотеку. Для меня https://joel-costigliola.github.io/assertj/ работает лучше всего. Сообщения с утверждениями лучше, чем сообщения от обычного testNG или JUnit. AssertJ предлагает свободный API. Существует очень мало кривой обучения.
Когда у тебя есть import static org.assertj.core.api.Assertions.*;
Просто введите assertThat(something).
и полный код из IDE поможет вам. Чем лучше вы используете утверждения, тем более читабельным будет ваш тест и тем лучше будут сообщения об ошибках.
растяжимый
Spring имеет встроенную поддержку TestNG. Ваш тест должен быть продлен AbstractTestNGSpringContextTests
или же AbstractTransactionalTestNGSpringContextTests
, После этого вы сможете загружать любой Spring Spring Context, bean-компонент Spring в свой тест, использовать транзакции.
См. http://docs.spring.io/spring/docs/current/spring-framework-reference/html/integration-testing.html для получения дополнительной информации.
Резюме
Для меня TestNG работает хорошо. Вы можете протестировать все, что можете протестировать с помощью Спока. Поскольку TestNG - это чистый Java, DSL для написания тестов не будет столь же многофункциональным, как Groovy в Spock. Но я считаю, что TestNG+AssertJ имеет более плавную кривую обучения, чем Спок (для Java-разработчика). Если кто-то заинтересован в использовании Groovy (может быть, вы тоже хотите использовать Groovy для производственного кода?), То Spock - прекрасный выбор, который стоит первоначальных вложений в обучение.
Для изучения TestNG я настоятельно рекомендую "Практическое модульное тестирование с TestNG и Mockito" ( http://practicalunittesting.com/) и "Тестирование Java следующего поколения: TestNG и расширенные концепции" ( http://testng.org/doc/book.html).
Обновление октябрь 2018
Выше пост был написан в 2016 году. На данный момент у нас Junit5. Junit5 закрывает пробел между junit4 и TestNG. Есть несколько мест, где Junit5 более многофункциональн, чем testNG (пример: лучшая поддержка параметризованных методов тестирования).
Я использовал jUnit5 в нескольких коммерческих проектах, и я доволен этим.
Junit5 по-прежнему является чистой Java, так что нет никакой поддержки на уровне языка для заданных когда тогда разделов или утверждений, как в споке. Я все еще использую AssertJ и несколько других сопутствующих инструментов (пример: https://github.com/awaitility/awaitility для тестирования асинхронных операций)