使用 maven-surefire 从 javaagent 访问测试 类
accessing test classes from javaagent using maven-surefire
我正在尝试 运行 一项分析,该分析将在 运行ning selenium 测试时捕获定位器的值。有大量项目和版本要测试,我想避免直接修改项目文件,因此,我求助于使用 javaagent(使用 ByteBuddy)。这个想法是对测试 classes 进行检测,这样他们就会得到我需要的信息。因此,在我正在分析的项目的 pom.xml 中,我必须如下设置 surefire-plugin
<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,这应该允许我看到所有加载的 classes(我想想)。
至于代理,我有如下的premain方法
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() 确保能够看到我的代理截获的所有 classes。在 LocatorReporterTransormer class 中,我有方法 transform(...) 如下
@Override
public DynamicType.Builder<?> transform(DynamicType.Builder<?> builder,
TypeDescription typeDescription,
ClassLoader classLoader,
JavaModule javaModule) {
System.out.println(typeDescription.getName());
return builder;
}
我的目标是从我的测试中捕获一些 classes,但它们似乎从未加载到 JVM 中,这对我来说很奇怪。因此,我的问题是:我如何安全地将 javaagent 添加到 surefire 并确保它可以访问所有 classes?有没有办法让 javaagent 从目标中捕获所有子进程?
类 并非全部可见,因为有不止一个进程在执行。 forkCount = 0 d 似乎没有成功。一种解决方案是使用 MAVEN_OPTS 在 maven 进程上实际附加代理,然后使用 fockMode = never。这是适用于我的情况的实现:
set "MAVEN_OPTS=-javaagent:\path\to\agent.jar"
mvn test -DforkMode=never
我正在尝试 运行 一项分析,该分析将在 运行ning selenium 测试时捕获定位器的值。有大量项目和版本要测试,我想避免直接修改项目文件,因此,我求助于使用 javaagent(使用 ByteBuddy)。这个想法是对测试 classes 进行检测,这样他们就会得到我需要的信息。因此,在我正在分析的项目的 pom.xml 中,我必须如下设置 surefire-plugin
<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,这应该允许我看到所有加载的 classes(我想想)。
至于代理,我有如下的premain方法
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() 确保能够看到我的代理截获的所有 classes。在 LocatorReporterTransormer class 中,我有方法 transform(...) 如下
@Override
public DynamicType.Builder<?> transform(DynamicType.Builder<?> builder,
TypeDescription typeDescription,
ClassLoader classLoader,
JavaModule javaModule) {
System.out.println(typeDescription.getName());
return builder;
}
我的目标是从我的测试中捕获一些 classes,但它们似乎从未加载到 JVM 中,这对我来说很奇怪。因此,我的问题是:我如何安全地将 javaagent 添加到 surefire 并确保它可以访问所有 classes?有没有办法让 javaagent 从目标中捕获所有子进程?
类 并非全部可见,因为有不止一个进程在执行。 forkCount = 0 d 似乎没有成功。一种解决方案是使用 MAVEN_OPTS 在 maven 进程上实际附加代理,然后使用 fockMode = never。这是适用于我的情况的实现:
set "MAVEN_OPTS=-javaagent:\path\to\agent.jar"
mvn test -DforkMode=never