Surefire Junit 5 testlerini almıyor


113

JUnit 5 ile basit bir test yöntemi yazdım:

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

Ama koştuğumda şunlara mvn testsahibim:

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

Her nasılsa, surefire o test sınıfını tanımadı. Benim pom.xmlgörünüyor gibi:

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

Bunun nasıl yapılacağına dair bir fikrin var mı?


1
Şu anda surefire eklentisinin özel bir uygulamasını kullanmalısınız. Junit ekibinin örneklerine buradan göz
jah

1
Soru güncel olmayan bir sürüme dayanıyor, ancak bu cevap mevcut olanı temel alıyor (Aralık 2016 itibariyle).
Nicolai

@Nicolai Cevabı güncellediğiniz için teşekkürler. Her neyse, vaktiniz varsa, söz konusu düzenlemenizden memnun olurum.
Ali Dehghani

1
Bu hata artık böyle olmuyor. Testin yürütülmemesi için en olası durum bu sorunun kapsamındadır .
Nicolai

Test dosyalarının doğru yerde olduğundan emin olun. Varsayılan olarak test src klasörü altında main'in kardeşi olmalıdır.
Joe Bowbeer

Yanıtlar:


115

maven-surefire-plugin, Bugün itibariyle yok JUnit 5 tam desteklenmediği . Bu desteği SUREFIRE-1206'ya eklemeyle ilgili açık bir sorun var .

Bu nedenle, özel bir sağlayıcı kullanmanız gerekir . Biri JUnit ekibi tarafından zaten geliştirildi; dan kullanıcı kılavuzunda , eklemek gerekir junit-platform-surefire-providersağlayıcı ve TestEngineyeni API için uygulama:

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

Ayrıca, junit-jupiter-apibağımlılığı aşağıdaki kapsamda beyan ettiğinizden emin olun test:

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

25
Şu anda surefire 2.20.1'in junit 5 sağlayıcısı ile çalışmadığını, dolayısıyla örneklemde kullanılan 2.19.1'in geçen yıla rağmen hala geçerli olduğunu belirtmek gerekir.
splatch

1
surefire 2.21.0 da çalışmıyor,
2.19.1'e

@valodzka Benim için eklentinin 2.21.0 ve daha yeni sürümleri ve junit5 ile çalışıyor. Bakınız junit.org/junit5/docs/current/user-guide/…
Thirler

Doğrulandı: ve maven-surefire-plugin v2.21.0ile iyi çalışıyorjunit-jupiter-engine v5.2.0junit-platform-surefire-provider v1.2.0
povis

2
Bu yapılandırma, Surefire 2.22.0 veya üzeri sürümlerde başarısız olacaktır. Junit deps'lerini Surefire yapılandırmasından çıkarmanız gerekir. Burada bununla
John Thompson

51

Güncelleme 2

Konu Maven Surefire Eklenti v2.22.0 sabit olmuştur

Yeni sürüm Maven Merkezi Depo'da mevcuttur.

Uzman

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

Güncelleme

Marian'ın belirttiği gibi , JUnit 5 Platform Surefire Provider'ın (1.2.0) en son sürümü Maven Surefire Plugin'in (2.21.0) en son sürümünü desteklemektedir :

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



Misal

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);
    }
}

Çıktı (mvn temiz yükleme)

...
[BİLGİ] --- maven-surefire-plugin: 2.21.0 : test (varsayılan-test) @ test --- [BİLGİ]
[BİLGİ] -------------- -----------------------------------------
[BİLGİ] TESTLER
[BİLGİ] - -------------------------------------------------- ---
[BİLGİ] Test.TestScenario çalıştırılıyor [BİLGİ] Çalıştırılan
testler: 1, Arızalar: 0, Hatalar: 0, Atlanan: 0, Geçen süre: 0.005 sn - testte TestScenario
[BİLGİ]
[BİLGİ] Sonuçlar:
[BİLGİ ]
[BİLGİ] Çalıştırılan testler: 1 , Arızalar: 0, Hatalar: 0, Atlanan: 0
...


Bugüne kadarki en basit yol:

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

1
Bu yalnızca sınıf adına Test nedeniyle çalışır . Sınıfı ExampleScenario olarak yeniden adlandırın - keşfedilmeyecek. (Surefire 2.22.0)
Alexei Vinogradov

