Имплементирую ITestListener. Проблема в том что скриншоты делаются всегда, прикрепляются к отчету только те которые были сделаны в onTestStart. Тоесть когда тест падает с ошибкой он заходит в метод onTestFailure, делает скриншот и не атачит его.
Переписываю метод:
@Override
public void onTestFailure(ITestResult iTestResult) {
attachScreenshot("failure_" + iTestResult.getName());
}
@Override
public void onTestStart(ITestResult iTestResult) {
log.info("");
log.info("Starring test: " + iTestResult.getName());
log.info("");
attachScreenshot("start screen");
}
Вопрос в том как сделать так что бы все скриншоты прикреплялись.
Скриншоты генерятся все.
Но когда смотришь файл в который они должны крепиться - то их там только 2 (те которые были сделаны в onTestStart )
Таким образом снимаю и атачу скриншот
@Attachment(value = "{0}", type = "image/png")
public static byte[] attachScreenshot(String name) {
return ((TakesScreenshot) DriverFactory.getDriver()).getScreenshotAs(OutputType.BYTES);
}
Мой pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>test</groupId>
<artifactId>test</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<selenium.version>3.0.1</selenium.version>
<selendroid.version>0.17.0</selendroid.version>
<aspectj.version>1.8.9</aspectj.version>
<allure.version>1.4.23</allure.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<name>Moovweb Automation framework</name>
<description>Allure Cucumber-JVM Usage Example</description>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>${selenium.version}</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-support</artifactId>
<version>${selenium.version}</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-api</artifactId>
<version>${selenium.version}</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-safari-driver</artifactId>
<version>${selenium.version}</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-remote-driver</artifactId>
<version>${selenium.version}</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-firefox-driver</artifactId>
<version>${selenium.version}</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-chrome-driver</artifactId>
<version>${selenium.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/ru.yandex.qatools.allure/allure-cucumber-jvm-adaptor -->
<dependency>
<groupId>ru.yandex.qatools.allure</groupId>
<artifactId>allure-cucumber-jvm-adaptor</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>info.cukes</groupId>
<artifactId>cucumber-testng</artifactId>
<version>1.2.5</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.21</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.testng/testng -->
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.9.13.6</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
<dependency>
<groupId>io.appium</groupId>
<artifactId>java-client</artifactId>
<version>3.4.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.4.2</version>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20140107</version>
</dependency>
</dependencies>
<build>
<!--<pluginManagement>-->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<configuration>
<testFailureIgnore>false</testFailureIgnore>
<suiteXmlFiles>
<suiteXmlFile>${testng.suite}</suiteXmlFile>
</suiteXmlFiles>
<argLine>
-Dcucumber.options="--plugin ru.yandex.qatools.allure.cucumberjvm.AllureReporter" -javaagent:${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar
</argLine>
<systemPropertyVariables>
<device.platform.name>${device.platform.name}</device.platform.name>
<device.platform.version>${device.platform.version}</device.platform.version>
<device.name>${device.name}</device.name>
<device.browser>${device.browser}</device.browser>
<device.uid>${device.uid}</device.uid>
<iproxy.port>${iproxy.port}</iproxy.port>
<appium.port>${appium.port}</appium.port>
<proxy.port>${proxy.port}</proxy.port>
</systemPropertyVariables>
</configuration>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.7.4</version>
</dependency>
</dependencies>
</plugin>
<!--Needed only to show reports locally. Run jetty:run and
open localhost:8080 to show the report-->
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.2.10.v20150310</version>
<configuration>
<webAppSourceDirectory>${project.build.directory}/site/allure-maven-plugin</webAppSourceDirectory>
<stopKey>stop</stopKey>
<stopPort>1234</stopPort>
</configuration>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>cucumber-full</id>
<properties>
<testng.suite>${basedir}/src/test/resources/testsuites/cucumber.xml</testng.suite>
</properties>
</profile>
<!-- separate test groups -->
<profile>
<id>IPhone-Simulator</id>
<properties>
<device.platform.name>iOS</device.platform.name>
<device.platform.version>10.2</device.platform.version>
<device.name>iPhone 5</device.name>
<device.uid>342E3135-1D03-4488-9FAF-29B4679E9513</device.uid>
<device.browser>Safari</device.browser>
<iproxy.port>8100</iproxy.port>
<appium.port>4733</appium.port>
<proxy.port>27754</proxy.port>
</properties>
</profile>
<profile>
<id>IPhone-6</id>
<properties>
<device.platform.name>iOS</device.platform.name>
<device.platform.version>10.1.1</device.platform.version>
<device.name>iPhone Eugene</device.name>
<device.uid>06ea52db1797ab1a561ff3d4646847e9e165ae3e</device.uid>
<device.browser>Safari</device.browser>
<iproxy.port>8100</iproxy.port>
<appium.port>4733</appium.port>
<proxy.port>27754</proxy.port>
</properties>
</profile>
<profile>
<id>IPhone-6+</id>
<properties>
<device.platform.name>iOS</device.platform.name>
<device.platform.version>10.1.1</device.platform.version>
<device.name>iPhone</device.name>
<device.uid>658371054fef6c1e944c387488d5bde23ebaa245</device.uid>
<device.browser>Safari</device.browser>
<iproxy.port>8200</iproxy.port>
<appium.port>4734</appium.port>
<proxy.port>27755</proxy.port>
</properties>
</profile>
<profile>
<id>IPhone-4s</id>
<properties>
<device.platform.name>iOS</device.platform.name>
<device.platform.version>10.1.1</device.platform.version>
<device.name>iPhone</device.name>
<device.uid>658371054fef6c1e944c387488d5bde23ebaa245</device.uid>
<device.browser>Safari</device.browser>
<iproxy.port>8300</iproxy.port>
<appium.port>4735</appium.port>
<proxy.port>27756</proxy.port>
</properties>
</profile>
<profile>
<id>GalaxyS6</id>
<properties>
<device.platform.name>Android</device.platform.name>
<device.platform.version>6.0.1</device.platform.version>
<device.name>Galaxy S6</device.name>
<device.uid>02157df2b2060e3f</device.uid>
<device.browser>Chrome</device.browser>
<appium.port>4740</appium.port>
<proxy.port>27760</proxy.port>
</properties>
</profile>
<profile>
<id>GalaxyNote4</id>
<properties>
<device.platform.name>Android</device.platform.name>
<device.platform.version>10.1.1</device.platform.version>
<device.name>Galaxy Note4</device.name>
<device.uid>712cdafb</device.uid>
<device.browser>Chrome</device.browser>
<appium.port>4741</appium.port>
<proxy.port>27761</proxy.port>
</properties>
</profile>
</profiles>
<reporting>
<excludeDefaults>true</excludeDefaults>
<plugins>
<plugin>
<groupId>ru.yandex.qatools.allure</groupId>
<artifactId>allure-maven-plugin</artifactId>
<version>2.5</version>
</plugin>
</plugins>
</reporting>
</project>
Если не ошибаюсь, то onTestFailed уже происходит после того, как Allure посчитал (получил эвент) что тест закончился. Соотв-но вне контекста теста аттачмент не крепится.
Тут есть смысл ловить скриншот через AllureListener
Я видел примеры как делали с onTestFailed, при чем на этом же форуме и это работало. А как его можно ловить через AllureListener ?
Не сталкивались с таким ?
ArtOfLife
(Sergey Korol)
07.Февраль.2017 20:59:59
#7
Не заглядывал в cucumber-adaptor
, но я почти уверен, что там реализован такой же механизм, как и в testng-adaptor
, который тригерит ивент завершения теста как раз таки в onTestFailure
. И выполняется он раньше вашего.
Атачьте скрины в afterInvocation
, и будет вам счастье. Только проверяйте дополнительно, что вы находитесь в контексте теста, т.к. этот ивент тригерится так же и на всех конфигурационных методах.
А каким образом мне проверять закончился ли тест или нет ?
Я пробовал делать проверку на зафелен ли тест. Но плодов это не дало
if (iTestResult.getStatus() == ITestResult.FAILURE)
{
//some code
}
Можете что-то подсказать ?
ArtOfLife
(Sergey Korol)
08.Февраль.2017 11:30:50
#9
Надо проверять не сам факт окончания. afterInvocation
уже итак об этом сигнализирует.
Надо проверять, что при заходе в этот метод вы находитесь в контексте теста.
public void afterInvocation(IInvokedMethod method, ITestResult testResult) {
if (method.isTestMethod())
attachScreenshot();
}
1 лайк
Я попробовал.
пробовал и так:
@Override
public void afterInvocation(IInvokedMethod iInvokedMethod, ITestResult iTestResult) {
if (iInvokedMethod.isTestMethod() && iTestResult.getStatus() == ITestResult.FAILURE){
attachScreenshot("failure_" + iTestResult.getName());
}
}
и так:
@Override
public void afterInvocation(IInvokedMethod iInvokedMethod, ITestResult iTestResult) {
if (iInvokedMethod.isTestMethod() ){
attachScreenshot("failure_" + iTestResult.getName());
}
}
В обоих случаях скриншот создается , но не аттачится в репорт
ArtOfLife
(Sergey Korol)
08.Февраль.2017 16:36:16
#11
Ну тогда пожалуй надо смотреть в сторону самого адаптера для огурца.
П.С. Еще советую пересмотреть версии зависимостей. Allure
старый, aspectjweaver
агенту одной версии подсовываете, а в зависимостях совсем другая стоит.
есть какая то резолюция от автора поста?
в принципе с тем же столкнулся, не могу найти листенер для кукумбера (проект: testNG + Cucumber + mvn)
при подключении Reporter и Formatter интерфейсов к лисенеру говорит
Listener com.shared.listeners.TestListener@758a34ce must be one of ITestListener, ISuiteListener, IReporter, IAnnotationTransformer, IMethodInterceptor or IInvokedMethodListener
ArtOfLife
(Sergey Korol)
13.Июль.2017 10:56:54
#13
dezikk
(Dez Dezsson)
03.Март.2018 15:53:24
#14
Вот сейчас тоже борюсь с ним. Пока не поборол, ситуация такая же - в папке аттачи лежат но в аллюр репорте не видны
Есть решение? У меня почти получилось, но ругается. Мне нужно передать в функцию 2 аргумента, но не получается.
cucumber.runtime.CucumberException: Hooks must declare 0 or 1 arguments. public void utility.Hook.setUp(cucumber.api.Scenario,org.testng.ITestContext) throws java.io.IOException