t.me/atinfo_chat Telegram группа по автоматизации тестирования

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

Теги: #<Tag:0x00007f748898c8e0> #<Tag:0x00007f748898c818> #<Tag:0x00007f748898c728> #<Tag:0x00007f748898c638> #<Tag:0x00007f748898c548> #<Tag:0x00007f748898c480>

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

1 Симпатия

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

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

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

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

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

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

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

1 Симпатия

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

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

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

@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-а скрина

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

Куда ж именно смотреть в тестах…вот это вопрос… Отрабатывают корректно. Может в 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>

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

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

Добрый день. Подскажите пожалуйста, а с добавление видео у Вас получилось??У меня получается записывать видео прохождения теста, но прикрепить видео формата mp4 никак не получается.

Какой type указываете? Надо "video/mp4". Версия аллюра свежая?
Вот весь список поддерживаемых типов: https://github.com/allure-framework/allure2/blob/master/allure-generator/src/main/javascript/utils/attachmentType.js

Версия Allure свежая: compile group: ‘io.qameta.allure’, name: ‘allure-testng’, version: ‘2.13.1’ Уже по разному пробовала:

  1. читала докементацию Allure

2)искала на форумах и в примерах

3)Пробовала добавить
compile group: ‘ru.yandex.qatools.allure’, name: ‘allure-testng-adaptor’, version: ‘1.5.4’
compile group: ‘ru.yandex.qatools.allure’, name: ‘allure-java-aspects’, version: ‘1.5.4’

4)У меня реализована так:

4.1)сделан метод, который пишет видео с мобильного устройства(эмулятора) - в итоге я получаю файл с расширением mp4
Вот сам метод:

public byte[] stopRecordVideo() throws IOException, InterruptedException {
        String base64String = DriverManager.getDriver().stopRecordingScreen();
        byte[] data = Base64.decodeBase64(base64String);
        System.out.println(base64String);
        String destinationPath="target/filename.mp4";
        Path path = Paths.get(destinationPath);
        Files.write(path, data);
        return data;
    }

4.2)пробую полученный файл в виде массива byte передать в качестве входного параметра в метод с аннотацией @Attachment(value = “video”, type = “mp4”)
Вот сам метод:

@Attachment(value = "video", type = "mp4")
    public byte[] saveScreenshot(byte[] screenShot) {
        return screenShot;
    }

Ещё раз прочитайте моё сообщение. Второе предложение. И сделайте так у себя.

В примере используется js, я не пока не понимаю как в проекте:Java,TestNG,Gradle можно использовать.Помогите пожалуйста разобраться.

@VikaIRaznoeQA
Попробуйте вот так

@Attachment(value = "VideoFile", type = "video/mp4", fileExtension = ".mp4")
    public byte[] attachVideoToAllure(String videoFileLocation) {
            File video = new File(videoFileLocation);
            try {
                return Files.toByteArray(video);
            } catch (IOException e) {
                log("attachVideoToAllure(): FAILED\n" + e.getMessage());
                return new byte[0];
        }
    }

У вас
type = "mp4" , а нужно
type = "video/mp4"

Вот посмотрите примеры разных аттачментов.

Да, я видела такие примеры, НО у меня метод toByteArray выделяется красным, тоесть я понимаю, что не хватает какой-то библиотеки для класса Files.

Сейчас у меня вот так:

import io.qameta.allure.Attachment;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;

import static org.testng.Reporter.log;

public class AllureUtils {
    @Attachment(value = "VideoFile", type = "video/mp4", fileExtension = ".mp4")
    public byte[] attachVideoToAllure(String videoFileLocation) {
        File video = new File(videoFileLocation);
        try {
            return Files.toByteArray(video);
        } catch (IOException e) {
            log("attachVideoToAllure(): FAILED\n" + e.getMessage());
            return new byte[0];
        }
    }
}

Возможно, нужно что-то добавить в Gradle???
Сейчас у меня вот так в Build.gradle:

dependencies {
    testCompile group: 'org.testng', name: 'testng', version: '7.0.0'
    compile group: 'org.seleniumhq.selenium', name: 'selenium-java', version: '3.141.59'
    //для мобильного тестирования
    compile group: 'io.appium', name: 'java-client', version: '7.3.0'
    //формирование отчета Allure
    compile group: 'io.qameta.allure', name: 'allure-testng', version: '2.13.1'
    compile group: 'ru.yandex.qatools.allure', name: 'allure-testng-adaptor', version: '1.5.4'
    compile group: 'ru.yandex.qatools.allure', name: 'allure-java-aspects', version: '1.5.4'
}

@VikaIRaznoeQA
Добавьте

// https://mvnrepository.com/artifact/com.google.guava/guava
compile group: 'com.google.guava', name: 'guava', version: '29.0-jre'

Files.toByteArray это оттуда;

Добавила в build.gradle, но не помогло: toByteArray осталось красным