Compartilhando código de teste no Maven


183

Como você pode depender do código de teste de outro módulo no Maven?

Exemplo, eu tenho 2 módulos:

  • Base
  • a Principal

Eu gostaria que um caso de teste no Main estendesse uma classe de teste base no Base. Isso é possível?

Atualização: encontrou uma resposta aceitável , que envolve a criação de um frasco de teste.


1
Parece uma resposta equivalente à combinação da resposta aceite abaixo, que é na verdade uma nota sobre a resposta maior mais adiante, está agora no site do Maven: Como criar um frasco contendo classes de teste
David Tonhofer

Respostas:


189

Eu recomendo usar o tipo em vez do classificador (consulte também: classificador ). Ele informa ao Maven um pouco mais explicitamente o que você está fazendo (e eu descobri que m2eclipse e q4e gostam mais).

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

5
Deve haver uma entrada de dependência separada para com.myco.app, especialmente para o tipo de jar de teste?
Noah Watkins

20
Lembre-se também de adicionar test-jar para configuração de-plugin jar maven: maven.apache.org/guides/mini/guide-attached-tests.html
user1338062

11
Eu estava confuso quando primeiro lendo esta resposta ... Isso é realmente porque não faz sentido em seu próprio país, você deve primeiro ler a resposta abaixo: stackoverflow.com/questions/174560/...
TanguyP

179

Obrigado pela sugestão do módulo base. No entanto, prefiro não criar um novo módulo apenas para esse fim.

Encontrei uma resposta aceitável na documentação do Surefire Maven e em um blog . Consulte também " Como criar um jar contendo classes de teste ".

Isso cria um arquivo jar de código src/test/javausando o plug - in jar, para que os módulos com testes possam compartilhar código.

<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>

Para usar o JAR de teste anexado que foi criado acima, basta especificar uma dependência no artefato principal com um classificador de testes especificado:

<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
Observe que pode haver problemas com o uso de <classifier> tests </ classifier na dependência. Em vez disso, use <type> test-jar </type>. Aqui está um problema no Maven jira.codehaus.org/browse/MNG-2045 e outro não relacionado no IntelliJ youtrack.jetbrains.net/issue/IDEA-54254
Emil Sit

Tem sido muito útil para mim, mas eu encontrei um problema: Quando eu executar "instalar -Dmaven.test.skip = true", também a dependência test-jar é necessária ea proccess falhar
Javi Pedrera

@JaviPedrera funciona para mim, mesmo que eu 'mvn clean install -DskipTests = true' e o test-jar esteja criando. nenhum erro #
Karussell

1
@ Allen você se certificou de usar o ServiceResultTransformer enquanto empacotava seu frasco? Caso contrário, você poderá acabar substituindo os arquivos de serviço.
jontejj


12

Resolvemos isso criando um projeto maven com código de teste como src / main / java e adicionando a seguinte dependência aos projetos:

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

Sim, isso funcionaria, obrigado! Veja meu comentário abaixo para uma resposta alternativa que eu prefiro.
flicken

1
Também usamos essa abordagem, é um pouco tolo que você seja forçado a escolher classificadores ou tipos (que são dificilmente básicos no Maven para a maioria dos usuários) e que você precisa criar o JAR com algum esforço quando realmente não precisa ele ou - como neste caso - você tem de fato o código de não teste como base apenas para o código de teste.
Virgem47

-3

Sim ... basta incluir o módulo Base como uma dependência no Main. Se você estiver herdando apenas o código de teste, poderá usar a tag scope para garantir que o Maven não inclua o código no seu artefato quando implementado. Algo assim deve funcionar:

<dependency>
    <groupId>BaseGroup</groupId>
    <artifactId>Base</artifactId>
    <version>0.1.0-SNAPSHOT</version>
    <scope>test</scope>
</dependency>
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.