Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

Allure 2. Аннотация @Step не срабатывает. Maven+Junit+Allure.

maven
junit
java
allure
Теги: #<Tag:0x00007fedbbd5fa38> #<Tag:0x00007fedbbd5f8d0> #<Tag:0x00007fedbbd5f768> #<Tag:0x00007fedbbd5f600>

(Роман Васин) #1

Доброго времени суток! Помогите решить следующую проблему:
Имеется тестовый класс с одной аннотацией @Test (Junit) и нескольких аннотаций в ней @Step (Allure 2).
После запуска команды в Maven mvn clean test тест запускается, но выполняется только аннотация @Test (@Step игнорится), после чего тест завершается (успешно).
Все зависимости от POM встали нормально, IDE (IntelliJ IDEA) все аннотации распознает.

POM:

<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>com.jlr.app</groupId>
  <artifactId>jlr-test</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>jlr-test</name>
  <url>http://maven.apache.org</url>

  <properties>
	<aspectj.version>1.8.9</aspectj.version>
	
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.8.2</version>
      <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>3.5.3</version>
    </dependency>  
	<dependency>
        <groupId>io.qameta.allure</groupId>
        <artifactId>allure-junit4</artifactId>
        <version>2.0-BETA18</version>
        <scope>test</scope>
    </dependency>
	 
	 <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.21</version>
        </dependency>
		    <dependency>
            <groupId>io.github.bonigarcia</groupId>
            <artifactId>webdrivermanager</artifactId>
            <version>1.4.9</version>
			</dependency>
	 
		<dependency>
            <groupId>com.tngtech.java</groupId>
            <artifactId>junit-dataprovider</artifactId>
            <version>1.10.0</version>
            <scope>test</scope>
        </dependency>
	</dependencies>

  <build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.20</version>
            <configuration>
                <testFailureIgnore>false</testFailureIgnore>
                <argLine>
					-javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar"
                </argLine>
				
                <properties>
                    <property>
                        <name>listener</name>
                        <value>io.qameta.allure.junit4.AllureJunit4</value>
                    </property>
                </properties>
				 <systemProperties>
                        <property>
                            <name>allure.results.directory</name>
                            <value>${project.build.directory}/allure-results</value>
                        </property>
                    </systemProperties>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>org.aspectj</groupId>
                    <artifactId>aspectjweaver</artifactId>
                    <version>${aspectj.version}</version>
                </dependency>
            </dependencies>
        </plugin>
		<plugin>
                <groupId>io.qameta.allure</groupId>
                <artifactId>allure-maven</artifactId>
                <version>2.8</version>
            </plugin>
    </plugins>
</build>
  
</project>
"

Код:

package com.jlr.app;


import io.qameta.allure.Step;
import org.junit.*;

import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

import org.junit.runners.Suite;
import org.junit.runner.RunWith;


public class CreateProfileTest {
    static String baseUrl;
    static WebDriver driver;

    @BeforeClass
    public static void testSetup() {
        driver = new ChromeDriver();
        baseUrl = "http://127.0.0.1:8000";
    }


    @AfterClass
    public static void testShutDown() {
        driver.close();
    }

    @Test
    // Открытие браузера
    public void createOneProfile() {
        driver.get(baseUrl + "/SIMULATOR/index.html");
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); // объявление неявного оижадия
        driver.manage().timeouts().setScriptTimeout(10, TimeUnit.SECONDS); // объявление неявного оижадия для скриптов
    }
     @Step
    // Переход во фрейм, где есть tile Login
    public void switchToFrame01() {
        driver.switchTo().frame(driver.findElement(By.id("550e8400-e29b-41d4-a716-446655440001")));
    }

    @Step
    // Нажатие на login
    public void clickOnTileLogin() {
        WebElement tile = (new WebDriverWait(driver, 10)) // Объявляем элемент tile и ждем его появления на странице
                .until(ExpectedConditions.presenceOfElementLocated(By.xpath(".//*[@id='notifDiv_550e8400-e29b-41d4-a716-446655440003']/../..")));
        tile.click(); // нажимаем на элемент tile после обнаружения
    }

    // Переход во фрейм, где есть кнопка Next
    @Step
    public void switchToFrame03() {
        driver.switchTo().defaultContent();
        driver.switchTo().frame(driver.findElement(By.id("550e8400-e29b-41d4-a716-446655440003")));
        wait(1); // Ждем когда фрейм переключится
    }


