You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

启用AspectJ织入后Allure报告无步骤显示的原因排查

AspectJ切面导致Allure @Step报告步骤消失的排查指引

我正在开发一款自动化测试框架,需要给标注了Allure @Step注解的方法添加执行起止日志。原本正常展示步骤的Allure报告,引入AspectJ切面后所有步骤都消失了。推测是AspectJ和Allure存在冲突,但不确定具体原因。已经尝试重构pom.xml、禁用aop-ajc.xml,删除自定义aop.xml后报告恢复正常,但无法完成织入操作,需要排查方向指引。


排查方向

1. 织入优先级与代理冲突排查

Allure的@Step注解依赖字节码增强实现步骤追踪,AspectJ的切面织入可能覆盖或干扰了Allure的增强逻辑:

  • 在aop.xml的weaver标签中添加options="-verbose -showWeaveInfo",查看织入日志,确认Allure相关类是否被正常处理。
  • 在weaver部分添加<exclude within="io.qameta.allure.*"/>,排除Allure包的织入,避免切面干扰其内部逻辑。

2. 切面表达式与注解匹配冲突

你的切面表达式直接匹配@Step注解的方法,可能拦截了Allure对@Step的原生处理:

  • 修改切面切入点,改用方法路径+注解的间接匹配逻辑,或者将@Before/@After改为@Around,并确保ProceedingJoinPoint.proceed()正常执行,避免阻断原方法的Allure增强逻辑。
  • 通过AspectJ的verbose日志,确认切面是否误织入了Allure内部处理@Step的类或方法。

3. Java版本与依赖兼容性

当前使用Java 22、AspectJ 1.9.22、Allure 2.25.0,可能存在高版本Java的字节码兼容性问题:

  • 临时降低Java版本到17(LTS版本),验证是否是版本不兼容导致的冲突。
  • 升级AspectJ到最新稳定版本,或降级Allure到官方标注支持Java 22的版本。

4. Surefire插件配置问题

Surefire中同时配置Allure Listener和AspectJ JavaAgent,可能存在类加载顺序冲突:

  • 调整argLine的顺序,确保Allure相关系统属性先于AspectJ Agent加载。
  • 在Surefire配置中添加<forkCount>1</forkCount>,强制创建独立JVM进程,避免类加载冲突。

相关配置与代码示例

pom.xml示例

