当前位置: 首页 > 知识库问答 >
问题:

访问包含Pax Exam的测试中的编译资源

诸葛茂勋
2023-03-14

我一直试图在使用 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();
    }
}

共有1个答案

澹台新知
2023-03-14

这个问题显然是一个进出口问题。作为使用元数据的测试,不知道这些额外的数据。使用 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团队联系,发送一个类文件,