@AlexeiVinogradov Evet. Beklenen bir davranış. Daha fazla bilgiyi burada bulabilirsiniz: stackoverflow.com/a/6178629/3523579
Mikhail Kholodkov

bevare, junit motor sürümü ile ilkbahar önyükleme üst sürümü. Sadece bağımlılığı belirtin junit-jupiter-engine: 5.1, yeni sürümlerin çalıştığı yerde çalışmaz. Spring boot hala JUnit4 <junit.version> 4.13'ü önceden yapılandırmıştır.
Wooff

20

Gönderen JUnit 5 belgelerinde :

Sürümden başlayarak 2.22.0, Maven Surefire, JUnit Platformunda testlerin yürütülmesi için yerel destek sağlar.

Ek olarak maven-surefire-pluginbelgelerde okuyabilirsiniz :

JUnit 5 Platformunu Kullanma

JUnit Platform'u kullanmaya başlamak TestEngineiçin projenize en az tek bir uygulama eklemeniz gerekir . Örneğin, Jüpiter ile testler yazmak istiyorsanız, test yapısını junit-jupiter-engine POM'daki bağımlılıklara ekleyin.

Yani JUnit 5 testlerini çalıştırmak için bu yeterlidir:

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

GitHub alanıma göz atabileceğiniz / klonlayabileceğiniz çalışan bir örnek maven projesi ekledim.
URL: https://github.com/ebundy/junit5-minimal-maven-project


9

JUnit5 ve Maven ile bu sorunla karşılaştım, ancak bağımlılık olarak yalnızca junit-jupiter-engine eklense bile bazı projelerde testlerin çalışacağını, bazılarında çalışmayacağını fark ettim . Ve buradaki yorumlarda aynı kalıbı görüyorum: Yukarıdaki @Alex yorumunda, surefire / junit / platform'un önceki sürümlerinde bile herhangi bir sorunu olmadığını görebilirsiniz.

Bir süre kafamı çizilmeye sonra testler aday olmayacağını bu projeler testleri nerede olduğunu fark etmiştir yöntem adları DIT değil kelime "test" içerirler. Bu, http://maven.apache.org/surefire/maven-surefire-plugin/examples/inclusion-exclusion.html tarafından zorunlu kılınmamış olsa da

Başka bir deyişle: sadece

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

bu

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

çalıştırılmayacak, oysa

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

Çalıştırılacak!

Bu sorun bir Rus bebeği olarak ortaya çıkıyor ...

Her neyse, güncellenmiş cevabı tüm sorunları aynı anda düzelten @Mikhail Kholodkov için +1!


Ayrıca mvn 3.5.0, jdk 1.8.0_101 ile sınıf adımda 'Test' olmadığı ve testin alınmadığı bir sorun yaşadım, bu da bunu bulmama yardımcı oldu!
dann.dev

Evet, gerçekten de maven.apache.org/surefire/maven-surefire-plugin/examples/… ile uyumlu olmalısınız. Ama ben farklı bir şeyden bahsediyordum.
Fabien M

Evet, iki sorunum olduğu ortaya çıktı, ilki temel maven surefire test kurallarını hatırlamamaktı. İkincisi, tutulma için junit 5 başlatıcısını alması için bir Maven> güncelleme projesi yapmıyordu.
dann.dev

Sınıfın ve yöntemlerin genel olması gerektiğini eklemek isterim.
Jónás Balázs

6

Ağustos 2019'da burada sorduğum aynı sorunla karşılaştım: Maven, çalıştırılacak JUnit testlerini sessizce bulamıyor . Bu cevaplar beni doğru yöne götürdü, ancak sorunu daha da kısaca çözebileceğinizi öğrendim. Çözümümü JUnit5 örnek Maven projesinden kopyaladım .

JUnit 5.5.1 ve maven-surefire-plugin2.22.2'den itibaren, junit-platform-surefire-providerbağımlılık eklemenize gerek yoktur . Bu bir bağımlılığın ve bir eklentinin sizin 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>

Bu doğru ve özlü yaklaşımdır. OpenJDK 11 ve JUnit 5.6.2 ile çalışır.
gümüş

5

Tamamlamak için, surefire 2.22.0 + junit 5.2.0 + platform 1.2.0 da çalışır. Referansınız için çalışan bir pom eklenmiştir:

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

