Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

ExtendNG - Избавляемся от boilerplate в TestNG

java8
java
testng
Теги: #<Tag:0x00007fedc16f3838> #<Tag:0x00007fedc16f2e60> #<Tag:0x00007fedc16f28c0>

(Ярослав Орёл) #1

Привет всем. Мне очень нравится TestNG как тест раннер, но бывают случаи когда чего-то не хватает или что-то кажтеся неудобным. Такие случаи я решил собрать в отдельную небольшую библиотеку и поделиться ею с окружающими. Она называется ExtendNG: https://github.com/yaroslav-orel/ExtendNG . Состоит она из набора лисенеров которые можно подключать к тестовым классам.

На данный момент ExtendNG содержит несколько лисенеров:

1. MethodInGroupsListener

Позволяет определять методы которые будут выполняться перед.после тестов помеченных отдельной группой. Удивительно, что у TestNG нет подобной фишки. Все что надо сделать это повесить лисенер над классом @Listeneres(MethodInGroupsListener .class) и объявить метод с аннотацией @BeforeMethodInGroups или @AfterMethodInGroups
Например:

@Listeners({MethodInGroupsListener.class})
public class MethodInGroupsExample {

@BeforeMethodInGroups(groups = "target")
public void before(){
    System.out.println("Before test in target group");
}

@AfterMethodInGroups(groups = "target")
public void after(){
    System.out.println("After test in target group");
}

@Test(groups = "target")
public void target1(){
    System.out.println("target1");
}

@Test(groups = "target")
public void target2(){
    System.out.println("target2");
}

@Test
public void nonTarget(){
    System.out.println("nonTarget");
}

2. OrderByGroupsListener

Если вы хотите, чтобы тесты из разных групп запускались по соседству, для этого приходится очень много танцевать с бубном. OrderByGroupsListener делает это в одну строку. Если нужно определить порядок запуска групп, то это делается с помощью метода c аннотацией @GroupOrder, который возвращает String[] с названиями ваших групп в нужном порядке.

@GroupOrder
public String[] groupOrder(){
return new String[]{“first”, “second”, “third”};
}

OrderByDeclarationListener

Мы знаем что зависимости в тестах это не хорошо, но иногда это вынуженная необходимость. Вместо того чтобы расставлять dependsOnMethods, создавать xml с прописанным порядком или добавлять priority к каждому тесту, можно просто добавить над классом @Listeners(OrderByDeclarationListener.class) и тесты запустятся в том порядке в котором они задекларированы в классе.При этом если какой-то тест упал, то следующие все равно запустятся.

FastFailListener

По большому счету этот лисенер это добавка к предыдущему OrderByDeclarationListener которая останавливает тест класс, если какой-то промежуточный тест падает. Т.е. это прямой аналог dependsOnMethod без alwaysRun=true

Больше информации и реальных примеров можно найти на гитхабе в ридми https://github.com/yaroslav-orel/ExtendNG

Дисклеймер

Это мой первый публичный проект со всеми вытекающими. Я еще не до конца разобрался как правильно публиковать такие вещи. Пока что библиотека доступна только на jcenter. Если и кого-то есть знания и желание помочь, я бы хотел зарелизить ExtendNG в maven central, чтобы больше людей имело к ней доступ.

PS

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


(Sergey Korol) #3

Для публикации в maven нужно отправить запрос на создание соответствующего namespace в maven central (если еще не существует). Ну и собственно добавить build конфиг для публикации. Когда запрос заапрувят, можно будет сразу после release синкаться с maven central из jcenter. 10 мин и артефакт в maven. Через пару часов появляется в поиске.

Касательно кода: рекомендую взглянуть на то, как тестируют слушателей сами разработчики TestNG. У них есть достаточно интересная техника, не требующая создания счетчиков.

Неплохо было бы еще подключить jacoco и немного оптимизировать работу со стримами.


(Ярослав Орёл) #4

Спасибо за отзыв. Сделал namespace в мавене. Буду пробовать пушить.
У меня подключен сонар к проекту, но покрытие не трекается (0%). Наверно нужна отдельная настройка.
Про оптимизацию рад услышать ваши предложения.


(Ярослав Орёл) #5

Апдейт.
ExtendNG успешно заехал в мавен репозиторий.

Maven:

<dependency>
	<groupId>com.github.yaroslav-orel</groupId>
	<artifactId>ExtendNG</artifactId>
	<version>1.0.1</version>
</dependency>

Gradle:

dependencies {
    testCompile 'com.github.yaroslav-orel:ExtendNG:1.0.1'
}

(Ярослав Орёл) #6

Привет всем. Хочу поделиться новостью. Вышел новый релиз ExtendNG 1.1
Этот релиз по большей части рефакторинг кода и тестов. Тем не менее туда протиснулись также пара новых фич:

  1. В @BeforeMethodInGroup и @AfterMethodInGroup теперь можно инжектить в виде параметров объекты следующих типов:Method,ITestResult, ITestContext, XmlTest.
  2. Аннотацию @GroupOrder сейчас можно ставить и над тестовым классом и определять порядок групп через аттрибут groups.

Также прошу заметить, что методы с аннотацией @GroupOrder теперь должны возвращать List<String> вместо String[].

Обновляйте зависимости и оставляйте фидбек по поводу того какие еще фишки вы хотели бы видеть в следюущем релизе. Это также можно сделать создав ишью на гитхабе https://github.com/yaroslav-orel/ExtendNG

Всем удачного тестирования.