使用maven-surefire从javaagent访问测试类

问题描述

我正在尝试进行分析,以便在进行硒测试时捕获定位器的值。由于有大量要测试的项目和版本,因此我想避免直接修改项目文件,因此,我求助于使用javaagent(使用ByteBuddy)。想法是测试测试类,以便它们可以为我获取所需的信息。因此,在我正在分析的项目的pom.xml中,我必须按照以下步骤设置surefire插件

          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>3.0.0-M1</version>
            <configuration>
                <argLine>@{argLine} -javaagent:\path\to\my\agent.jar</argLine>
                <forkCount>0</forkCount>
            </configuration>
          </plugin>

argLine字段允许我将代理附加到surefire进程,而forkCount强制surefire仅使用一个JVM,这应该使我可以看到所有已加载的类(我认为)。

关于代理,我有以下主要方法

public static void premain(final String agentArgs,final Instrumentation inst) {
    System.out.println("Starting to collect metrics");

    new AgentBuilder.Default()
            .with(new AgentBuilder.InitializationStrategy.SelfInjection.Eager())
            .type(ElementMatchers.any())
            .transform(new LocatorReporterTransformer())
            .with(AgentBuilder.Typestrategy.Default.redefine)
            .installOn(inst);
}

我使用ElementMatchers.any()来确保能够查看代理程序拦截的所有类。在LocatorReporterTransormer类中,我具有如下的transform(...)方法

@Override
public DynamicType.Builder<?> transform(DynamicType.Builder<?> builder,TypeDescription typeDescription,ClassLoader classLoader,JavaModule javaModule) {

    System.out.println(typeDescription.getName());
    return builder;
}

我的目标是从测试中捕获一些类,但是似乎它们从未加载到JVM中,这对我来说很奇怪。因此,我的问题是:如何安全地将Javaagent添加到surefire并确保它可以访问所有类? javaagent有没有办法从目标中捕获所有子进程?

解决方法

这些类不是全部可见,因为正在执行多个进程。看来 forkCount = 0 d并没有解决问题。一种解决方案是使用MAVEN_OPTS将代理实际附加到Maven进程上,然后使用 fockMode = never 。这是适用于我的情况的实现:

set "MAVEN_OPTS=-javaagent:\path\to\agent.jar"
mvn test -DforkMode=never