Кастомизация отчетов TestNG в IDE intellij idea.(изменить названия методов)

ide
idea
java
testng
Теги: #<Tag:0x00007f7b68375a10> #<Tag:0x00007f7b683758d0> #<Tag:0x00007f7b68375790> #<Tag:0x00007f7b68375650>

(Hikari Senshi) #1

Доброго времени суток, уважаемые автоматизаторы.
TestNG, когда формирует отчеты использует стандартные listeners и reporters.Насколько мне известно , пользователь может написать свои.
Необходимо сделать так, чтобы testNG вместо названий запущенных методов отображал их описания, или хотя бы имена, которые присваиваются в параметрах аннотации (testName).Насколько мне известно, то в документации testNG нет таких возможностей.
Можно ли это как-то реализовать , используя разные “хаки” или менять имена “на лету” с помощью listeners?
Вот пример текущего отчета testNG:

Вот пример разметки с тестом:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Тестирование подсказки при поиске товара">
    <test name="Проверка окошка с подсказкой (первый запуск)">
        <parameter name="search" value="игрушка"/>

        <classes>
            <class name="cases.teddy.nonAuthorized.search_hint.SearchHintCase" >
                <methods>
                    <include name="testSearchHint"/>
                    <include name="testShowedAllItemsOnPage"/>
                    <include name="checkItemsAvailability"/>
                </methods>
            </class>
        </classes>
    </test>
    <test name="Проверка окошка с подсказкой (второй запуск)">
        <parameter name="search" value="емкость"/>

        <classes>
            <class name="cases.teddy.nonAuthorized.search_hint.SearchHintCase" >
                <methods>
                    <include name="testSearchHint"/>
                    <include name="testShowedAllItemsOnPage"/>
                    <include name="checkItemsAvailability"/>
                </methods>
            </class>
        </classes>
    </test>
    <test name="Проверка окошка с подсказкой (третий запуск)">
        <parameter name="search" value="пюре"/>

        <classes>
            <class name="cases.teddy.nonAuthorized.search_hint.SearchHintCase" >
                <methods>
                    <include name="testSearchHint"/>
                    <include name="testShowedAllItemsOnPage"/>
                    <include name="checkItemsAvailability"/>
                </methods>
            </class>
        </classes>
    </test>

</suite>

Пытался в include добавлять description, но это не помогло.Есть какие-то идеи , как решить эту задачу?


#2

Привет. Может это тебе поможет, если я правильно понял.

public void onTestStart(ITestResult result) {
System.out.prinln(result.getMethod().getDescription());
}
@BeforeMethod
public void beforeMethod(Method method) {
    Test test = method.getAnnotation(Test.class);
    System.out.println("Test name is " + test.testName());
    System.out.println("Test description is " + test.description());
}

Вариантов много на самом деле, вам в помощь документация TestNg.


(Hikari Senshi) #3

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


(Hikari Senshi) #4

Господа, было обнаружено решение проблемы:

  1. необходимо реализовать интерфейс ITest и реализовать метод getTestName();
  2. необходимо создать переменную содержащую имя теста
  3. Необходимо сделать метод который будет определять имя теста
    Вот код, вкратце отражающий данную возможность
package cases.custom;

import org.testng.ITest;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

@Test(testName  = "Проверка работы смены имени")
public class changeNameTest implements ITest {

    private ThreadLocal<String> testName = new ThreadLocal<>();

    @BeforeMethod
    public void BeforeMethod(Method method, Object[] testData){
        Annotation[] declaredAnnotations = method.getDeclaredAnnotations();
        boolean before = false;

        for (Annotation annotation : declaredAnnotations){
            if (annotation instanceof BeforeMethod)before = true;
        }
        if(before) {
            Test a = method.getAnnotation(Test.class);
            String name = a.testName();
            testName.set(name);
        }else testName.set("специальный системный метод");

        }


    @Test(testName = "Первый")
    public static void firstTest(){
        System.out.println("test");
    }


    @Test(testName = "Второй")
    public void secondTest(){}

    @Test(testName = "Третий")
    public void thirdTest(){}

    @Override
    public String getTestName() {
        return testName.get();
    }
    
}


(Vatslau) #5

Жаль что тестНг отстало от Junit5
надеюсь у них есть это в планах
@DisplayName(“adsasdadad”)


(Hikari Senshi) #6

Лично мое скромное мнение, что JUnit 5 фуфло, потому, что не поддерживает создание сьютов(, в отличие от JUnit 4, который к сожалению не отображает имена, как надо.


(Vatslau) #7

Да в остальном Junit5 сырой (пришлось отказаться после ряда тестов)
но эта фича удобна


(Vatslau) #8

Идея не видит связей методов в хмлках

<methods> <include name="testSearchHint"/> </methods>
только классы
У всех так или только у меня(версия комьюнити)


(Hikari Senshi) #9

Вы имеете ввиду параметры dependsOnMethods/Groups?
Или TestNG просто не может найти необходимый код?
Если вам нужно просто контроллировать порядок запуска, то воспользуйтесь параметром priority. Если вопрос заключается не в этом, то скиньте, пожалуйста весь код( класс и xml) и я посмотрю, что можно сделать.


(Vatslau) #10

image

классы ок - есть связь плагина с кодом
image

вообщем похоже плагин не “видит методы”


(Hikari Senshi) #11

Это похоже на какой-то частный случай, потому что мне не удалось прийти к этой ошибке.
Возможно нужно просто переустановить Intellij Idea