首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Pax考试中访问编译的资源包含测试

在Pax考试中访问编译的资源包含测试
EN

Stack Overflow用户
提问于 2015-07-07 17:38:23
回答 1查看 760关注 0票数 2

我一直试图在一个使用Pax考试创建的OSGI容器中运行JMH基准测试(类似于在this SO answer中描述它的方式,但也使用了Pax测试)。但是在加载编译过程中创建的JMH资源文件时遇到了一些问题。

在编译测试之后,可以在target/test-classes目录中找到以下内容:

代码语言:javascript
复制
$ ls -l target/test-classes/META-INF
BenchmarkList  CompilerHints

在测试中,我使用了一些代码(不能更改),这些代码(实际上)是这样查找文件的:

代码语言:javascript
复制
getClass().getClassLoader().getResources("META-INF/BenchmarkList");

运行此操作失败(返回0结果),并得到以下错误:

代码语言:javascript
复制
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)

我尝试创建一个包含该文件的包,如下所示:

代码语言:javascript
复制
streamBundle(bundle()
  .add("META-INF/BenchmarkList", new FileInputStream("target/test-classes/META-INF/BenchmarkList"))
  .build()),

它确实创建了一个具有以下内容的JAR:

代码语言:javascript
复制
META-INF/MANIFEST.MF
META-INF/
META-INF/BenchmarkList

但问题依然存在。如何为JMH提供资源文件?

MCVE An

pom.xml

代码语言:javascript
复制
<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/company/project/performance/MyBenchmarkTest.java

代码语言:javascript
复制
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();
    }
}
EN

回答 1

Stack Overflow用户

发布于 2015-07-10 07:15:03

这个问题显然是一个进口出口问题。由于您正在使用元数据的测试,不知道这些额外的数据。您用streamBundle生成的包需要添加一个额外的头信息--实际上是导出这些额外数据。

代码语言:javascript
复制
streamBundle(bundle()
   .add(BENCHMARK_LIST, new FileInputStream("target/test-classes/" + BENCHMARK_LIST))
   .set(Constants.EXPORT_PACKAGE, BENCHMARK_LIST)

在您的测试中,您需要确保您实际上是在导入它。

代码语言:javascript
复制
@ProbeBuilder
public TestProbeBuilder probeConfiguration(TestProbeBuilder probe) {
    //make sure the needed imports are there. 
    probe.setHeader(Constants.IMPORT_PACKAGE, "*,"+BENCHMARK_LIST);
    return probe;
}

另一方面,尝试将这些额外的数据添加到测试包中可能会好得多(您的测试类是动态生成的),因此应该将以下内容添加到配置中

代码语言:javascript
复制
.metaInfResource(BENCHMARK_LIST)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31275660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档