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

Не прикрепляются скриншоты в Allure+TestNG+Selenide

screenshot
selenide
testng
Теги: #<Tag:0x00007f7b61faf8f0> #<Tag:0x00007f7b61faf7b0> #<Tag:0x00007f7b61faf670>

(Александр Шиповалов) #1

Коллеги, добрый день. Есть в общем то типовой проект Java (maven)
Вот pom файл

  <modelVersion>4.0.0</modelVersion>
    <groupId>com.selenium.test</groupId>
    <artifactId>selenide-tests-example</artifactId>
    <version>1.0</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <testng.version>6.9.6</testng.version>
        <compiler.version>1.7</compiler.version>
        <selenide.version>2.23</selenide.version>
        <allure.version>1.4.19</allure.version>
        <aspectj.version>1.8.5</aspectj.version>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.2</version>
                <configuration>
                    <source>${compiler.version}</source>
                    <target>${compiler.version}</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-failsafe-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>testng.xml</suiteXmlFile>
                    </suiteXmlFiles>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>org.aspectj</groupId>
                        <artifactId>aspectjweaver</artifactId>
                        <version>${aspectj.version}</version>
                    </dependency>
                </dependencies>
                <executions>
                    <execution>
                        <goals>
                            <goal>integration-test</goal>
                            <goal>verify</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

        </plugins>
    </build>

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

    <dependencies>
        <dependency>
            <groupId>com.codeborne</groupId>
            <artifactId>selenide</artifactId>
            <version>${selenide.version}</version>
        </dependency>
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>${testng.version}</version>
        </dependency>
        <dependency>
            <groupId>ru.yandex.qatools.allure</groupId>
            <artifactId>allure-testng-adaptor</artifactId>
            <version>${allure.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

    </dependencies>

Да я знаю, что Allure подключен через maven-failsafe-plugin но он работает и собирается. И такое условие поставил мне лид команды разработки. Скриншоты снимаются через Listener
import com.codeborne.selenide.Screenshots;

import com.google.common.io.Files;
import com.selenium.test.utils.ScreenShotUtil;
import org.testng.ITestContext;
import org.testng.ITestListener;
import org.testng.ITestResult;
import ru.yandex.qatools.allure.annotations.Attachment;

import java.io.File;
import java.io.IOException;


public class ScreenShotOnFailListener implements ITestListener {
    @Override
    public void onTestStart(ITestResult iTestResult) {

    }

    @Override
    public void onTestSuccess(ITestResult iTestResult) {

    }

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

    }

    @Override
    public void onTestSkipped(ITestResult iTestResult) {

    }

    @Override
    public void onTestFailedButWithinSuccessPercentage(ITestResult iTestResult) {

    }

    @Override
    public void onStart(ITestContext iTestContext) {

    }

    @Override
    public void onFinish(ITestContext iTestContext) {

    }

    @Attachment(value = "{0}", type = "image/png")
    public byte[] screenshot() throws IOException {
        File screenshot = Screenshots.getScreenShotAsFile();
        return Files.toByteArray(screenshot);
    }
}

Тесты запускаются все ходит, отчет формируются но скриншоты сохраняются в папку

C:\Users\user name\AppData\Local\Temp

с именем примерно таким

screenshot3264272613799059149.png

Allure само собой не может их там найти. А я не могу найти где настроить этот параметр. Может быть кто нибудь сталкивался с такой проблемой?


(Sergey Korol) #2

Так а в чем собственно проблема? Selenide использует стандартный механизм получения скринов. Если нужен другой путь, все делается в 1 строку:

FileUtils.copyFile(scrFile, new File("newPath"));

Ну или можно попросить @asolntsev добавить перегруженный метод с возможностью задания пути. :blush:


(asolntsev) #3

Дык, метод есть. Selenide можно попросить складывать скриншоты в любую папку.

Но Allure, насколько я понимаю, не хавает все подряд файлы. Нужно его попросить.

Если я всё правильно понял, чтобы скормить Allure свой скриншот, нужно создать метод с аннотацией @Attachment, который возвращает File или byte[]:

  @Attachment(type = "image/png")
  public byte[] screenshot() throws IOException {
    File screenshot = Screenshots.getScreenShotAsFile();
    return Files.toByteArray(screenshot);
  }

(Sergey Korol) #4

ТС так и делает в своем куске кода, разве нет? Проблема в том, что вы не сможете открыть локальный файл вне зоны видимости http. Browser security скажет пару ласковых, ведь у ТС screenshot сохраняется в tmp фолдере, а сервер смотрит в свой собственный. Посему и складировать скрины нужно туда, где их можно достать по http протоколу. Аналогичная ситуация будет и с Jenkins.


(Александр Шиповалов) #5

Да попробую копировать. Посмотрим, как отнесется к этому Allure


(Александр Шиповалов) #6

Я нашел то, что имел в виду Андрей

-Dselenide.reports=test-results/reports
Configuration.reportsFolder=test-results/reports

Толку правда от этого немного, файлы все равно улетели в TEMP

В таком виде

@Attachment(value = "{0}", type = "image/png")
public byte[] screenshot() throws IOException {
    File screenshot = Screenshots.getScreenShotAsFile();
    FileUtils.copyFile(screenshot, new File("target\\allure-results\\screenshots\\" + screenshot.getName()));
    return Files.toByteArray(screenshot);
}

файлы сохраняются куда надо, но в Allure не аттачаться


(Александр Шиповалов) #7

При переключении на maven-surefire-plugin, весь приведенный в первом сообщении пост, работает как часы. Похоже где то очень жестко завязано именно на этот плагин. По крайней мере с аттачами. Попробую поковыряться.


(Sergey Korol) #8

Я смотрю, что вы используете allure-testng-adaptor, который в pom’е уже подключает maven-surefire-plugin.


(Александр Шиповалов) #9

Ага…ясно. Можно попробовать заэксклюдить, но что то у меня сомнения по поводу работоспособности такой связки


(Denis Repon) #10

добрый день.
решили проблему?