Bagaimana cara menjalankan tes Integrasi Maven saya


170

Saya memiliki proyek multi-modul maven2 dan di masing-masing modul anak saya, saya memiliki tes JUnit yang diberi nama Test.javadan Integration.javauntuk tes unit dan tes integrasi masing-masing. Ketika saya mengeksekusi:

mvn test

semua tes JUnit *Test.javadalam modul anak dijalankan. Ketika saya mengeksekusi

mvn test -Dtest=**/*Integration

tidak ada Integration.javates yang dieksekusi dalam modul anak.

Ini tampak seperti perintah yang sama persis bagi saya tetapi yang dengan -Dtest = / * Integrasi ** tidak berfungsi menampilkan 0 tes yang dijalankan pada tingkat induk, yang tidak ada tes


4
Jawaban Kief haruslah yang diterima, karena itu adalah standar saat ini untuk mendefinisikan tes integrasi di Maven.
heenenee

Jawaban:


110

Anda dapat mengatur Maven's Surefire untuk menjalankan tes unit dan tes integrasi secara terpisah. Pada fase uji unit standar, Anda menjalankan segala sesuatu yang tidak sesuai dengan pola uji integrasi. Anda kemudian membuat fase pengujian kedua yang hanya menjalankan tes integrasi.

Berikut ini sebuah contoh:

    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-surefire-plugin</artifactId>
      <configuration>
        <excludes>
          <exclude>**/*IntegrationTest.java</exclude>
        </excludes>
      </configuration>
      <executions>
        <execution>
          <id>integration-test</id>
          <goals>
            <goal>test</goal>
          </goals>
          <phase>integration-test</phase>
          <configuration>
            <excludes>
              <exclude>none</exclude>
            </excludes>
            <includes>
              <include>**/*IntegrationTest.java</include>
            </includes>
          </configuration>
        </execution>
      </executions>
    </plugin>

1
Saya mengkonfigurasi ini seperti yang Anda katakan dan hanya * Tes bukan file * Integration.java akan berjalan ketika mengeksekusi: mvn install saya harus menjalankan * Test.java saya sebagai default, tetapi untuk build nightlty saya, saya perlu menjalankan keduanya * Test .java dan * Integration.java. Saya harus menjalankan mvn instal kemudian cd ke setiap direktori anak-anak dan menjalankan mvn -Dtest = ** / * Tes integrasi
Peter Delaney

66
Anda harus menggunakan plugin Gagal-aman untuk pengujian integrasi, bukan plugin yakin-api. Build tidak akan gagal hingga setelah fase pasca integrasi selesai; memungkinkan Anda untuk merobohkan sumber daya pengujian (server web, misalnya) sebelum pembangunan gagal. Karenanya, aman-gagal.
John Gordon

bagi saya, sebagai bagian dari fase pra-integrasi, server dermaga dimulai. Baris log terakhir adalah: [INFO] Memulai Jetty Server. Setelah itu, tidak ada yang terjadi. Itu macet. maven surefire failafe plugin tidak menjalankan tes atau jetty server berhenti. Adakah yang tahu apa yang salah? Saya menggunakan konfigurasi yang sama seperti yang ditentukan oleh Anda.
Tarun Kumar

6
Jawaban ini sangat kedaluwarsa dan harus diperbarui atau dihapus.
Zac Thompson


250

The Maven membangun siklus hidup sekarang termasuk "integrasi-test" fase untuk menjalankan tes integrasi, yang dijalankan secara terpisah dari unit test dijalankan selama fase "test". Ini berjalan setelah "paket", jadi jika Anda menjalankan "mvn memverifikasi", "mvn instal", atau "mvn deploy", tes integrasi akan dijalankan di sepanjang jalan.

Secara default, integrasi-tes berjalan tes kelas bernama **/IT*.java, **/*IT.java, dan **/*ITCase.java, tetapi ini dapat dikonfigurasi.

Untuk perincian tentang cara menghubungkan semua ini, lihat plugin Failsafe , halaman penggunaan Failsafe (tidak ditautkan dengan benar dari halaman sebelumnya saat saya menulis ini), dan lihat juga posting blog Sonatype ini .


1
@ WillV Benar. Kuburan Codehaus. Dan plugin maven-failafe-plugin ada di Apache sekarang. Maaf. :)
Jin Kwon

38
Secara default mvn integration-testjuga menjalankan tes unit (menggunakan via ayal) tetapi mvn failsafe:integration-testhanya menjalankan tes integrasi yang aman.
Shadow Man

22
Luar biasa, dokumentasi plugin Failsafe, halaman penggunaan, dan FAQ tidak menyebutkan bahwa ia menjalankan kelas uji bernama * / IT .java, ** / * IT.java, dan ** / * ITCase.java ...
Henno Vermeulen

