Pasti tidak mengambil tes Junit 5


113

Saya menulis metode pengujian sederhana dengan JUnit 5:

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

Tapi ketika saya lari mvn test, saya mendapat:

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

Entah bagaimana, pasti tidak mengenali kelas tes itu. Saya pom.xmlterlihat seperti:

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

Ada ide bagaimana membuat ini bekerja?


1
Sekarang Anda harus menggunakan implementasi khusus dari plugin-pasti. Lihat contoh tim junit di sini
jah

1
Pertanyaan ini didasarkan pada versi yang sudah kadaluwarsa tetapi jawaban ini didasarkan pada versi yang sekarang (per Desember 2016).
Nicolai

@Nicolai Terima kasih telah memperbarui jawabannya. Bagaimanapun saya akan menghargai suntingan Anda pada pertanyaan, jika Anda punya waktu.
Ali Dehghani

1
Kesalahan ini tidak terjadi seperti itu lagi. Kasus yang paling mungkin terjadi karena kurangnya eksekusi pengujian tercakup dalam pertanyaan ini .
Nicolai

Pastikan file pengujian berada di tempat yang benar. Secara default, pengujian harus merupakan saudara dari main di bawah folder src.
Joe Bowbeer

Jawaban:


115

The maven-surefire-plugin, pada hari ini, tidak memiliki dukungan penuh dari JUnit 5 . Ada masalah terbuka tentang menambahkan dukungan ini di SUREFIRE-1206 .

Karena itu, Anda perlu menggunakan penyedia khusus . Satu telah dikembangkan oleh tim JUnit; dari panduan pengguna , Anda perlu menambahkan junit-platform-surefire-providerpenyedia dan TestEngineimplementasi untuk API baru:

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

Selain itu, pastikan untuk mendeklarasikan junit-jupiter-apidependensi dengan cakupan test:

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

25
Perlu dicatat bahwa saat ini pasti 2.20.1 tidak berfungsi dengan provider junit 5 sehingga 2.19.1 yang digunakan dalam sampel masih berlaku meskipun tahun telah berlalu.
splatch

1
pasti 2.21.0 tidak berfungsi juga, harus kembalikan ke 2.19.1
valodzka

@valodzka Bagi saya ini berfungsi dengan 2.21.0 dan versi yang lebih baru dari plugin dan junit5. Lihat junit.org/junit5/docs/current/user-guide/…
Thirler

Terverifikasi: maven-surefire-plugin v2.21.0berfungsi dengan baik dengan junit-jupiter-engine v5.2.0dan junit-platform-surefire-provider v1.2.0
povis

2
Konfigurasi ini akan gagal dengan Surefire 2.22.0 atau lebih tinggi. Anda perlu mengecualikan deps Junit dari konfigurasi Surefire. Saya menulis posting singkat tentang itu di sini - springframework.guru/…
John Thompson

51

Perbarui 2

Masalah telah diperbaiki di Maven Surefire Plugin v2.22.0

Versi baru tersedia di Maven Central Repository.

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'

Memperbarui