Sorunum yoktu olmasıydı junit-vintage-enginebir bağımlılık olarak ve benim testlerin tüm JUnit 4. için yazılmıştır
Mark

belirtilen junit, platform ve surefire versiyonlarının kombinasyonu benim için çalıştı. Teşekkürler !
CoderTR

4

Benim durumumda bunun nedeni sınıf yolundaki TestNG ( SUREFIRE-1527 ) idi. Groovy 2.5.5 POM,groovy-testng modülle .

Manuel olarak belirtilen test çerçevesi sağlayıcısı ( https://maven.apache.org/surefire/maven-surefire-plugin/examples/providers.html adresinde açıklandığı gibi ) sorunu çözdü:

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

Sen yerleştirilmeli <dependency>içinde <dependencies>kod örneğinde.
user1053510


1

Surefire'ın sıfır testi tanımasına neden olan benzer bir sorun yaşadım.

Sorunumun aşağıdakilerle ilgili olduğu ortaya çıktı ( JUnit 5.1.0 / maven belgelerinden):

Surefire 2.20'deki bellek sızıntısı ve Java 9'da çalışan sorunlar nedeniyle, junit-platform-surefire-provider şu anda yalnızca Surefire 2.19.1 ile çalışıyor.

Surefire'ın (2.21.0) ve junit-platform-surefire-provider'ın (1.1.0) en son sürümlerini kullanmaya çalışıyordum ve işe yaramadı (ne Java 8 ne de 9'da)

Surefire 2.19.1'e geri dönmek sorunumu çözdü.

Bu soruna göre , junit-platform-surefire-provider'in 1.2.0 sürümüne bir düzeltme eklenecektir (şu anda yalnızca SNAPSHOT olarak mevcuttur).


1
SNAPSHOT'ları denedim ve hepsi çalışıyor (Surefire 2.21.0 ile). Umarım piyasaya sürüldüğünde hala çalışıyor demektir.
user7610

1

Onu çalıştırabildiğimi fark ettiğim bir şey:

  • Test sınıfımı adlandırmak ClinicCalendarShouldmaven tarafından alınmıyor
  • Test sınıfıma isim vermek ClinicCalendarTestMaven tarafından alınır

Bu nedenle, surefire eklentisinde bir tür yapılandırma veya parametre eksik olmadıkça, varsayılan olarak test sınıflarınızı XXXTest olarak adlandırmanız gerekir.


0

Güncelleniyor maven-surefire-plugin:2.20Junit5 testlerini sorunsuz çalıştıracak şekilde .

Ama M6Junit5'teki sürümü kullanıyorum.


O kadar basit değil (en azından şu anda). Bkz. JUnit 5 Kullanıcı Kılavuzu
FrVaBe

@FrVaBe tuhaf, m6 sürümüyle benim için iyi çalışıyor.
LazerBanana 01

2
Surefire-2.20.1 + junit-5.0.2'den yoruldum ve işe yaramadı. Ayrıca surefire-2.20.1 + junit-5.1.0-M6'yı da denedim ve işe yaramadı
Eric

0

Benim durumumda, surefire eklentisi jüpiter motoru / api için doğru sürümü alamadı. Ve bu Maven 3.6.1 ve surefireplugin Sürüm 2.22.2 çalıştırılsa bile böyleydi!

Şimdi surefire eklenti yapılandırmam şöyle görünüyor:

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

Dahası, bu Sürümleri zorunlu kılmak zorunda kaldım:

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

Görünüşe göre 5.5.2, benim durumumda 1.5.2 yerine yanlış platform sürüm 1.3.2 ile bağlantılıydı.

Tüm JUnit5 Testleri şimdi alınır. Surefire eklentisinin 2.22.0'ı ile bile bu benim için geçerli değildi!

Umarım yardımcı olur...


0

İkisi de aynı sorunla karşılaşıyordum junit5ve maven-surefiretestler başarısız oluyordu. Ancak junit4iyi çalışıyordu. Aşağıdaki kombinasyon benim için çalıştı, versiyonlama eklemiyorum. junit-bomBağımlılık yönetimi için kullanın . kullanmaspring-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>

Eclipse'in en son sürümüne yükselttiğinizden emin olun

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.