启用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
相关产品推荐
相关产品推荐