<?xml version="1.0" encoding="UTF-8"?>
<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>org.example</groupId>
    <artifactId>ATPW</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>22</maven.compiler.source>
        <maven.compiler.target>22</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

        <java.version>22</java.version>
        <playwright.version>1.41.2</playwright.version>
        <junit.version>5.10.2</junit.version>
        <allure.version>2.25.0</allure.version>
        <allure-maven.version>2.12.0</allure-maven.version>
        <allure-junit5.version>2.25.0</allure-junit5.version>
        <maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version>
        <aspectj.version>1.9.22</aspectj.version>
        <lombok.version>1.18.32</lombok.version>
        <log4j.version>2.23.1</log4j.version>
        <aspectj.version>1.9.22</aspectj.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.microsoft.playwright</groupId>
            <artifactId>playwright</artifactId>
            <version>${playwright.version}</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>${junit.version}</version>
        </dependency>
        <dependency>
            <groupId>io.qameta.allure</groupId>
            <artifactId>allure-junit5</artifactId>
            <version>${allure.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>${log4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>${log4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>${aspectj.version}</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>${aspectj.version}</version>
        </dependency>
    </dependencies>


    <build>
        <plugins>
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>3.2.5</version>
                <configuration>
                    <properties>
                        <configurationParameters>
                            junit.jupiter.execution.parallel.enabled=true
                            junit.jupiter.execution.parallel.mode.default=concurrent
                        </configurationParameters>
                        <property>
                            <name>listener</name>
                            <value>io.qameta.allure.junit5.AllureJunit5</value>
                        </property>
                    </properties>
                    <systemProperties>
                        <property>
                            <name>allure.results.directory</name>
                            <value>${project.basedir}/target/allure-results</value>
                        </property>
                        <property>
                            <name>junit.jupiter.extensions.autodetection.enabled</name>
                            <value>true</value>
                        </property>
                    </systemProperties>
                    <includes>
                        <include>**/*Tests.java</include>
                    </includes>
                    <argLine>
                        -javaagent:"${settings.localRepository}\org\aspectj\aspectjweaver\${aspectj.version}\aspectjweaver-${aspectj.version}.jar"
                    </argLine>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>org.aspectj</groupId>
                        <artifactId>aspectjweaver</artifactId>
                        <version>${aspectj.version}</version>
                    </dependency>
                    <dependency>
                        <groupId>org.junit.jupiter</groupId>
                        <artifactId>junit-jupiter-api</artifactId>
                        <version>${junit.version}</version>
                    </dependency>
                    <dependency>
                        <groupId>org.junit.jupiter</groupId>
                        <artifactId>junit-jupiter-engine</artifactId>
                        <version>${junit.version}</version>
                    </dependency>
                </dependencies>
            </plugin>
            <plugin>
                <groupId>io.qameta.allure</groupId>
                <artifactId>allure-maven</artifactId>
                <version>${allure-maven.version}</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>${maven-compiler-plugin.version}</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
            </plugin>
<!--            <plugin>-->
<!--                <groupId>dev.aspectj</groupId>-->
<!--                <artifactId>aspectj-maven-plugin</artifactId>-->
<!--                <version>1.14</version>-->
<!--                <dependencies>-->
<!--                    <dependency>-->
<!--                        <groupId>org.aspectj</groupId>-->
<!--                        <artifactId>aspectjtools</artifactId>-->
<!--                        <version>${aspectj.version}</version>-->
<!--                    </dependency>-->
<!--                </dependencies>-->
<!--                <configuration>-->
<!--                    <complianceLevel>22</complianceLevel>-->
<!--                    <showWeaveInfo>true</showWeaveInfo>-->
<!--                    <verbose>true</verbose>-->
<!--                    <encoding>UTF-8</encoding>-->
<!--                </configuration>-->
<!--                <executions>-->
<!--                    <execution>-->
<!--                        <goals>-->
<!--                            <goal>compile</goal>-->
<!--                            <goal>test-compile</goal>-->
<!--                        </goals>-->
<!--                    </execution>-->
<!--                </executions>-->
<!--            </plugin>-->
        </plugins>
    </build>
</project>

aop.xml示例

<aspectj>
    <weaver options="-verbose">
        <include within="test.java.*"/>
    </weaver>
    <aspects>
        <aspect name="utils.logging.LoggingAspect"/>
    </aspects>
</aspectj>

切面类示例

package utils.logging;

import constants.LoggingMessage;
import io.qameta.allure.Step;
import org.aspectj.lang.annotation.*;
import org.junit.jupiter.api.DisplayName;

@Aspect
public class LoggingAspect {

    private static final String STEP_LOGGING_ANNOTATION_VALUE = "execution(* steps.*.*(..)) && @annotation(step)";
    private static final String TEST_LOGGING_ANNOTATION_VALUE = "execution(* tests.*.*(..)) && @annotation(displayName)";

    @Before(STEP_LOGGING_ANNOTATION_VALUE)
    public void logBeforeStep(Step step) {
        AllureLogger.info(String.format(LoggingMessage.StepsAction.STEP_EXECUTION_START, step.value()));
    }

    @After(STEP_LOGGING_ANNOTATION_VALUE)
    public void logAfterStep(Step step) {
        AllureLogger.info(String.format(LoggingMessage.StepsAction.STEP_EXECUTION_FINISH, step.value()));
    }

    @Before(TEST_LOGGING_ANNOTATION_VALUE)
    public void logBeforeTest(DisplayName displayName) {
        AllureLogger.info(String.format(LoggingMessage.TestsAction.TESTS_EXECUTION_START,
                displayName.value()));
    }

    @After(TEST_LOGGING_ANNOTATION_VALUE)
    public void logAfterTest(DisplayName displayName) {
        AllureLogger.info(String.format(LoggingMessage.TestsAction.TESTS_EXECUTION_FINISH,
                displayName.value()));
    }
}

Step类示例

import io.qameta.allure.Step;
import pageobjects.pages.HomePage;

import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertTrue;

public class HomeSteps {

    private final HomePage homePage = new HomePage();
    @Step("Hover over Left Side menu")
    public void hoverOverLeftSideMenu() {
        homePage.leftSidePanelForm.hoverOverHomeContainer();
    }
    @Step("Select Call Center option from the container")
    public void selectCallCenterOptionFromTheContainer() {
        homePage.leftSidePanelForm.clickCallCenterButton();
    }
    @Step("Verify Left Side menu is displayed")
    public void verifyLeftSideMenuIsDisplayed() {
        assertTrue(homePage.leftSidePanelForm.isHomeContainerDisplayed(),
                String.format(AssertMessage.ElementState.MENU_NOT_DISPLAYED, "Left Side", homePage.getName()));
    }
}

内容的提问来源于stack exchange,提问作者Vanadium

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 09:22:04