在Maven中共享测试代码


183

您如何依赖Maven中另一个模块的测试代码?

例如,我有2个模块:

  • 基础
  • 主要

我想要Main中的测试用例来扩展Base中的基本测试类。这可能吗?

更新:找到了可接受的答案,其中涉及创建测试罐。


1
看来,此答案等同于以下已接受答案的组合,实际上是下面更大的答案的注释,现在在Maven网站上:如何创建一个包含测试类的jar
David Tonhofer

Answers:


189

我建议使用type而不是classifier(另请参阅:classifier)。它可以更清楚地告诉Maven您正在做什么(我发现m2eclipse和q4e都更喜欢它)。

<dependency>
  <groupId>com.myco.app</groupId>
  <artifactId>foo</artifactId>
  <version>1.0-SNAPSHOT</version>
  <type>test-jar</type>
  <scope>test</scope>
</dependency>

5
com.myco.app是否应该有一个专门针对test-jar类型的依赖项?
Noah Watkins'4

20
还记得测试jar添加到Maven的JAR-插件配置:maven.apache.org/guides/mini/guide-attached-tests.html
user1338062

11
:首先读取这个答案时,我被搞糊涂了......这实际上是因为它并不在自己的道理,你应该先阅读以下答案stackoverflow.com/questions/174560/...
TanguyP

179

感谢您对基本模块的建议。但是,我不想为此创建一个新模块。

Surefire Maven文档博客中找到了可接受的答案。另请参见“ 如何创建包含测试类的jar ”。

这将通过src/test/java使用jar插件来创建代码的jar文件,以便具有测试的模块可以共享代码。

<project>
  <build>
    <plugins>
     <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-jar-plugin</artifactId>
       <version>2.4</version>
       <executions>
         <execution>
           <goals>
             <goal>test-jar</goal>
           </goals>
         </execution>
       </executions>
     </plugin>
    </plugins>
  </build>
</project>

为了使用上面创建的附加测试JAR,您只需使用指定的测试分类器指定对主工件的依赖项:

<project>
  ...
  <dependencies>
    <dependency>
      <groupId>com.myco.app</groupId>
      <artifactId>foo</artifactId>
      <version>1.0-SNAPSHOT</version>
      <type>test-jar</type>
      <scope>test</scope>
    </dependency>
  </dependencies>
  ...
</project> 

14
请注意,在依赖项中使用<classifier> tests </ classifier可能会出现问题。而是使用<type> test-jar </ type>。下面是Maven的一个问题jira.codehaus.org/browse/MNG-2045和一个无关的IntelliJ中youtrack.jetbrains.net/issue/IDEA-54254
埃米尔坐

它对我非常有用,但是我发现了一个问题:当我执行“ install -Dmaven.test.skip = true”时,还需要依赖项test-jar并且该过程失败
Javi Pedrera

@JaviPedrera它对我有用,即使我执行“ mvn clean install -DskipTests = true”,并且将创建测试罐。没有错误
Karussell 2013年

1
@Allen是否已在包装jar时确保使用ServiceResultTransformer?否则,您最终可能会导致服务文件相互覆盖。
jontejj 2015年

1
maven.apache.org/plugins/maven-shade-plugin/examples/…在那里,您可以了解更多信息。
jontejj 2015年

12

我们通过制作一个测试代码为src / main / java的maven项目并向项目添加以下依赖关系来解决此问题:

    <dependency>
        <groupId>foo</groupId>
        <artifactId>test-base</artifactId>
        <version>1</version>
        <scope>test</scope>
    </dependency>

是的,那行得通,谢谢!请参阅下面的评论,以获得我更喜欢的替代答案。
2008年

1
我们也使用这种方法,您被迫选择分类器或类型(对于大多数用户而言,这在Maven中几乎不是基本知识)有点愚蠢,并且当您真的不需要时,您必须付出一些努力来构建JAR或-在这种情况下-您实际上已经将非测试代码作为测试代码的基础。
virgo47

-3

是的...只是将Base模块作为依赖项包含在Main中。如果您只是继承测试代码,则可以使用scope标记来确保Maven在部署时不会在您的工件中包含代码。这样的事情应该起作用:

<dependency>
    <groupId>BaseGroup</groupId>
    <artifactId>Base</artifactId>
    <version>0.1.0-SNAPSHOT</version>
    <scope>test</scope>
</dependency>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.