Impedir testes de unidade, mas permitir testes de integração no Maven

157

Eu tenho uma compilação do Maven na qual uso o plug-in SureFire para executar alguns testes de unidade e o plug-in FailSafe para executar alguns testes de integração. Eu gostaria de uma maneira de executar apenas os testes do plugin FailSafe.

Não é uma boa solução adicionar perfis diferentes ou qualquer coisa no pom, porque é uma compilação de vários módulos e não quero editar o pom de cada módulo.

Existem skip.testse maven.test.skipe skipTestsquais interrompem todos os testes e skipITs, que interrompe apenas o plug-in à prova de falhas.

Então, existe um sinalizador de linha de comando para o Maven skipITs, mas com a funcionalidade de "onlyITs"?

Matthew Gilliard
fonte
Você tentou maven.test.skipou skipTests?
Thomas
1
@khmarbaise em teoria, sim. Mas na maioria dos projetos que eu tenho trabalhado em, os "testes de unidade" onde os testes realmente de integração com um db na memória (se tiver sorte)
Sean Patrick Floyd
9
@khmarbaise Muitos testes de unidade. Eles levam alguns minutos para serem executados e não precisamos que eles funcionem nessa circunstância. Especificamente, executamos testes de unidade antes de criar o artefato (é claro), mas queremos executar as TIs em vários ambientes. Não faz sentido reexecutar os testes de unidade neste momento.
Matthew Gilliard 07/07
2
Oi @khmarbaise, na minha configuração skipTestspula apenas os testes infalíveis, não o teste à prova de falhas! Talvez seja um novo recurso?
Danidemi 15/05
2
FYI: skipTests agora está obsoleto no Failsafe Plugin 3.0.0-M3 ( SUREFIRE-1611 )
Guillaume Husta

Respostas:

171

Eu encontrei a maneira mais simples de ignorar apenas os testes surefire é configurar o surefire ( mas não com segurança ) da seguinte maneira:

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.14</version>
    <configuration>
        <!-- skips surefire tests without skipping failsafe tests.
                 Property value seems to magically default to false -->
        <skipTests>${skip.surefire.tests}</skipTests>
    </configuration>
</plugin>

Isso permite que você execute mvn verify -Dskip.surefire.testse apenas testes infalíveis, sem falhas, serão ignorados; Ele também executará todas as outras fases necessárias, incluindo pré-integração e pós-integração, e também executará a verifymeta necessária para realmente falhar na sua construção, se seus testes de integração falharem.

Observe que isso redefine a propriedade usada para especificar que os testes devem ser ignorados; portanto, se você fornecer o canônico -DskipTests=true, o surefire o ignorará, mas o fail-safe o respeitará, o que pode ser inesperado, especialmente se você já tiver compilações / usuários especificando esse sinalizador. Uma solução simples parece ter como padrão skip.surefire.testso valor de skipTestsem sua <properties>seção do pom:

<properties>
    <skip.surefire.tests>${skipTests}</skip.surefire.tests>
</properties>

Se necessário, você pode fornecer um parâmetro análogo chamado skip.failsafe.testsà prova de falhas, no entanto, não o acho necessário - porque os testes de unidade geralmente são executados em uma fase anterior, e se eu quiser executar testes de unidade, mas não testes de integração, eu executaria a testfase em vez da verifyfase. Suas experiências podem variar!

Essas skip.(surefire|failsafe).testspropriedades provavelmente devem ser integradas no próprio código infalível / à prova de falhas, mas não tenho certeza de quanto isso violaria o ethos "eles são exatamente o mesmo plugin, exceto por uma pequena diferença".

bacar
fonte
4
Usando esta solução, eu consegui configurar minha estrutura para que -DskipUnitTests pule o plug-in surefire, -DskipIntegrationTests pule o plug-in à prova de falhas e o DskipTests pule os dois. Exatamente o que era necessário!
Alex Jansen
2
meu IDE está reclamando "não é possível resolver o símbolo 'skipTests'", a solução foi adicionar uma linha <skipTests>false</skipTests>ainda funciona com qualquer combinação de -DskipTests ou -Dskip.surefire.tests, pois os argumentos da linha de comando parecem substituir as propriedades stackoverflow.com/questions/13708738 / ... você pode adicionar isso à sua solução
globalworming
<skipTests>${skip.surefire.tests}</skipTests>não está trabalhando com maven-surefire-plugina versão 3.0.0-M3. Todos os testes infalíveis ainda estão em execução. Alguém mais encontrou isso? No entanto, a solução abaixo de Sean Patrick Floyd está funcionando.
John Meyer
120

Uma solução alternativa seria chamar:

mvn clean test-compile failsafe:integration-test

É certo que isso é feio, mas pode resolver seu problema.


