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

[Resolved] Как, что, куда?Attachment как его добавить?


(Denis Vovchenko) #1

Помогите. Allure установил, все нормально. Отчеты генерируются на ура, но как добавить скрины в них никак не могу понять…
Куда именно нужно добавлять @AttachmentЧто должно в нем содержаться.
Желательно сделать Attachment, что б скрин добавлялся к каждому шагу.
Или хотя бы к фейловуму шагу.
Прошу без оскорблений) Просто хочу уже добить этот allure.


(sidelnikovmike) #2

Нужно разбить задачу на 2 части:
1)разобраться, как вызывать что-либо на каждый зафейленный шаг(хотя скорее вы имели в виду тест)
2)разобраться, как сохранять скриншоты.

Аннотация Аttachment.
Ее можно добавить к любому методу и вернуть из него то, что требуется. Если хочется изображение - то лучше работать с byte[]. Далее оттуда, где вы хотите брать скриншот(см выше пункт 1) - вызываете этот метод и всё.
Внутри этого метода с Attachment - делайте takeScreenshot вебдрайверовский(это уже более детальная подсказка.

Запуск чего-либо на фейл.
Тут нужно понимать, какой фрейм вы используете. Вроде как у вас TestNG. Тут вариантов куча:

  • можно как вы уже делали в afterMethod смотреть статус теста и туда запихать вызов снятия скрина
  • написать listener , который onTestFailed будет вызывать то же самое.

(Denis Vovchenko) #3

Получается что если делать скрин для каждого теста, нужно в каждом вызывать метод скрина - это я пробовал, получается. Но я думал есть способ попроще )


(sidelnikovmike) #4

Ну этот вызов делается из одного и того же места. Это нормально. Куда уж проще? :smile:

Ну есть еще один способ - можно использовать AspectJ и обернуть хоть каждый метод скриншотом :smile:
Но нужно ли оно настолько?


(Denis Vovchenko) #5

Думаю нет) Спасибо за развернутый ответ!


(Taras) #6

поднималась тема уже не раз, ищите на форуме)


(Denis Vovchenko) #7

Написал вот так вот:

@AfterMethod
public void onTestFailure(ITestResult tr) {
    makeScreenshot();
}

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

У меня 2-а теста(сделал что б они оба фейлились):
В отчет скрин появляется только у теста №2 . При чем скрин не его, а теста №1.
В тесте №1 пусто.
Хотя в папке \target\allure-results находится 2-а скрина


(sidelnikovmike) #8

Вот это уже очень странно. Тут больше похоже на проблемы тестов именно. Потому как аллюр должен всё это делать правильно. Уже не одним человеком проверено


(Denis Vovchenko) #9

Куда ж именно смотреть в тестах…вот это вопрос… Отрабатывают корректно. Может в pom или testng.xml ошибки
В логе прохождения теста, еще увидел такое вот поле

[WARNING] Unable to find a URL to the parent project. The parent menu will NOT be added.

Может тут что-то?
Вот мой pom:

<parent>
    <groupId>ru.yandex.qatools.allure</groupId>
    <artifactId>allure-examples-parent</artifactId>
    <version>1.0</version>
</parent>

<artifactId>allure-testng-example</artifactId>
<version>1.0-SNAPSHOT</version>

<properties>
    <allure.version>1.4.13</allure.version>
    <aspectj.version>1.8.5</aspectj.version>
</properties>

<name>Allure TestNG Example</name>
<description>Allure TestNG and WebDriver Usage Example</description>

<dependencies>
    <dependency>
        <groupId>ru.yandex.qatools.allure</groupId>
        <artifactId>allure-testng-adaptor</artifactId>
        <version>1.4.13</version>
        <exclusions>
            <exclusion>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-remote-driver</artifactId>
        <version>2.45.0</version>
    </dependency>
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>2.45.0</version>
    </dependency>
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-server</artifactId>
        <version>2.45.0</version>
    </dependency>

    <dependency>
        <groupId>org.hamcrest</groupId>
        <artifactId>hamcrest-all</artifactId>
        <version>1.3</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <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>
                <suiteXmlFiles>
                    <suiteXmlFile>src/resources/testng.xml</suiteXmlFile>
                </suiteXmlFiles>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>org.aspectj</groupId>
                    <artifactId>aspectjweaver</artifactId>
                    <version>${aspectj.version}</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

<reporting>
    <excludeDefaults>true</excludeDefaults>
    <plugins>
        <plugin>
            <groupId>ru.yandex.qatools.allure</groupId>
            <artifactId>allure-maven-plugin</artifactId>
            <version>2.0</version>
        </plugin>
    </plugins>
</reporting>

(Denis Vovchenko) #10

Все. Настроил.
Решение: вывел скриншотер в листенер

@Override
public void onTestFailure(ITestResult tr){
    Object currentClass = tr.getInstance();
    WebDriver driver = ((AbstractTest) currentClass).getDriver();
    byte[] srcFile =  ((TakesScreenshot) driver).getScreenshotAs(OutputType.BYTES);
    saveScreenshot(srcFile);
}
@Attachment(value = "Page screenshot", type = "image/png")
private byte[] saveScreenshot(byte[] screenshot){
    return screenshot;
}