Seperti yang ditunjukkan Marian , versi terbaru JUnit 5 Platform Surefire Provider (1.2.0) mendukung versi terbaru Plugin Maven Surefire (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>



Contoh

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

Output (pemasangan bersih mvn)

...
[INFO] --- maven-surefire-plugin: 2.21.0 : test (default-test) @ test --- [INFO]
[INFO] -------------- -----------------------------------------
[INFO] UJI
[INFO] - -------------------------------------------------- ---
[INFO] Menjalankan test.TestScenario
[INFO] Pengujian dijalankan: 1, Kegagalan: 0, Kesalahan: 0, Dilewati: 0, Waktu berlalu: 0,005 s - dalam test.TestScenario
[INFO]
[INFO] Hasil:
[INFO ]
[INFO] Tes yang dijalankan: 1 , Kegagalan: 0, Kesalahan: 0, Dilewati: 0
...


Cara termudah hingga hari ini:

    <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
Ini hanya berfungsi karena Test atas nama kelas. Ubah nama kelas menjadi ExampleScenario - itu tidak akan ditemukan. (Pasti 2.22.0)
Alexei Vinogradov

@AlexeiVinograf Ya. Itu perilaku yang diharapkan. Informasi lebih lanjut tersedia di sini: stackoverflow.com/a/6178629/3523579
Mikhail Kholodkov

bevare, versi mesin junit vs. versi induk boot musim semi. Cukup tentukan ketergantungan junit-jupiter-engine: 5.1 tidak berfungsi di mana versi yang lebih baru berfungsi. Spring boot masih memiliki konfigurasi JUnit4 <junit.version> 4.13.
Wooff

20

Dari dokumentasi JUnit 5 :

Dimulai dengan versi 2.22.0, Maven Surefire menyediakan dukungan asli untuk menjalankan pengujian pada Platform JUnit.

Selain itu, Anda dapat membaca di maven-surefire-plugindokumentasi :

Menggunakan Platform JUnit 5

Untuk memulai JUnit Platform, Anda perlu menambahkan setidaknya satu TestEngineimplementasi ke proyek Anda. Misalnya, jika Anda ingin menulis pengujian dengan Jupiter, tambahkan artefak pengujian junit-jupiter-engine ke dependensi di POM

Jadi itu sudah cukup untuk menjalankan tes 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>

Di ruang GitHub saya, saya menambahkan proyek sampel maven yang berfungsi yang dapat Anda telusuri / klon.
URL: https://github.com/ebundy/junit5-minimal-maven-project


9

Saya mengalami masalah ini dengan JUnit5 dan Maven tetapi juga memperhatikan bahwa, meskipun hanya mesin junit-jupiter yang ditambahkan sebagai ketergantungan, pengujian akan berjalan pada beberapa proyek, bukan pada yang lain . Dan saya melihat pola yang sama di komentar di sini: Dalam komentar @Alex di atas Anda dapat melihat dia tidak memiliki masalah apa pun, bahkan dengan versi surefire / junit / platform sebelumnya.

Setelah menggaruk-garuk kepala selama beberapa waktu, saya menyadari bahwa proyek-proyek di mana tes tidak akan berjalan adalah proyek yang nama metode tesnya tidak mengandung kata "test". Meskipun ini tidak diamanatkan oleh http://maven.apache.org/surefire/maven-surefire-plugin/examples/inclusion-exclusion.html

Dengan kata lain: hanya dengan

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

ini

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

TIDAK akan dijalankan, sedangkan

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

AKAN dijalankan!

Masalah ini terungkap sebagai boneka Rusia ...

Bagaimanapun, +1 untuk @Mikhail Kholodkov yang jawaban mutakhirnya memperbaiki semua masalah sekaligus!


Saya juga baru saja mengalami masalah dengan mvn 3.5.0, jdk 1.8.0_101 di mana nama kelas saya tidak memiliki 'Tes' dan tes tidak diambil, ini membantu saya menemukannya!
dann.dev

Ya memang Anda harus mematuhi maven.apache.org/surefire/maven-surefire-plugin/examples/… Tapi saya berbicara tentang sesuatu yang berbeda.
Fabien M

Ya ternyata saya punya dua masalah, yang pertama tidak ingat aturan tes jitu maven dasar. Yang kedua adalah tidak melakukan proyek pembaruan Maven> untuk gerhana untuk mengambil peluncur junit 5.
dann.dev

Saya ingin menambahkan bahwa kelas dan metode harus bersifat publik.
Jónás Balázs

6

Saya mengalami masalah yang sama pada Agustus 2019 yang saya tanyakan di sini: Maven diam-diam gagal menemukan pengujian JUnit untuk dijalankan . Jawaban-jawaban ini menuntun saya ke arah yang benar, tetapi saya menemukan bahwa Anda dapat menyelesaikan masalah dengan lebih ringkas. Saya menyalin solusi saya dari proyek sampel Maven JUnit5 .

Mulai JUnit 5.5.1 dan maven-surefire-plugin2.22.2, Anda tidak perlu menambahkan junit-platform-surefire-providerdependensi. Cukup memiliki satu ketergantungan ini dan satu plugin yang ditentukan di Anda 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>

Ini adalah pendekatan yang benar dan ringkas. Bekerja dengan OpenJDK 11 dan JUnit 5.6.2.
perak

5

Hanya untuk melengkapi, pasti 2.22.0 + junit 5.2.0 + platform 1.2.0 juga berfungsi. Terlampir adalah pom yang berfungsi untuk referensi Anda:

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

Masalah saya adalah bahwa saya tidak memiliki junit-vintage-engineketergantungan, dan semua tes saya ditulis untuk JUnit 4.
Markus

kombinasi dari versi junit, platform, dan pasti yang ditentukan bekerja untuk saya. terima kasih!
CoderTR

4

Dalam kasus saya, ini karena TestNG di classpath ( SUREFIRE-1527 ). Groovy 2.5.5 POM telah membawanya dengan groovy-testngmodul.

Penyedia kerangka kerja pengujian yang ditentukan secara manual (seperti yang dijelaskan di https://maven.apache.org/surefire/maven-surefire-plugin/examples/providers.html ) memecahkan masalah:

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

Anda harus membungkusnya <dependency>dalam <dependencies>contoh kode Anda.
pengguna1053510


1

Saya memiliki masalah serupa juga menyebabkan Surefire mengenali tes nol.

Masalah saya ternyata terkait dengan berikut ini (dari dokumentasi JUnit 5.1.0 / maven ):

Karena kebocoran memori di Surefire 2.20 dan masalah yang berjalan di Java 9, penyedia junit-platform-surefire saat ini hanya berfungsi dengan Surefire 2.19.1.

Saya mencoba menggunakan versi terbaru Surefire (2.21.0) dan junit-platform-surefire-provider (1.1.0), dan tidak berhasil (baik di Java 8 atau 9)

Beralih kembali ke Surefire 2.19.1 memecahkan masalah saya.

Menurut masalah ini, perbaikan akan disertakan dalam versi 1.2.0 dari penyedia junit-platform-surefire (saat ini hanya tersedia sebagai SNAPSHOT).


1
Saya sudah mencoba SNAPSHOTs dan semuanya bekerja (dengan Surefire 2.21.0). Semoga ini masih berfungsi pada saat rilis.
pengguna7610

1

Satu hal yang saya perhatikan bahwa saya bisa membuatnya berfungsi:

  • Penamaan kelas tes saya ClinicCalendarShouldtidak diambil oleh maven
  • Penamaan kelas tes saya ClinicCalendarTestAPAKAH diambil oleh maven

Jadi, kecuali saya kehilangan beberapa jenis konfigurasi atau parameter atau apa pun di plugin yang pasti, secara default, Anda perlu memberi nama kelas pengujian Anda XXXTest.


0

Memperbarui untuk maven-surefire-plugin:2.20menjalankan pengujian Junit5 tanpa masalah.

Tapi saya menggunakan M6versi di Junit5.


Tidak sesederhana itu (setidaknya saat ini). Lihat Panduan Pengguna JUnit 5
FrVaBe

@FrVaBe aneh itu bekerja dengan baik pada saya dengan versi m6.
LazerBanana

2
Saya lelah yakin-2.20.1 + junit-5.0.2 dan tidak berhasil. Saya juga mencoba surefire-2.20.1 + junit-5.1.0-M6 dan tidak berhasil
Eric

0

Dalam kasus saya, plugin yang pasti tidak mendapatkan versi yang benar auf jupiter-engine / api. Dan itu bahkan jika menjalankan Maven 3.6.1 dan versi surefireplugin 2.22.2!

Sekarang konfigurasi plugin pasti saya terlihat seperti:

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

Lebih jauh lagi, saya harus memaksa Versi ini:

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

Sepertinya 5.5.2 ditautkan ke platform versi 1.3.2 yang salah, bukan 1.5.2 dalam kasus saya.

Semua Tes JUnit5 diambil sekarang. Bahkan dengan 2.22.0 plugin yang pasti, ini bukan masalahnya bagi saya!

Semoga membantu ...


0

Saya menghadapi masalah yang sama junit5dan maven-surefiretes gagal. Namun junit4berjalan dengan baik. Kombinasi di bawah ini berfungsi untuk saya, saya tidak menambahkan versi. Gunakan junit-bomuntuk manajemen ketergantungan. Menggunakanspring-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>

Pastikan untuk meningkatkan ke versi gerhana terbaru

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.