TestNG логирование


(vladyslav.gumenskyi) #1

День добрый,

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

Вот, что удалось найти:

- вставка скриншотов http://qtp-help.blogspot.com/2010/07/testng-take-screenshot-of-failed-test.html (спасибо за ссылку Мише Полярушу)

- логирование действий http://blog.simon-reekie.me/2011/05/21/logging-selenium-2-events-in-twist (нашел в этой ветке обсуждения http://automated-testing.info/forum/kak-sdelat-class-listener-dlya-webdriver-deystviy#comments)

 

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

 


(Sergey Korol) #2

Пишу на джаве. В свое время создавал 2 слушателя: 1) имплементирующий ITestListener для перегрузки событий TestNG - onTestFailure и т.п. 2) экстендящий AbstractWebDriverEventListener для перегрузки событий WebDriver - beforeFindBy и т.п.

Собственно, первый слушатель можно подключить к Base классу посредством аннотации @Listeners . Второй нужно подключать при помощи EventFiringWebDriver с его регистратором.

По скриншотам: создавал аннотацию AfterTestFailure, которую привязал к методу снятия скринов. Далее, при генерации события onTestFailure вызывал аннотированный метод:

    @Override
    public void onTestFailure(ITestResult iTestResult) {
        try {
            Object testCase = iTestResult.getInstance();
            Method testMethod = iTestResult.getMethod().getConstructorOrMethod().getMethod();
 
            logger.error("Fail: " + testMethod.getName(), iTestResult.getThrowable());
 
            invokeAnnotatedMethods(testCase, testMethod, AfterTestFailure.class);
        } catch (Exception e) {
            logger.error(e);
        }
    }
 
   private static void invokeAnnotatedMethods(Object testCase, Method testMethod, Class<? extends Annotation> annotation) throws InvocationTargetException, IllegalAccessException {
        Method[] methods = testCase.getClass().getMethods();
        for (Method method : methods) {
            if (method.isAnnotationPresent(annotation)) {
                method.setAccessible(true);
                method.invoke(testCase, testMethod);
            }
        }
    }

По поводу красоты: не перестану настаивать на том, что она тут даром не нужна. Главное, зафиксировать метод, на котором все посыпалось, и получить стектрейс. А красивенькие отчетики выдаст сам TestNG плагин в том же Jenkins.

P.S. Мы пишем тесты не для красоты, а для проверки функционала, UI и т.п. И в случае чего, нам нужно быстро определить точку, которая вызвала сбой. А если я буду хэндлить эксепшены завуалирвоанным кастомным текстом по типу "X method failed", то мне придется в итоге потратить гораздо больше времени на анализ причин сбоя. Мне кажется, что красивенький парсинг стектрейса - это необоснованная трата времени.


(vladyslav.gumenskyi) #3

Так а если у вас всего 2 слушателя было, каким образом информация в репорт попадала?


(Sergey Korol) #4

Количество слушателей никак не связано с объемом репорта. У нас может быть всего один ITestListener, который нужным нам образом обработает событие падения теста и сделает скрин, даже при желании - с подстветкой, рюшечками и апплодисментами. Сейчас же мы видим 2 слушателя, но методов в них перегружено N. Я привел пример лишь одного. Информация выводится в консоли, а также попадает в репорт TestNG при помощи плагина дженкинса. Да и в общем случае нас интересует только лог метода onTestFailure. В целом, любой эксепшен не пройдет мимо репорта.