Surefire não está pegando testes Junit 5

113

Escrevi um método de teste simples com JUnit 5:

public class SimlpeTest {
    @Test
    @DisplayName("Some description")
    void methodName() {
        // Testing logic for subject under test
    }
}

Mas quando eu corro mvn test, eu tenho:

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running SimlpeTest
Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec

Results :

Tests run: 0, Failures: 0, Errors: 0, Skipped: 0

De alguma forma, o surefire não reconheceu essa classe de teste. Minha pom.xmlaparência é:

<properties>
    <java.version>1.8</java.version>
    <junit.version>5.0.0-SNAPSHOT</junit.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.junit</groupId>
        <artifactId>junit5-api</artifactId>
        <version>${junit.version}</version>
        <scope>test</scope>
    </dependency>
</dependencies>

<repositories>
    <repository>
        <id>snapshots-repo</id>
        <url>https://oss.sonatype.org/content/repositories/snapshots</url>
        <releases>
            <enabled>false</enabled>
        </releases>
        <snapshots>
            <updatePolicy>always</updatePolicy>
            <enabled>true</enabled>
        </snapshots>
    </repository>
</repositories>

<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>${java.version}</source>
                <target>${java.version}</target>
            </configuration>
        </plugin>
    </plugins>
</build>

Alguma ideia de como fazer isso funcionar?

Ali Dehghani
fonte
1
Agora você deve usar uma implementação especial do plugin surefire. Veja os exemplos da equipe junit aqui
jah
1
A pergunta é baseada em uma versão desatualizada, mas esta resposta é baseada na atual (em dezembro de 2016).
Nicolai
@Nicolai Obrigado por atualizar a resposta. De qualquer forma, gostaria de receber sua edição na questão, se você tiver tempo.
Ali Dehghani
1
Este erro não ocorre mais assim. O caso mais provável de falta de execução de teste é abordado por esta questão .
Nicolai
Certifique-se de que os arquivos de teste estão no lugar certo. Por padrão, o teste deve ser irmão de main na pasta src.
Joe Bowbeer

Respostas:

115

O maven-surefire-plugin, a partir de hoje, não tem suporte total do JUnit 5 . Há um problema em aberto sobre a adição deste suporte no SUREFIRE-1206 .

Como tal, você precisa usar um provedor personalizado . Um já foi desenvolvido pela equipe JUnit; do guia do usuário , você precisa adicionar o junit-platform-surefire-providerprovedor e a TestEngineimplementação para a nova API:

<build>
  <plugins>        
    <plugin>
      <artifactId>maven-surefire-plugin</artifactId>
      <!-- latest version (2.20.1) does not work well with JUnit5 -->
      <version>2.19.1</version>
      <dependencies>
        <dependency>
          <groupId>org.junit.platform</groupId>
          <artifactId>junit-platform-surefire-provider</artifactId>
          <version>1.0.3</version>
        </dependency>
        <dependency>
          <groupId>org.junit.jupiter</groupId>
          <artifactId>junit-jupiter-engine</artifactId>
          <version>5.0.3</version>
        </dependency>
      </dependencies>
    </plugin>
  </plugins>
</build>

Além disso, certifique-se de declarar a junit-jupiter-apidependência com um escopo de test:

<dependencies>
  <dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.0.3</version>
    <scope>test</scope>
  </dependency>
</dependencies>
Tunaki
fonte
25
Vale a pena notar que, neste momento, o surefire 2.20.1 não funciona com o provedor junit 5, portanto, o 2.19.1 usado na amostra ainda é válido, apesar do ano passado.
splatch
1
surefire 2.21.0 não funciona também, é necessário reverter para 2.19.1
valodzka
@valodzka Para mim, ele funciona com versões 2.21.0 e mais recentes do plugin e junit5. Veja junit.org/junit5/docs/current/user-guide/…
Thirler
Verificado: maven-surefire-plugin v2.21.0funciona bem com junit-jupiter-engine v5.2.0e junit-platform-surefire-provider v1.2.0
povis de
2
Esta configuração falhará com Surefire 2.22.0 ou superior. Você precisa excluir os departamentos Junit da configuração do Surefire. Eu escrevi um post rápido sobre isso aqui - springframework.guru/…
John Thompson
51

Atualização 2

O problema foi corrigido no Maven Surefire Plugin v2.22.0

A nova versão está disponível no Repositório Central Maven.