1
Jika berjalan setelah packagefase, itu berarti saya harus meletakkan semua kode sumber TI IT saya di bawah src/main/javabukan src/test/java?
Bruce Sun

5
@ HennoVermeulen Saya bingung tentang apa yang harus disebut tes. Ini dijelaskan dalam Inklusi dan Pengecualian Tes . Sangat menyenangkan bahwa default dapat diganti, tetapi akan lebih baik jika mereka menyebutkan default sebelumnya.
Joshua Taylor

63

Saya telah melakukan PERSIS apa yang ingin Anda lakukan dan itu bekerja dengan baik. Tes unit "* Tes" selalu berjalan, dan "* IntegrationTests" hanya berjalan ketika Anda melakukan mvn memverifikasi atau menginstal mvn. Ini potongan dari POM saya. serg10 hampir benar .... tapi tidak cukup.

  <plugin>
    <!-- Separates the unit tests from the integration tests. -->
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
       <!-- Skip the default running of this plug-in (or everything is run twice...see below) -->
       <skip>true</skip>
       <!-- Show 100% of the lines from the stack trace (doesn't work) -->
       <trimStackTrace>false</trimStackTrace>
    </configuration>
    <executions>
       <execution>
          <id>unit-tests</id>
          <phase>test</phase>
          <goals>
             <goal>test</goal>
          </goals>
          <configuration>
                <!-- Never skip running the tests when the test phase is invoked -->
                <skip>false</skip>
             <includes>
                   <!-- Include unit tests within integration-test phase. -->
                <include>**/*Tests.java</include>
             </includes>
             <excludes>
               <!-- Exclude integration tests within (unit) test phase. -->
                <exclude>**/*IntegrationTests.java</exclude>
            </excludes>
          </configuration>
       </execution>
       <execution>
          <id>integration-tests</id>
          <phase>integration-test</phase>
          <goals>
             <goal>test</goal>
          </goals>
          <configuration>
            <!-- Never skip running the tests when the integration-test phase is invoked -->
             <skip>false</skip>
             <includes>
               <!-- Include integration tests within integration-test phase. -->
               <include>**/*IntegrationTests.java</include>
             </includes>
          </configuration>
       </execution>
    </executions>
  </plugin>

Semoga berhasil!


Persis apa yang saya coba lakukan, tetapi tes integrasi saya tetap berjalan selama fase uji mvn, karena saya TIDAK MELIPUTI DEFAULT. Saya pikir mengonfigurasi eksekusi tes akan menimpanya. Seperti yang Anda jelaskan, itu hanya menambah eksekusi baru (jadi semuanya akan berjalan dua kali). Jadi bagi saya lompatan itu hilang. +1 Karena konfigurasi ini menjawab pertanyaan hingga 100%
Nils Schmidt

2
Maka jangan ragu untuk mencentang kotak untuk jawaban ini menjadi jawabannya!
HDave

bagi saya, sebagai bagian dari fase pra-integrasi, server dermaga dimulai. Baris log terakhir adalah: [INFO] Memulai Jetty Server. Setelah itu, tidak ada yang terjadi. Itu macet. maven surefire failafe plugin tidak menjalankan tes atau jetty server berhenti. Adakah yang tahu apa yang salah? Saya menggunakan konfigurasi yang sama seperti yang ditentukan oleh Anda.
Tarun Kumar

@Tarun - ajukan pertanyaan baru tentang masalah Anda
HDave

2
Ini harus menjadi jawaban yang diterima. Tujuan pakar yang terkait adalah: clean compile integration-test -Dmaven.test.failure.ignore=false
Neill Lima

31

Anda dapat membaginya dengan sangat mudah menggunakan kategori JUnit dan Maven.
Ini ditunjukkan sangat, sangat singkat di bawah ini dengan pemisahan unit dan tes integrasi.

Tentukan Antarmuka Penanda

Langkah pertama dalam mengelompokkan tes menggunakan kategori adalah membuat antarmuka penanda.
Antarmuka ini akan digunakan untuk menandai semua tes yang ingin Anda jalankan sebagai tes integrasi.

public interface IntegrationTest {}

Tandai kelas tes Anda

Tambahkan anotasi kategori ke bagian atas kelas tes Anda. Dibutuhkan nama antarmuka baru Anda.

import org.junit.experimental.categories.Category;

@Category(IntegrationTest.class)
public class ExampleIntegrationTest{

    @Test
    public void longRunningServiceTest() throws Exception {
    }

}

Konfigurasikan Tes Unit Maven

Keindahan dari solusi ini adalah tidak ada yang benar-benar berubah untuk sisi pengujian unit.
Kami cukup menambahkan beberapa konfigurasi ke plugin maven surefire untuk membuatnya mengabaikan semua tes integrasi.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.11</version>
    <configuration>
        <includes>
            <include>**/*.class</include>
        </includes>
        <excludedGroups>
            com.test.annotation.type.IntegrationTest
        </excludedGroups>
    </configuration>
</plugin>

Saat Anda melakukan mvn clean test, hanya pengujian unit yang tidak ditandai yang akan berjalan.

Konfigurasikan Tes Integrasi Maven

Sekali lagi konfigurasi untuk ini sangat sederhana.
Kami menggunakan plugin failafe standar dan mengonfigurasinya untuk hanya menjalankan tes integrasi.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>2.19.1</version>
    <configuration>
        <includes>
            <include>**/*.class</include>
        </includes>
        <groups>
            com.test.annotation.type.IntegrationTest
        </groups>
    </configuration>
</plugin>

Konfigurasi menggunakan tujuan eksekusi standar untuk menjalankan plugin failafe selama fase uji integrasi build.

Anda sekarang dapat melakukan mvn clean install.
Kali ini serta tes unit berjalan, tes integrasi dijalankan selama fase uji integrasi.


Saya pikir JUnit tidak lagi memiliki rahasia untuk saya. Tempat yang bagus!
gertas

4
Ini hanya berfungsi jika antarmuka penanda sudah ada di suatu tempat tersedia untuk Maven. Ini tidak berfungsi jika antarmuka marker Anda ada di modul lain dari pembangunan multi-modul yang sama.
EngineerBetter_DJ

@EngineerBetter_DJ apa yang Anda maksud dengan itu? Anda tidak dapat melakukan itu jika Anda memiliki konfigurasi multi proyek berbasis maven?
matthieusb

16

Anda harus mencoba menggunakan plugin maven failafe . Anda dapat memerintahkannya untuk menyertakan serangkaian tes tertentu.


1
+1 Ini yang saya gunakan. Berfungsi dengan baik, dan memungkinkan Anda melakukan pengaturan sebelum / sesudah, seperti memulai dan mematikan wadah servlet lokal.
mdma

maven-failsafe-plugintelah pergi ke Plugin Graveyard
Jin Kwon

9
Halaman kuburan hanya mengatakan failsafeplugin telah dipindahkan ke maven-failsafe-plugin. Sepertinya maven-failsafe-pluginmasih aktif (dokumen terakhir didorong Maret 2014).
James Kingsbery

13

Secara default, Maven hanya menjalankan tes yang memiliki Tes di suatu tempat di nama kelas.

Ganti nama menjadi IntegrationTest dan itu mungkin akan berfungsi.

Atau Anda dapat mengubah konfigurasi Maven untuk menyertakan file itu, tetapi mungkin lebih mudah dan lebih baik hanya untuk memberi nama tes Anda SomethingTest.

Dari Inklusi dan Pengecualian Tes :

Secara default, Plugin Surefire akan secara otomatis memasukkan semua kelas tes dengan pola wildcard berikut:

  • \*\*/Test\*.java - termasuk semua subdirektori dan semua nama file java yang dimulai dengan "Uji".
  • \*\*/\*Test.java - termasuk semua subdirektori dan semua nama file java yang diakhiri dengan "Test".
  • \*\*/\*TestCase.java - termasuk semua subdirektori dan semua nama file java yang diakhiri dengan "TestCase".

Jika kelas tes tidak sesuai dengan konvensi penamaan, maka konfigurasikan Plugin Surefire dan tentukan tes yang ingin Anda sertakan.


Hai dan terima kasih saya memiliki dua jenis tes POJO Junit tes normal yang disebut SomethingTest.java yang dipecat. Saya juga memiliki tes integrasi yang disebut SomethingIntegration.java yang tidak dipecat. SomethingTest.java dipecat melalui mvn test atau mvn install. Tes kedua tidak dipecat. mvn test -Dtest = ** / * Integrasi
Peter Delaney

.. dan oleh "Maven hanya menjalankan tes yang memiliki Tes di suatu tempat di nama kelas" maksudmu "plugin Maven pasti menjalankan tes yang memiliki Tes di suatu tempat di nama kelas".
Joshua Davis

1
Ini bukan "suatu tempat di classname" itu "nama kelas berakhir dengan Test", misalnya MyTest bekerja tetapi MyTests tidak
Julian

10

Cara lain untuk menjalankan tes integrasi dengan Maven adalah dengan memanfaatkan fitur profil:

...
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <includes>
                    <include>**/*Test.java</include>
                </includes>
                <excludes>
                    <exclude>**/*IntegrationTest.java</exclude>
                </excludes>
            </configuration>
        </plugin>
    </plugins>
</build>

<profiles>
    <profile>
        <id>integration-tests</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <configuration>
                        <includes>
                            <include>**/*IntegrationTest.java</include>
                        </includes>
                        <excludes>
                            <exclude>**/*StagingIntegrationTest.java</exclude>
                        </excludes>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>
...

Menjalankan 'mvn clean install' akan menjalankan build default. Seperti ditentukan tes integrasi di atas akan diabaikan. Menjalankan 'mvn clean install -P-integrasi-tes' akan mencakup tes integrasi (Saya juga mengabaikan tes integrasi pementasan saya). Selain itu, saya memiliki server CI yang menjalankan tes integrasi saya setiap malam dan untuk itu saya mengeluarkan perintah 'mvn test -P Integration-tests' .


1
Mengapa Anda tidak menggunakan fase uji integrasi? Profil kemudian dapat digunakan untuk hal-hal seperti pengujian integrasi terhadap berbagai server aplikasi, dll. Seperti yang dilakukan Arquillian. Saya bukan ahli Maven, tapi saya pikir para ahli mungkin mengatakan ini bukan sangat 'Maven-y'.
Joshua Davis

1
@ Joshua, saya rasa saya melakukannya dengan cara ini karena tes integrasi saya membutuhkan setidaknya 5 menit untuk menjalankan dan saya mengeluarkan 'mvn clean install' berkali-kali sehari karena saya perlu memperbarui artefak saya di repo pakar lokal saya. Menurut apa yang dikatakan orang di atas, menjalankan 'install' akan menyebabkan fase uji integrasi berjalan menyebabkan saya kehilangan waktu pengembang yang berharga.
Jorge

Hmm ... tidak yakin tentang 'instal' menjalankan tes integrasi. Bagaimanapun saya masih menggunakan fase bukan profil. Profil lebih baik digunakan untuk hal-hal seperti mendukung server aplikasi yang berbeda, dll.
Joshua Davis

1
Saya akan pergi ke depan dan bermain-main dengan itu. Terima kasih atas sarannya!
Jorge

@ jorge Saya kira tujuan yang benar untuk digunakan di sini akan diverifikasi, kan?
Kilokahn

1

Anda dapat mengikuti dokumentasi pakar untuk menjalankan tes unit dengan build dan menjalankan tes integrasi secara terpisah.

<project>
    <properties>
        <skipTests>true</skipTests>
    </properties>
    [...]
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-failsafe-plugin</artifactId>
                <version>2.20.1</version>
                <configuration>
                    <skipITs>${skipTests}</skipITs>
                </configuration>
            </plugin>
        </plugins>
    </build>
    [...]
</project>

Ini akan memungkinkan Anda untuk menjalankan dengan semua tes integrasi dinonaktifkan secara default. Untuk menjalankannya, Anda menggunakan perintah ini:

mvn install -DskipTests=false

0

Anda harus menggunakan plugin maven surefire untuk menjalankan tes unit dan plugin maven failafe untuk menjalankan tes integrasi.

Silakan ikuti di bawah ini jika Anda ingin beralih pelaksanaan tes ini menggunakan bendera.

Konfigurasi Maven

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <skipTests>${skipUnitTests}</skipTests>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <configuration>
                <includes>
                    <include>**/*IT.java</include>
                </includes>
                <skipTests>${skipIntegrationTests}</skipTests>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>integration-test</goal>
                        <goal>verify</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

        <properties>
            <skipTests>false</skipTests>
            <skipUnitTests>${skipTests}</skipUnitTests>
            <skipIntegrationTests>${skipTests}</skipIntegrationTests>
        </properties>

Jadi, tes akan dilewati atau dialihkan sesuai dengan aturan bendera di bawah ini:

Tes dapat dilewati dengan tanda di bawah ini:

  • -DskipTests melompati tes unit dan integrasi
  • -DskipUnitTests melewatkan tes unit tetapi menjalankan tes integrasi
  • -DskipIntegrationTests melompati tes integrasi tetapi menjalankan tes unit

Menjalankan Tes

Jalankan di bawah ini untuk hanya menjalankan Tes Unit

mvn clean test

Anda dapat menjalankan perintah di bawah ini untuk menjalankan tes (baik unit maupun integrasi)

mvn clean verify

Untuk menjalankan hanya Tes Integrasi, ikuti

mvn failsafe:integration-test

Atau lewati pengujian unit

mvn clean install -DskipUnitTests

Juga, untuk melewati tes integrasi selama mvn install, ikuti

mvn clean install -DskipIntegrationTests

Anda dapat melewati semua tes menggunakan

mvn clean install -DskipTests
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.