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

Как прикрепить картинки к allure, используя TestNG Listener


(Andrey) #1

Здравствуйте.
Задача уже наверное избитая: прикрепить картинки к отчету allure
Посмотрел этот пример и и этот вот еще.
Все хорошо, только мне нужно делать скриншоты после ВСЕХ подающих тестов, а в примерах просто метод в тестовом классе…как-то неудобно…
Решил реализовать ITestListener.
Сделал как в примерах только метод screenshot вызываю в onTestFailure(). Скриншоты делаются все ок, только вот в allure их не видать… Пробовал переопределять метод в AllureTestListener. та же история…
Можно ли так делать вообще…
Вот pom:

<dependencies>
    <dependency>
        <groupId>com.codeborne</groupId>
        <artifactId>selenide</artifactId>
        <version>3.11</version>
    </dependency>
    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>6.9.10</version>
    </dependency>
    <dependency>
        <groupId>ru.yandex.qatools.allure</groupId>
        <artifactId>allure-testng-adaptor</artifactId>
        <version>1.5.0<</version>
        <exclusions>
            <exclusion>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.3</version>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.18.1</version>
            <configuration>
                <!--<testFailureIgnore>true</testFailureIgnore>-->
                <argLine>
                    -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar"
                </argLine>
                <properties>
                    <property>
                        <name>listener</name>
                        <value>com.mytest.MyListener</value>
                    </property>
                </properties>
                <suiteXmlFiles>
                    <suiteXmlFile>testng-sit.xml</suiteXmlFile>
                </suiteXmlFiles>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>org.aspectj</groupId>
                    <artifactId>aspectjweaver</artifactId>
                    <version>1.8.5</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
            <includes>
                <include>**/*.properties</include>
            </includes>
        </resource>
    </resources>
</build>
<reporting>
    <excludeDefaults>true</excludeDefaults>
    <plugins>
        <plugin>
            <groupId>ru.yandex.qatools.allure</groupId>
            <artifactId>allure-maven-plugin</artifactId>
            <version>2.5</version>
        </plugin>
    </plugins>
</reporting>

Вот сам Listener. (тут правда AllureTestListener, но для ITestListener тоже самое):

public class MyListener extends AllureTestListener {
    private AtomicLong screenshotCounter = new AtomicLong();

    @Override
    public void onTestFailure(ITestResult iTestResult) {
        try {
            screenshot(getScreenShotName(iTestResult));
        } catch (IOException e) {
            e.printStackTrace();
        }
        super.onTestFailure(iTestResult);
    }

    @Override
    public void onTestSkipped(ITestResult iTestResult) {
        System.out.println("onTestSkipped!!!!!!!!!!!!!!!!!");
    }

    @Attachment(value = "{0}", type = "image/png")
    private byte[] screenshot(String name) throws IOException {
        ScreenShotLaboratory laboratory = new ScreenShotLaboratory();
        File screenshot = new File(laboratory.takeScreenShot(name));
        return Files.toByteArray(screenshot);
    }

    private String getScreenShotName(ITestResult iTestResult) {
        StringBuilder builder = new StringBuilder();
        builder.append(iTestResult.getName());
        builder.append("-");
        builder.append(DateUtils.convertDateFormat(Calendar.getInstance().getTime(), "dd.MM.yyy_HH:mm:ss"));
        builder.append("-");
        builder.append(screenshotCounter.getAndIncrement());
        return builder.toString();
    }
}

(Sergey Korol) #2

Вызывайте метод по снятию скриншота в afterInvocation. Или используйте aspectj для этих целей.


(Andrey) #3

Спасибо! Помогло