Maven

<dependency>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.0</version>
</dependency>

Gradle

compile group: 'org.apache.maven.plugins', name: 'maven-surefire-plugin', version: '2.22.0'

Atualizar

Como Marian apontou, a versão mais recente do JUnit 5 Platform Surefire Provider (1.2.0) oferece suporte à versão mais recente do Maven Surefire Plugin (2.21.0) :

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.21.0</version>
            <dependencies>
                <dependency>
                    <groupId>org.junit.platform</groupId>
                    <artifactId>junit-platform-surefire-provider</artifactId>
                    <version>1.2.0</version>
                </dependency>
            </dependencies>
        </plugin>



Exemplo

pom.xml

<dependencies>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.2.0</version>
        <scope>test</scope>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.21.0</version>
            <dependencies>
                <dependency>
                    <groupId>org.junit.platform</groupId>
                    <artifactId>junit-platform-surefire-provider</artifactId>
                    <version>1.2.0</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

TestScenario.java

package test;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

public class TestScenario {

    @Test
    @DisplayName("Test 2 + 2 = 4")
    public void test() {
        Assertions.assertEquals(4, 2 + 2);
    }
}

Saída (instalação limpa mvn)

...
[INFO] --- maven-surefire-plugin: 2.21.0 : test (teste padrão) @ test --- [INFO]
[INFO] -------------- -----------------------------------------
[INFO] TESTES
[INFO] - -------------------------------------------------- ---
[INFO] Executando test.TestScenario
[INFO] Testes executados: 1, Falhas: 0, Erros: 0, Ignorado: 0, Tempo decorrido: 0,005 s - em test.TestScenario
[INFO]
[INFO] Resultados:
[INFO] ]
[INFO] Testes executados: 1 , Falhas: 0, Erros: 0, Ignorados: 0
...


Maneira mais simples até hoje:

    <plugin>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.19.1</version>
        <dependencies>
            <dependency>
                <groupId>org.junit.platform</groupId>
                <artifactId>junit-platform-surefire-provider</artifactId>
                <version>1.1.0</version>
            </dependency>
        </dependencies>
    </plugin>
Mikhail Kholodkov
fonte
1
Isso só funciona por causa do Teste no nome da classe. Renomeie a classe para ExampleScenario - ela não será descoberta. (Surefire 2.22.0)
Alexei Vinogradov
@AlexeiVinogradov Sim. É um comportamento esperado. Mais informações disponíveis aqui: stackoverflow.com/a/6178629/3523579
Mikhail Kholodkov
bevare, versão do motor junit vs. versão pai do spring boot. Basta especificar a dependência junit-jupiter-engine: 5.1 não funciona onde as versões mais recentes sim. O Spring boot ainda tem JUnit4 <junit.version> 4.13 pré-configurado.
Wooff
20

Da documentação do JUnit 5 :

A partir da versão 2.22.0, o Maven Surefire fornece suporte nativo para a execução de testes na plataforma JUnit.

Além disso, você pode ler na maven-surefire-plugindocumentação :

Usando a plataforma JUnit 5

Para começar a usar a plataforma JUnit, você precisa adicionar pelo menos uma única TestEngineimplementação ao seu projeto. Por exemplo, se você deseja escrever testes com Júpiter, adicione o artefato de teste junit-jupiter-engine às dependências no POM

Então, isso é o suficiente para fazer os testes JUnit 5:

