POM под Allure, получение рез-тов и Attachments

pom.xml
testng
maven
allure
java
Теги: #<Tag:0x00007fedb91ee318> #<Tag:0x00007fedb91ee188> #<Tag:0x00007fedb91edff8> #<Tag:0x00007fedb91ede68> #<Tag:0x00007fedb91edcd8>

(Artem Eroshenko) #21

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


(Vasiliy Rakshin) #22

у вашего onTestFailure есть аннотация @Override ?


(Mr Ds Low) #23

В общем то, что вчера запустилось - было каким-то “багом”. :thinking:
Я пытался забилидить еще раз и уже пошел стак ошибок.

Сегодня,
С советом выше убрал лишнее из Listener.
Выглядит на д.м. так:

package listeners;

import io.qameta.allure.Attachment;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.testng.ITestContext;
import org.testng.ITestResult;
import org.testng.internal.IResultListener2;
import org.testng.log4testng.Logger;

public class Listener implements IResultListener2 {

    final static Logger logger = Logger.getLogger(Listener.class);

    WebDriver driver;

    @Override
    public void beforeConfiguration(ITestResult iTestResult) {

    }

    @Override
    public void onConfigurationSuccess(ITestResult iTestResult) {

    }

    @Override
    public void onConfigurationFailure(ITestResult iTestResult) {

    }

    @Override
    public void onConfigurationSkip(ITestResult iTestResult) {

    }

    @Override
    public void onTestStart(ITestResult iTestResult) {

    }

    @Override
    public void onTestSuccess(ITestResult iTestResult) {
        makeScreenshot ("Fail");
    }

    @Override
    public void onTestFailure(ITestResult iTestResult) {
        makeScreenshot ("Success");
    }

    @Override
    public void onTestSkipped(ITestResult iTestResult) {

    }

    @Override
    public void onTestFailedButWithinSuccessPercentage(ITestResult iTestResult) {

    }

    @Override
    public void onStart(ITestContext iTestContext) {

    }

    @Override
    public void onFinish(ITestContext iTestContext) {

    }

    @Attachment(value = "{0}", type = "image/png")
    public byte[] makeScreenshot(String name) {
        return ((TakesScreenshot) driver).getScreenshotAs(OutputType.BYTES);
    }
}

Запускается и создает отчеты, attach’и в том числе.

Но я в процессе инвестигации, что за сопутствующие ошибки появляются:

java.lang.NullPointerException
	at listeners.Listener.makeScreenshot(Listener.java:75)
	at listeners.Listener.onTestSuccess(Listener.java:45)
	at org.testng.internal.Invoker.runTestListeners(Invoker.java:1735)
	at org.testng.internal.Invoker.runTestListeners(Invoker.java:1714)
	at org.testng.internal.Invoker.invokeMethod(Invoker.java:714)
	at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:869)
	at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1193)
	at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:126)
	at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
	at org.testng.TestRunner.privateRun(TestRunner.java:744)
	at org.testng.TestRunner.run(TestRunner.java:602)
	at org.testng.SuiteRunner.runTest(SuiteRunner.java:380)
	at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:375)
	at org.testng.SuiteRunner.privateRun(SuiteRunner.java:340)
	at org.testng.SuiteRunner.run(SuiteRunner.java:289)
	at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
	at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
	at org.testng.TestNG.runSuitesSequentially(TestNG.java:1301)
	at org.testng.TestNG.runSuitesLocally(TestNG.java:1226)
	at org.testng.TestNG.runSuites(TestNG.java:1144)
	at org.testng.TestNG.run(TestNG.java:1115)
	at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:72)
	at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:123)

^Ссылается на метод и вызов screenshot maker’а.


(Vasiliy Rakshin) #24

Как у вас в этот листенер и в частности, в метод взятия скриншота, драйвер попадает? вот он пустой - вот и ошибка


(Mr Ds Low) #25

Пункты в порядке приоритета.

  1. Если говорить только по сути:
    Запустил. Выходные файлы выглядят следу. образом (скришот ниже):

Описание метода:

@Attachment(value = "{0}", type = "image/png")
    public byte[] makeScreenshot(ITestResult iTestResult) {
        Object currentClass = iTestResult.getInstance();
        WebDriver driver = ((Unity) currentClass).getDriver();
        return ((TakesScreenshot) driver).getScreenshotAs(OutputType.BYTES);
    }

Вызов:

