[Resolved] Как прикрепить скриншоты проваленных методов в Allure.

screenshot
Теги: #<Tag:0x00007fedc0ed0188>

(Александр Шиповалов) #1

Коллеги, добрый день. Возникла у меня такая проблема. Изначально были тесты как тесты на Java. После каждого метода вызывался метод (alwaysRun = true) - где имя скриншота было названием тестового метода. Потом на коротком отрезке случилось следующее:
1. Обновили Allure c 1.3.9 на 1.4.4
2. Перешли на использование DataProvider который поставляет тестовые данные их Exel.
И собственно возникла сама проблема - скриншотер по прежнему снимает скриншот, но всегда с одним именем и перезаписывает более ранние. Кроме того хотелось бы видеть скриншоты с ошибками прикрепленными к Allure. Непродолжительно гугление приводит к следующим результатам: Ashot и

@Attachment(value = "Page screenshot", type = "image/png")
public byte[] saveScreenshot(byte[] screenShot) {
    return screenShot;
}

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


Не создаются скриншоты для Allure+TestNG+mvn
(sidelnikovmike) #2

Можно либо сделать listener, в нем есть вроде метод onTestFailed(если не ошибаюсь). Либо в afterTest смотреть, зафейлен ли тест.
Другой вопрос - надо чтоб при падении не закрывался браузер, иначе будете ошибки получать.
Про имена - поподробнее бы с примерами. А то не понятно


(Александр Шиповалов) #3

Раньше скриншоты снимались и назывались по имени тестового метода - test1, test2, test2 - например. Сейчас же используется всего один метод - на вход которому передаются разные наборы данных - соответственно тест называется всегда одинаково.


(Sergey Korol) #4

Я бы не полагался только лишь на имя теста для скриншота. Точно такая же проблема у вас возникнет, когда начнете гонять одни и те же тесты параллельно. Я, к примеру, помимо имени метода, еще использую конфигурацию и время запуска: someTest_Win7_FF24_2014-12-03_09-40-35.

Насчет фейлов, как уже выше сказали, можно обрабатывать onTestFailure(ITestResult result) из TestNG ITestListener. Кстати из ITestResult можно вытянуть много всего полезного по ходу дела.


(Александр Шиповалов) #5

Да я раньше так и снимал.
@AfterMethod(alwaysRun = true)

public void takeScreenshot(ITestResult result) {
  if (! result.isSuccess()) {
    File screenshot1 = new File(result.getMethod().getMethodName() + ".png");
    screenshot1.delete();
    File screenshotTempFile = ((TakesScreenshot) driver)
      .getScreenshotAs(OutputType.FILE);
    Files.copy(screenshotTempFile, screenshot1);
  }
}

И в принципе меня устраивало как он работал...но вот сообразить как его прикрутить к

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

Я что то не могу.


(Sergey Korol) #6

Ну по простому не выйдет, т.к. атрибутам аннотаций можно засетить только константы. Самый простой вариант наверное - изменить логику формирования имени у аспекта, который отвечает за атачменты. Но тогда вам придется пересобрать исходники самостоятельно и использовать модифицированную версию. Или же создайте PR с фиксом и в новой версии увидите свою фичу в случае одобрения разработчиками. wink


(Александр Шиповалов) #7

Хм...а если принудительно снимать скриншот во время выполнения теста? Это наверное проще?


(Sergey Korol) #8

Что значит принудительно?


(sidelnikovmike) #9

у Attachment есть параметр name.
можно дслеть примерно так:

@Attachment(value = "Снимок {0}", type = "image/png")
public byte[] saveScreenshot(String name) {
....
}

и тогда файл сохранится с нужным вам именем.
Таким образом в allure можно передавать в step и attachment значения из параметров. Нужно указать индекс в фигурных скобках.


(Александр Шиповалов) #10

А Ashot может возвращать не объект Screenshot, а byte[]


(sidelnikovmike) #11

у screenshot есть getImage(), который вернет BufferedImage, а его можно сконвертить в byte[]. Пример из моего кода:

 ByteArrayOutputStream baos = new ByteArrayOutputStream();
 ImageIO.write(image, "png", baos);
 return baos.toByteArray();

(Александр Шиповалов) #12

Сделал пока вот так

@Attachment(value = "Снимок {0}", type = "image/png")
public byte[] saveScreenshot(String name) throws IOException {
    Screenshot scr = new AShot().shootingStrategy(new ViewportPastingStrategy(5)).takeScreenshot(driver);
    BufferedImage originalImage = scr.getImage();
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ImageIO.write( originalImage, "png", baos );
    return baos.toByteArray();
}

Посмотрим как это отработает


(Александр Шиповалов) #13

Плохо отработало. Выпала в том числе и такая ошибка

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-site-plugin:3.3:site (default-site) on project webdriver_tests: Error during page generation: Error rendering Maven report: Can't generate allur
e report data: java.lang.reflect.InvocationTargetException: ru.yandex.qatools.allure.data.ReportGenerationException: net.sf.saxon.trans.XPathException: org.xml.sax.SAXParseException; lineNumber: 235; column
Number: 38; Invalid byte 2 of 2-byte UTF-8 sequence. -> [Help 1]

(sidelnikovmike) #14

Так сложно понять, почему у Вас эта ошибка возникла.
Вы пробовали сделать простейший тест с простым снятием скриншота? для того, чтобы Ваш новый метод потестировать?


(Александр Шиповалов) #15

Увы нет, сейчас попробую глянуть в дебаггере.


(Александр Шиповалов) #16

Легче не стало

дек 04, 2014 7:06:17 PM org.openqa.selenium.remote.Augmenter extractRemoteWebDriver
WARNING: Augmenter should be applied to the instances of @Augmentable clases or previously augmented instances only

(sidelnikovmike) #17

А откуда эта ошибка? в какой момент она возникает?
Это еще warning, а он обычно не влияет на исполнение тестов.


(Александр Шиповалов) #18

ну похоже это единственный warning который возникает. Сами тесты вроде отрабатывают. Ошибка

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-site-plugin:3.3:site (default-site) on project webdriver_tests: Error during page generation: Error rendering Maven report: Can't generate allur
e report data: java.lang.reflect.InvocationTargetException: ru.yandex.qatools.allure.data.ReportGenerationException: net.sf.saxon.trans.XPathException: org.xml.sax.SAXParseException; lineNumber: 235; column
Number: 38; Invalid byte 2 of 2-byte UTF-8 sequence. -> [Help 1]

Возникает при формировании отчета.


(sidelnikovmike) #19

Можете прислать кусок кода, как и откуда Вы вызываете метод скриншота?
А еще можно попробовать сохранить локально bufferedImage, который вам Ashot делает. Чтобы убедиться, что с этой стороны всё нормально.

Давайте для начала исключим все возможные ошибки, а потом если не получится - будем уже подключать ребят из allure.


(Александр Шиповалов) #20

Смотрю в дебагере IDEA показывает, что в строчке

 return baos.toByteArray();

возвращается, что то странное - даже скопировать не могу. Какие то сплошные кракозябры и странные символы. Эта же мистическая строка отображается и для

ByteArrayOutputStream baos = new ByteArrayOutputStream();