<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>davidxxx</groupId>
    <artifactId>minimal-pom-junit5</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <properties>
        <junit-jupiter.version>5.2.0</junit-jupiter.version> 
        <!--optional below but good practice to specify our java version-->
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${junit-jupiter.version}</version>
            <scope>test</scope>
        </dependency>

        <!--optional below -->
        <!-- add any JUnit extension you need such as -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-params</artifactId>
            <version>${junit-jupiter.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.0</version>
            </plugin>
        </plugins>
    </build>

</project>

No meu espaço do GitHub, adicionei um projeto de amostra de trabalho do maven que você pode navegar / clonar.
URL: https://github.com/ebundy/junit5-minimal-maven-project

davidxxx
fonte
9

Eu encontrei esse problema com JUnit5 e Maven, mas também notei que, mesmo se apenas junit-jupiter-engine fosse adicionado como uma dependência, os testes seriam executados em alguns projetos, não em outros . E eu meio que vejo o mesmo padrão nos comentários aqui: No comentário do @Alex acima, você pode ver que ele não tem nenhum problema, mesmo com versões anteriores de surefire / junit / platform.

Depois de coçar a cabeça por algum tempo, percebi que aqueles projetos em que os testes não funcionavam eram aqueles em que os nomes dos métodos de teste não continham a palavra "teste". Embora isso não seja obrigatório por http://maven.apache.org/surefire/maven-surefire-plugin/examples/inclusion-exclusion.html

Em outras palavras: apenas com

    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.2.0</version>
        <scope>test</scope>
    </dependency>

isto

@Test
public void something() {
    assertTrue(true);
}

NÃO será executado, enquanto

@Test
public void testSomething() {
    assertTrue(true);
}

SERÁ executado!

Este problema se desenrola como uma boneca russa ...

De qualquer forma, +1 para @Mikhail Kholodkov, cuja resposta atualizada corrige todos os problemas de uma vez!

Fabien M
fonte
Também acabei de experimentar um problema com mvn 3.5.0, jdk 1.8.0_101 onde meu nome de classe não tinha 'Teste' e o teste não foi escolhido, isso me ajudou a descobrir isso!
dann.dev
Sim, de fato, você deve ser compatível com maven.apache.org/surefire/maven-surefire-plugin/examples/… Mas eu estava falando sobre algo diferente.
Fabien M
Sim, descobri que tive dois problemas, o primeiro foi não lembrar as regras básicas do teste infalível de maven. O segundo não estava fazendo um projeto de atualização Maven> para o eclipse para pegar o lançador junit 5.
dann.dev
Eu gostaria de acrescentar que a classe e os métodos devem ser públicos.
Jónás Balázs
6

Eu encontrei o mesmo problema em agosto de 2019 sobre o qual perguntei aqui: o Maven falha silenciosamente em encontrar testes JUnit para executar . Essas respostas me levaram na direção certa, mas descobri que você pode resolver o problema de forma ainda mais concisa. Copiei minha solução do projeto Maven de amostra JUnit5 .

A partir do JUnit 5.5.1 e maven-surefire-plugin2.22.2, você não precisa adicionar a junit-platform-surefire-providerdependência. É suficiente ter esta dependência e um plug-in especificado em pom.xml:

<dependencies>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter</artifactId>
        <version>5.5.1</version>
        <scope>test</scope>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.2</version>
        </plugin>
    </plugins>
</build>
Workerjoe
fonte
Esta é a abordagem correta e concisa. Funciona com OpenJDK 11 e JUnit 5.6.2.
prata
5

Só para complementar, o surefire 2.22.0 + junit 5.2.0 + plataforma 1.2.0 também funciona. Em anexo está um pom de trabalho para sua referência:

    <?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.jjhome.junit5</groupId>
    <artifactId>junit5-hone</artifactId>
    <packaging>jar</packaging>
    <version>1.0.0-SNAPSHOT</version>
    <name>junit5-home</name>

    <properties>
        <maven.compiler.source>1.6</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <junit5.version>5.2.0</junit5.version>
        <platform.version>1.2.0</platform.version>
        <surefire.version>2.22.0</surefire.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>${junit5.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-params</artifactId>
            <version>${junit5.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${junit5.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.vintage</groupId>
            <artifactId>junit-vintage-engine</artifactId>
            <version>${junit5.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-launcher</artifactId>
            <version>${platform.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-runner</artifactId>
            <version>${platform.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>${surefire.version}</version>
                <dependencies>
                    <dependency>
                        <groupId>org.junit.platform</groupId>
                        <artifactId>junit-platform-surefire-provider</artifactId>
                        <version>${platform.version}</version>
                    </dependency>
                    <dependency>
                        <groupId>org.junit.jupiter</groupId>
                        <artifactId>junit-jupiter-engine</artifactId>
                        <version>${junit5.version}</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>
</project>
Schnell18
fonte
Meu problema era que eu não tinha junit-vintage-engineuma dependência e todos os meus testes foram escritos para o JUnit 4.
Marcar
a combinação de versões especificadas de junit, plataforma e infalível funcionou para mim. obrigado !
CoderTR
4

No meu caso, isso foi por causa do TestNG no caminho de classe ( SUREFIRE-1527 ). Groovy 2.5.5 POM trouxe com o groovy-testngmódulo.

O provedor de estrutura de teste especificado manualmente (conforme descrito em https://maven.apache.org/surefire/maven-surefire-plugin/examples/providers.html ) resolveu o problema:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.1</version>

    <dependency>
        <groupId>org.apache.maven.surefire</groupId>
        <artifactId>surefire-junit-platform</artifactId>
        <version>2.22.1</version>
    </dependency>
Lu55
fonte
Você deve envolver o <dependency>em <dependencies>sua amostra de código.
user1053510
1

Eu tive um problema semelhante também fazendo com que o Surefire reconhecesse zero testes.

Meu problema acabou por estar relacionado ao seguinte (da documentação JUnit 5.1.0 / maven ):

Devido a um vazamento de memória no Surefire 2.20 e problemas em execução no Java 9, o junit-platform-surefire-provider atualmente funciona apenas com o Surefire 2.19.1.

Eu estava tentando usar as versões mais recentes do Surefire (2.21.0) e junit-platform-surefire-provider (1.1.0), e não funcionou (nem no Java 8 ou 9)

Voltar para o Surefire 2.19.1 resolveu meu problema.

De acordo com este problema, uma correção será incluída na versão 1.2.0 do junit-platform-surefire-provider (atualmente disponível apenas como SNAPSHOT).

avandeursen
fonte
1
Tentei os SNAPSHOTs e está tudo funcionando (com Surefire 2.21.0). Esperançosamente, ainda estará funcionando no momento do lançamento.
user7610
1

Uma coisa eu percebi que consegui fazer funcionar:

  • Nomear minha classe de teste ClinicCalendarShouldnão foi escolhido pelo maven
  • Nomear minha classe de teste ClinicCalendarTestPODE ser escolhido pelo maven

Portanto, a menos que esteja faltando algum tipo de configuração ou parâmetro ou qualquer outra coisa no plug-in infalível, por padrão, você precisa nomear suas classes de teste como XXXTest.

jkilgrow
fonte
0

A atualização para maven-surefire-plugin:2.20executa os testes do Junit5 sem problemas.

Mas estou usando a M6versão no Junit5.

LazerBanana
fonte
Não é tão simples (pelo menos no momento). Consulte o Guia do usuário JUnit 5
FrVaBe 01 de
@FrVaBe estranho funciona muito bem no meu com a versão m6.
LazerBanana 01 de
2
Eu cansei do surefire-2.20.1 + junit-5.0.2 e não funcionou. Eu também tentei surefire-2.20.1 + junit-5.1.0-M6 e não funcionou
Eric
0

No meu caso, o plugin infalível não obteve a versão correta do jupiter-engine / api. E isso mesmo rodando o Maven 3.6.1 e o surefireplugin Versão 2.22.2!

Agora, minha configuração de plug-in infalível se parece com:

<pluginManagement>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.2</version>
            <dependencies>
                <dependency>
                    <groupId>org.junit.jupiter</groupId>
                    <artifactId>junit-jupiter-engine</artifactId>
                    <version>5.5.2</version>
                </dependency>
            </dependencies>
        </plugin>

        ...
    </plugins>
</pluginManagement>

Além disso, tive que forçar estas versões:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.5.2</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.5.2</version>
        </dependency>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-engine</artifactId>
            <version>1.5.2</version>
        </dependency>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-commons</artifactId>
            <version>1.5.2</version>
        </dependency>
    </dependencies>
</dependencyManagement>

Parece que 5.5.2 foi vinculado à versão 1.3.2 da plataforma errada em vez de 1.5.2 no meu caso.

Todos os testes JUnit5 são selecionados agora. Mesmo com o 2.22.0 do plugin infalível, esse não foi o meu caso!

Espero que ajude...

Dirk
fonte
0

Eu estava enfrentando o mesmo problema junit5e os maven-surefiretestes estavam falhando. No entanto, junit4estava funcionando bem. A combinação abaixo funcionou para mim, não adiciono o controle de versão. Use junit-bompara gerenciamento de dependências. Usandospring-boot 2.1.4

   <dependencyManagement>
    <dependencies>
            <dependency>
                <groupId>org.junit</groupId>
                <artifactId>junit-bom</artifactId>
                <version>5.6.1</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <scope>test</scope>
        </dependency>

<build>
    <plugins>
        <plugin>
            <artifactId>maven-surefire-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Certifique-se de atualizar para a versão mais recente do eclipse

garg10may
fonte