@Override
    public void onTestSuccess(ITestResult iTestResult) {
        makeScreenshot (iTestResult);
    }
  1. Выглядит все пока так:


    Что странно, это дубли скриншота. Учитывая, что метод вызывается только на TestFailure и TestSuccess.
    Я, конечно же, сам посмотрю, но есть какие-то варианты “приличного” оформления документов? Я видел как подобное сделать, когда выводится через File, не уверен на счет маски для скриншота используя метод выше. И раннее я спрашивал, но хотел бы еще раз узнать в чем отличие метода, который я использую сейчас, и через output File методы? Как это соединяется в один репорт потом в процессе?

  2. Почему так долго:
    Думал вызова WebDriver driver в классе должно быть достаточно для того, чтобы метод аттача его применил. Еще эксперементировал с extends. В итоге были какие-то странные ошибки на запуск драйвера, узнал что 2.31 версия для chrome есть, решил поставить (с мыслью вдруг пофиксится само, хэхмда), антивирус не позволил, вернул обратно 2.30. Еще обнаружил, что у меня в POM несколько chrome драйверов описано :thinking: Не знаю как все работало до этого. :thinking:.
    В общем да, путем сотни экспериментов какой-то результат получился.
    Оффтопиком:
    Небольшая проблема, но в ходе собирания появляется странное сообщение, еще не увязал причину.

2017-07-25 17:47:26 ERROR NamingUtils:54 - Could not find parameter 0
2017-07-25 17:47:26 ERROR NamingUtils:54 - Could not find parameter 0

(Vasiliy Rakshin) #26

Я ваш второй вопрос не понял. По поводу дублей - ищите по коду где ещё используется makeScreenshot, возможно, вы где-то пропустили это использование и от этого дубль снимается. Аттачер ( @Attachment ) хочет стринг для имени аттачиваемого файла, но вы вместо стринга в метод передаёте объект ТестРезульт ( makeScreenshot(ITestResult iTestResult) ) - вот он и ругается вам в лог, можете подправить метод, давать в него первым параметром имя в стринге, а вторым параметром ITestResult.


(Mr Ds Low) #27

Что-то вроде:
File imageFile = new File(defaultImage.toURI());
Но это вырезка офк.
У меня был где-то пример с цельным описанием метода. Может быть завтра найду - напишу.
Ну или

@Attachment(value = "Screenshot on failure", type = "image/png")
private byte[] writeScreenshotToFile(WebDriver driver, File screenshot) {
    try {
        FileOutputStream screenshotStream = new FileOutputStream(screenshot);
        byte[] bytes = ((TakesScreenshot) driver)
                .getScreenshotAs(OutputType.BYTES);
        screenshotStream.write(bytes);
        screenshotStream.close();
        return bytes;
    } catch (IOException unableToWriteScreenshot) {
        System.err.println("Unable to write "
                + screenshot.getAbsolutePath());
        unableToWriteScreenshot.printStackTrace();
    }
    return null;
}

Но это тоже не совсем то. Тут не определяется наименование.

И да, спасибо за помощь. И @eroshenkoam за предложенную тоже.


(Vasiliy Rakshin) #28

Я же вам написал как изменить код для задания имени скриншота. Еще раз полностью прочитайте моё предыдущее сообщение и сделайте последнее предложение для того что у вас уже работает и проверено.


(Mr Ds Low) #29

Доделал сегодня.
Правда маловато информативности пока что. Для “Отчета моей мечты”.

Смотрел что можно сделать (типа идеальный вариант оформления в качестве PR акции с заполненными Laucher и behavior).

Про launcher пока забыл, а построение взятие инфы для behavior мне не понравилось. Может быть я ошибаюсь, но оно какое-то “примитивное” и не гибкое, нет?
Еще раз посмотрел плагины, поскольку появилось больше осмысленности того, что происходит. Но по-моему там что-то невероятное написано.

Может быть кто-то может дополнить/поправить меня?


(Artem Eroshenko) #30

@MrDSLow задача отчета отображать информацию, которую ты собрал. Возможно тебе нужно предоставить больше информации. Сейчас сказать сложно.

Лично я пользуюсь следующими табами: suite, behaviors, timeline. Я их настроил под себя и для команды они довольно информативны.

А чего тебе не хватает в получившемся у тебя отчете?


(Mr Ds Low) #31

Мне кажется проще показать, что у меня есть, поскольку я не знаю насколько глубоко тут можно копать.

[details=Summary]


[/details]
Кейс, конечно же, пока один (другой проект-комплект я еще не оптимизировал. Решил Allure прикрутить к новому, чистому проекту).
Выглядит бедновато. Не уверен насколько сильно будет наполненность информацией при множестве кейсов/билдов.
Но может быть так все и должно быть? Тут я не сведую.

По поводу предоставления информации. Может быть я сейчас не прав, но в доке на qameta.io не много информации по этому поводу. Было бы неплохо туда добавить, нет?
Тут я имею ввиду про “Настройка suite, behaviors, timeline etc под себя и они довольно информативны”.

P.S. в ближайшем будущем я разберусь с плагинами и там уже посмотрю.


(Levotsky Vadim) #32

поддерживаю оратора в этом вопросе.


(Artem Eroshenko) #33

Да, на документацию как всегда не хватает времени :slight_smile:
Если есть желание помочь, то можно присылать PR в этот репозиторий:

Мы так или работаем над документацией, но может не с такой хорошей скоростью как хотелось бы.