Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Allure+TestNG+Cucumber скриншоты создаются но не прикрепляются к отчету

screenshot
cucumber
testng
allure
Теги: #<Tag:0x00007f7b61c305a8> #<Tag:0x00007f7b61c30468> #<Tag:0x00007f7b61c30238> #<Tag:0x00007f7b61c300f8>

(Eugene Shapovalov) #1

Имплементирую 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");
    }

(Yaroslav Pernerovskyy) #2

А вопрос в чем?


(Eugene Shapovalov) #3

Вопрос в том как сделать так что бы все скриншоты прикреплялись.

Скриншоты генерятся все.

Но когда смотришь файл в который они должны крепиться - то их там только 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>

(Dmitrii Demin) #4

Если не ошибаюсь, то onTestFailed уже происходит после того, как Allure посчитал (получил эвент) что тест закончился. Соотв-но вне контекста теста аттачмент не крепится.
Тут есть смысл ловить скриншот через AllureListener


(Eugene Shapovalov) #5

Я видел примеры как делали с onTestFailed, при чем на этом же форуме и это работало. А как его можно ловить через AllureListener ?


(Eugene Shapovalov) #6

Не сталкивались с таким ?


(Sergey Korol) #7

Не заглядывал в cucumber-adaptor, но я почти уверен, что там реализован такой же механизм, как и в testng-adaptor, который тригерит ивент завершения теста как раз таки в onTestFailure. И выполняется он раньше вашего.

Атачьте скрины в afterInvocation, и будет вам счастье. Только проверяйте дополнительно, что вы находитесь в контексте теста, т.к. этот ивент тригерится так же и на всех конфигурационных методах.


(Eugene Shapovalov) #8

А каким образом мне проверять закончился ли тест или нет ?

Я пробовал делать проверку на зафелен ли тест. Но плодов это не дало

if (iTestResult.getStatus() == ITestResult.FAILURE)
{
//some code
}

Можете что-то подсказать ?


(Sergey Korol) #9

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

        public void afterInvocation(IInvokedMethod method, ITestResult testResult) {
		if (method.isTestMethod())
			attachScreenshot();
	}

(Eugene Shapovalov) #10

Я попробовал.

пробовал и так:

 @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());
  }
}

В обоих случаях скриншот создается , но не аттачится в репорт


(Sergey Korol) #11

Ну тогда пожалуй надо смотреть в сторону самого адаптера для огурца.

П.С. Еще советую пересмотреть версии зависимостей. Allure старый, aspectjweaver агенту одной версии подсовываете, а в зависимостях совсем другая стоит.


(Ramon Menezes) #12

есть какая то резолюция от автора поста?
в принципе с тем же столкнулся, не могу найти листенер для кукумбера (проект: testNG + Cucumber + mvn)
при подключении Reporter и Formatter интерфейсов к лисенеру говорит

Listener com.shared.listeners.TestListener@758a34ce must be one of ITestListener, ISuiteListener, IReporter,  IAnnotationTransformer, IMethodInterceptor or IInvokedMethodListener


(Sergey Korol) #13

А на новый адаптер никто не смотрел?

https://mvnrepository.com/artifact/io.qameta.allure/allure-cucumber-jvm/2.0-BETA15


(Dez Dezsson) #14

Вот сейчас тоже борюсь с ним. Пока не поборол, ситуация такая же - в папке аттачи лежат но в аллюр репорте не видны