Ou (outro hack):

mvn clean integration-test -Dtest=SomePatternThatDoesntMatchAnything -DfailIfNoTests=false

Referência:

Sean Patrick Floyd
fonte
1
A segunda sugestão funcionou para mim. pré-integração-teste foi chamado com sucesso
Lawrence Tierney
7
isso é uma boa ideia? Esse resultado não será bem-sucedido na sua construção, mesmo que seus testes de integração falhem? Essa é toda a essência do sistema à prova de falhas, se você também não executar o objetivo 'verificar' . Citação: "O plug-in à prova de falhas não falhará na compilação durante a fase de teste de integração". Você precisa executar a meta de verificação para realmente informar se os testes de integração foram bem-sucedidos ou não!
23 Jul13
2
@bacar é certo, mas é só usar verifyem vez de integration-testna 2ª solução.
Matthew Gilliard
1
Você realmente deve ver a resposta @bacar para uma solução muito melhor.
FBB
12
Se você adicionar failsafe:verifyno final do primeiro hack ( mvn clean test-compile failsafe:integration-test failsafe:verify), a construção falhará se um dos testes de integração falhar.
Shadow Man
73

Estou usando o código do Blog Antonio Goncalves , que funciona perfeitamente.

Você pode usar as seguintes propriedades:

-DskipUTs=true para pular testes infalíveis.

-DskipITs=true para pular testes à prova de falhas.

-DskipTests=true para pular todos os testes.

O pom.xmlé o seguinte:

<properties>
    <skipTests>false</skipTests>
    <skipITs>${skipTests}</skipITs>
    <skipUTs>${skipTests}</skipUTs>
</properties>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.19.1</version>
            <configuration>
                <skipTests>${skipUTs}</skipTests>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>2.19.1</version>
            <executions>
                <execution>
                    <id>run-integration-tests</id>
                    <phase>integration-test</phase>
                    <goals>
                        <goal>integration-test</goal>
                        <goal>verify</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <skipTests>${skipTests}</skipTests>
                <skipITs>${skipITs}</skipITs>
            </configuration>
        </plugin>
    </plugins>
</build>
Martijn Burger
fonte
2
obrigado, ótima abordagem! também é útil substituir a execução padrão do surefire (teste padrão), consulte: stackoverflow.com/questions/11935181/…
pls
1
essa é a razão pela qual, às vezes, você precisa rolar para baixo e procurar uma boa solução de trabalho com todas as informações necessárias. Obrigado por compartilhar
Atul Chaudhary
Realmente uma boa solução. No entanto, a configuração à prova de falhas é redundante como skipITsé o padrão.
timomeinen
SkipITs é uma opção personalizada nesta configuração. Você está certo na implementação padrão, mas essa não era a questão dos OPs.
31718 Martijn Burger
Parabéns, você é um guru maven! Isso deve estar no superpom maven.
Adam
22

Espero que isto ajude!

Tente executar o teste apenas com o FailSafe (plug-in para integração-teste - ele permitirá executar apenas testes de integração com esse tipo de nome, por padrão: * / IT .java, ** / IT.java, * /*ITCase.java ;, mas você pode facilmente mudar isso do arquivo pom)

mvn failsafe:integration-test

E quando você deseja usar apenas o SureFire (plug-in para teste de unidade)

mvn surefire:test

ou um teste de cada vez com:

mvn -Dtest=MyUnitlTest
Kati Holasz
fonte
9

Eu faço assim para que todas as fases sejam normalmente executadas:

 mvn -Dtest=foo -DfailIfNoTests=false verify
Jérôme Herry
fonte
1
Esta é a solução mais fácil (e honestamente a mais brilhante)!
Titulum 4/07/19
não requer a adição de nada no pom, conforme solicitado pelo OP e executa todas as fases, conforme indicado. Ótima resposta.
jnichols959
1

Para expandir os comentários de @danidemi e @GuillaumeHusta:

FYI: skipTests agora está obsoleto no plug-in Failsafe 3.0.0-M3 ( SUREFIRE-1611 )

Portanto, para pular testes de unidade, mas não testes de integração, você pode fazer isso se estiver usando a versão mais recente do plug-in Failsafe:

mvn verify -DskipTests

(por favor, dê um voto positivo nos comentários mencionados, se isso o ajudar)

meustrus
fonte
-3

Tente executar seus testes de integração ou unidade em um perfil separado. Então você pode simplesmente ativar / desativar o perfil.

Steven
fonte
Talvez adicione um pom pai no qual você define o perfil que está executando apenas ITs? todos os submódulos do projeto podem herdar do pom, portanto, não é necessário alterar todos os pom ou executar os módulos com comutadores especiais (pois é possível ativar o perfil na ausência de propriedade).
yoosiba 8/07