и т.д.

В итоге, выполняется только часть кода связанная с @Test. Методы с аннотацией @Step игнорятся.


(Vasiliy Rakshin) #2

Степы/методы надо использовать в самом тесте.


(Роман Васин) #3

Смотрел пример Step-ов Allure https://github.com/allure-examples/allure-junit-example/blob/master/src/main/java/my/company/steps/WebDriverSteps.java, там вроде сделано также по аналогии, что @Step объявляются отдельно в тестовом классе. Либо я не правильно понял.

public class WebDriverSteps{

    private WebDriver driver;

    public WebDriverSteps(WebDriver driver) {
        this.driver = driver;
    }

    @Step
    public void openMainPage() {
        driver.get("http://ya.ru");
    }

    @Step
    public void search(String text) {
        driver.findElement(By.id("text")).sendKeys(text);
        driver.findElement(By.className("suggest2-form__button")).submit();
        new WebDriverWait(driver, 10)
                .withMessage("Could not load results page")
                .until(mainContainLoaded());
    }

(Vasiliy Rakshin) #4

Вы ошиблись.
Степы можно хранить как показано в этом примере отдельно от кода самого теста (для того чтобы использовать их в других тестах).
А вот как они используются в самом тесте:


(Роман Васин) #5

Да, теперь понял как это реализовывается. Спасибо за оперативный ответ!


(Роман Васин) #6

Вынес Step-ы в другой класс, но они все равно не срабатывают при выполнении кода. При этом стала появляться ошибка

java.lang.NoSuchMethodError: io.qameta.allure.aspects.StepsAspects.aspectOf()Lio/qameta/allure/aspects/StepsAspects;

Код класса со степами:

package com.jlr.app;
import com.google.common.base.Predicate;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import io.qameta.allure.Step;

import java.util.concurrent.TimeUnit;


public class CreateProfileSteps {
    private String baseUrl;
    private WebDriver driver;

    public CreateProfileSteps(WebDriver driver) {
        this.driver = driver;
        baseUrl = "http://127.0.0.1:8000";
        driver.get(baseUrl + "/SIMULATOR/index.html");
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); // объявление неявного оижадия
        driver.manage().timeouts().setScriptTimeout(10, TimeUnit.SECONDS); // объявление неявного оижадия для скриптов
    }

    @Step
    public void switchToFrame() {
        driver.switchTo().frame(driver.findElement(By.id("550e8400-e29b-41d4-a716-446655440001")));
    }
    @Step
    public void login() {
        WebElement tile = (new WebDriverWait(driver, 10)) // Объявляем элемент tile и ждем его появления на странице
                .until(ExpectedConditions.presenceOfElementLocated(By.xpath(".//*[@id='notifDiv_550e8400-e29b-41d4-a716-446655440003']/../..")));
        tile.click(); // нажимаем на элемент tile после обнаружения
    }
}

Код тестового класса:

package com.jlr.app;
import org.junit.*;
import org.openqa.selenium.chrome.ChromeDriver;
public class CreateProfileTest {

    private CreateProfileSteps steps;
    
    @Before
    public void setUp() throws Exception {
        steps = new CreateProfileSteps(new ChromeDriver());
    }

  @Test
    public void myTest() throws Exception {
      steps.switchToFrame();
      steps.login();
  }
}

Срабатывает код только с открытием браузера


#7

у меня была такая же проблема, в гиттере подсказали поставить версию aspectjweaver поднять с 1.8.9 на 1.8.10
помогло