我一直试图在使用 Pax 考试创建的 OSGI 容器中运行 JMH 基准测试(类似于此 SO 答案中描述的方式,但也将 Pax 考试放入其中)。但是,在加载编译期间创建的 JMH 生成的资源文件时遇到了一些问题。
编译完测试后,可以在< code>target/test-classes目录中找到以下内容:
$ ls -l target/test-classes/META-INF
BenchmarkList CompilerHints
在测试中,我使用了一些代码(我无法更改),这些代码(有效地)查找文件,如下所示:
getClass().getClassLoader().getResources("META-INF/BenchmarkList");
运行失败(返回0个结果),我得到以下错误:
java.lang.RuntimeException: ERROR: Unable to find the resource: /META-INF/BenchmarkList
at org.openjdk.jmh.runner.AbstractResourceReader.getReaders(AbstractResourceReader.java:96)
at org.openjdk.jmh.runner.BenchmarkList.find(BenchmarkList.java:104)
at org.openjdk.jmh.runner.Runner.internalRun(Runner.java:228)
at org.openjdk.jmh.runner.Runner.run(Runner.java:178)
at com.company.project.performance.MyBenchmarkTest.launchBenchmark(MyBenchmarkTest.java:145)
我尝试过创建一个包含该文件的捆绑包,如下所示:
streamBundle(bundle()
.add("META-INF/BenchmarkList", new FileInputStream("target/test-classes/META-INF/BenchmarkList"))
.build()),
这将创建具有以下内容的 JAR:
META-INF/MANIFEST.MF
META-INF/
META-INF/BenchmarkList
但问题仍然存在。如何使资源文件可用于 JMH?
一个MCVE:
砰.xml:
<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.company.project</groupId>
<artifactId>performance</artifactId>
<version>0.0.1</version>
<packaging>jar</packaging>
<name>MCVE for JMH+PaxExam issue</name>
<prerequisites>
<maven>3.0</maven>
</prerequisites>
<properties>
<apache-servicemix.version>5.4.0</apache-servicemix.version>
<junit.version>4.11</junit.version>
<jmh.version>1.10.1</jmh.version>
<pax-exam.version>4.4.0</pax-exam.version>
<tinybundles.version>2.1.0</tinybundles.version>
<maven-sunfire-report-plugin.version>2.18.1</maven-sunfire-report-plugin.version>
<maven-depends-plugin.version>1.2</maven-depends-plugin.version>
<maven-compiler-plugin.version>3.3</maven-compiler-plugin.version>
<javac.target>1.7</javac.target>
</properties>
<dependencies>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-core</artifactId>
<version>${jmh.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>${jmh.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.ops4j.pax.exam</groupId>
<artifactId>pax-exam</artifactId>
<version>${pax-exam.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.ops4j.pax.exam</groupId>
<artifactId>pax-exam-container-karaf</artifactId>
<version>${pax-exam.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.ops4j.pax.exam</groupId>
<artifactId>pax-exam-junit4</artifactId>
<version>${pax-exam.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.servicemix</groupId>
<artifactId>apache-servicemix</artifactId>
<version>${apache-servicemix.version}</version>
<scope>test</scope>
<type>zip</type>
</dependency>
<dependency>
<groupId>org.ops4j.pax.tinybundles</groupId>
<artifactId>tinybundles</artifactId>
<version>${tinybundles.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.servicemix.tooling</groupId>
<artifactId>depends-maven-plugin</artifactId>
<version>${maven-depends-plugin.version}</version>
<executions>
<execution>
<id>generate-depends-file</id>
<goals>
<goal>generate-depends-file</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-sunfire-report-plugin.version}</version>
<dependencies>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit47</artifactId>
<version>${maven-sunfire-report-plugin.version}</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler-plugin.version}</version>
<configuration>
<source>${javac.target}</source>
<target>${javac.target}</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
src/test/java/com/公司/项目/性能/MyBenchmarkTest.java:
package com.company.project.performance;
import static org.ops4j.pax.exam.CoreOptions.junitBundles;
import static org.ops4j.pax.exam.CoreOptions.maven;
import static org.ops4j.pax.exam.CoreOptions.options;
import static org.ops4j.pax.exam.CoreOptions.streamBundle;
import static org.ops4j.pax.exam.CoreOptions.wrappedBundle;
import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.karafDistributionConfiguration;
import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.keepRuntimeFolder;
import static org.ops4j.pax.tinybundles.core.TinyBundles.bundle;
import static org.ops4j.pax.tinybundles.core.TinyBundles.withBnd;
import java.io.File;
import java.io.FileInputStream;
import java.util.concurrent.TimeUnit;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
import org.ops4j.pax.exam.Configuration;
import org.ops4j.pax.exam.MavenUtils;
import org.ops4j.pax.exam.Option;
import org.ops4j.pax.exam.junit.PaxExam;
import org.ops4j.pax.exam.options.MavenArtifactUrlReference;
@RunWith(PaxExam.class)
public class MyBenchmarkTest
{
public static final String BENCHMARK_LIST = "META-INF/BenchmarkList";
@Benchmark
public void measureThroughput() throws InterruptedException
{
TimeUnit.MILLISECONDS.sleep(100);
}
@Configuration
public Option[] config() throws Exception
{
String karafVersion = MavenUtils.getArtifactVersion("org.apache.karaf", "apache-karaf");
MavenArtifactUrlReference servicemixUrl = maven()
.groupId("org.apache.servicemix")
.artifactId("apache-servicemix")
.versionAsInProject()
.type("zip");
return options(karafDistributionConfiguration()
.frameworkUrl(servicemixUrl)
.useDeployFolder(false)
.karafVersion(karafVersion)
.unpackDirectory(new File("target/exam")),
keepRuntimeFolder(),
junitBundles(),
wrappedBundle(maven("org.openjdk.jmh", "jmh-core")),
streamBundle(bundle()
.add(BENCHMARK_LIST, new FileInputStream("target/test-classes/" + BENCHMARK_LIST))
.build(withBnd())));
}
@Test
public void launchBenchmark() throws Exception
{
Options opts = new OptionsBuilder()
.include("com.company.project.performance.*")
.warmupIterations(1)
.forks(1)
.build();
new Runner(opts).run();
}
}
这个问题显然是一个进出口问题。作为使用元数据的测试,不知道这些额外的数据。使用 streamBundle 生成的捆绑包需要添加一个额外的标头信息,实际导出这些额外的数据。
streamBundle(bundle()
.add(BENCHMARK_LIST, new FileInputStream("target/test-classes/" + BENCHMARK_LIST))
.set(Constants.EXPORT_PACKAGE, BENCHMARK_LIST)
在测试中,您需要确保实际导入它。
@ProbeBuilder
public TestProbeBuilder probeConfiguration(TestProbeBuilder probe) {
//make sure the needed imports are there.
probe.setHeader(Constants.IMPORT_PACKAGE, "*,"+BENCHMARK_LIST);
return probe;
}
另一方面,实际尝试将这些额外的数据添加到测试包中可能会好得多(您的测试类是动态生成的包),因此应该将以下内容添加到配置中
.metaInfResource(BENCHMARK_LIST)
问题内容: 大部分Angular教程都讨论了通过Protractor使用端到端测试来测试编译后的模板是否按预期出炉。我想知道是否可以通过单元测试来做到这一点。 大多数讨论在单元测试中引用HTML代码的教程都描述了在测试中编译自己的书面代码,例如,以确保正确访问指令: 但是,假设我要测试实际模板文件中的代码。就像我想测试ng-hide是否成功设置一样。我希望能够执行以下操作: 我这样做时不起作用。被
Django提供了一组小工具,在写测试时派上用场。 测试客户端 测试客户端是一个Python类,作为一个虚拟的Web浏览器,允许您测试您的视图,并与您的Django供电的应用程序以编程方式交互。 你可以用测试客户端做的一些事情是: 模拟对URL的GET和POST请求,并观察响应 - 从低级HTTP(结果头和状态代码)到页面内容的一切。 查看重定向链(如果有),并在每个步骤中检查网址和状态代码。 测
我试图运行GWT编译与maven通过插件:gwt-maven-plugin,但GWT模块包含在测试源路径,即:src/test/java。插件抱怨找不到GWT模块。 但是,当使用GWT类DevMode通过Eclipse启动文件使用该模块时,该模块工作良好。为什么gwt maven插件找不到gwt模块? 该项目包含2个Gwt模块,1个GwtTotalProd包含在主要来源中,一个GwtTotalTe
我下载了一个名为PDFCLOWN的开源项目。运行它的样本,它似乎运行得很好。 谢谢! 只需提及一下,这个项目使用ant,这意味着编译过程不是由用户直接运行的,而是使用build.xml文件运行的。
问题内容: 这就是我现在正在做的。有没有更好的方法来访问超类? 我正在使用Google Web Toolkit进行编程,但是我认为这确实是一个通用的Java问题。 问题答案: 您可以使用所谓的qualified 。 [JLS 15.8.4。合格的](http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.8
问题内容: 我已经反编译了一个jar(可能出于调试目的)并希望重新编译它。 我已经使用了JAD和JD,并且由于goto指令而无法编译 例如 有没有简单的方法(或任何方法)来重新编译它?(除了手动重构和删除的外) 问题答案: 不,没有。在您的情况下,JD和JAD都无法正确地反编译类文件。“ goto”语句是有关实际程序流程的提示。 您可以直接与Java Decompiler团队联系,发送一个类文件,