Cegah pengujian unit tetapi biarkan tes integrasi di Maven

157

Saya memiliki build Maven di mana saya menggunakan plugin SureFire untuk menjalankan beberapa tes unit, dan plugin FailSafe untuk menjalankan beberapa tes integrasi. Saya ingin cara menjalankan tes plugin FailSafe saja.

Ini bukan solusi yang baik bagi saya untuk menambahkan profil yang berbeda atau apa pun di pom, karena ini adalah multimodule build dan saya tidak ingin harus mengedit pom setiap modul.

Ada skip.testsdan maven.test.skipdan skipTestsyang menghentikan semua tes, dan skipITs, yang hanya menghentikan plugin failafe.

Jadi, apakah ada flag command-line untuk Maven skipITs, tetapi alih-alih dengan fungsi "onlyITs"?

Matthew Gilliard
sumber
Apakah Anda sudah mencoba maven.test.skipatau tidak skipTests?
Thomas
1
@ Khmarbaise dalam teori, ya. Tetapi di sebagian besar proyek saya telah bekerja, "unit test" di mana sebenarnya tes integrasi dengan db dalam memori (jika Anda beruntung)
Sean Patrick Floyd
9
@khmarbaise Banyak unit test. Mereka membutuhkan beberapa menit untuk berlari dan kita tidak membutuhkannya untuk berlari dalam keadaan ini. Secara khusus, kami menjalankan tes unit sebelum membangun artefak (tentu saja), tetapi kami ingin menjalankan IT di berbagai lingkungan. Tidak ada titik menjalankan kembali tes unit pada saat ini.
Matthew Gilliard
2
Hai @khmarbaise, dalam pengaturan saya skipTestshanya melewatkan tes yang pasti, bukan tes yang gagal! Mungkin itu fitur baru?
danidemi
2
FYI: skipTests sekarang tidak digunakan lagi di Failsafe Plugin 3.0.0-M3 ( SUREFIRE-1611 )
Guillaume Husta

Jawaban:

171

Saya menemukan cara paling sederhana untuk melewati hanya tes ayal adalah untuk mengkonfigurasi ayal ( tetapi tidak gagal ) sebagai berikut:

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

Ini memungkinkan Anda untuk menjalankan mvn verify -Dskip.surefire.testsdan hanya aman, bukan gagal, tes akan dilewati; itu juga akan menjalankan semua fase yang diperlukan lainnya termasuk pra-integrasi dan pasca-integrasi, dan juga akan menjalankan verifytujuan yang diperlukan untuk benar-benar gagal membangun pakar Anda jika tes integrasi Anda gagal.

Perhatikan bahwa ini mendefinisikan kembali properti yang digunakan untuk menentukan bahwa tes harus dilewati, jadi jika Anda menyediakan kanonik -DskipTests=true, pasti akan mengabaikannya tetapi gagal aman akan menghormatinya, yang mungkin tidak terduga, terutama jika Anda memiliki build / pengguna yang sudah menentukan flag tersebut. Solusi sederhana tampaknya menjadi default skip.surefire.testske nilai skipTestsdi <properties>bagian pom Anda:

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

Jika perlu, Anda dapat memberikan parameter analagous yang disebut skip.failsafe.testsdengan failafe, namun saya belum menganggapnya perlu - karena tes unit biasanya berjalan pada fase sebelumnya, dan jika saya ingin menjalankan tes unit tetapi bukan tes integrasi, saya akan menjalankan yang testfase bukan verifyfase. Pengalaman Anda mungkin beragam!

skip.(surefire|failsafe).testsProperti ini mungkin harus diintegrasikan ke dalam kode pasti / failafe sendiri, tapi saya tidak yakin berapa banyak itu akan melanggar etos "mereka persis plugin yang sama kecuali untuk 1 perbedaan kecil" etos.

bacar
sumber
4
Dengan menggunakan solusi ini saya sudah dapat mengatur kerangka kerja saya sehingga -DskipUnitTests melompati plugin yang pasti, -DskipIntegrationTests melompati plugin failafe, dan DskipTests melompati keduanya. Persis apa yang dibutuhkan!
Alex Jansen
2
IDE saya mengeluhkan "tidak dapat menyelesaikan simbol 'skipTests'" solusinya adalah menambahkan garis yang <skipTests>false</skipTests>masih berfungsi dengan kombinasi -DskipTests atau -Dskip.surefire.tests sebagai baris perintah yang sepertinya menimpa properti stackoverflow.com/questions/13708738 / ... Anda mungkin ingin menambahkan itu ke solusi Anda
globalworming
<skipTests>${skip.surefire.tests}</skipTests>tidak bekerja dengan maven-surefire-pluginversi 3.0.0-M3. Semua tes pasti masih berjalan. Adakah yang menemukan ini? Solusi Sean Patrick Floyd di bawah ini tetap berhasil.
John Meyer
120

Solusinya adalah menelepon:

mvn clean test-compile failsafe:integration-test

Memang, ini jelek, tetapi mungkin bisa menyelesaikan masalah Anda.


Atau (peretasan lain):

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

Referensi:

Sean Patrick Floyd
sumber
1
Saran kedua bekerja untuk saya. pra-integrasi-tes berhasil dipanggil
Lawrence Tierney
7
Apakah ini ide yang bagus? Tidakkah ini akan membuat bangunan Anda berhasil meskipun pengujian integrasi Anda gagal? Itulah esensi dari failafe, jika Anda juga tidak menjalankan tujuan 'verifikasi' . Kutipan: "Plugin Failsafe tidak akan gagal membangun selama fase uji integrasi". Anda perlu menjalankan tujuan verifikasi untuk benar-benar memberi tahu Anda apakah tes integrasi berhasil atau tidak!
bacar
2
@ Bacac benar, tetapi gunakan saja verifybukan integration-testdalam solusi ke-2.
Matthew Gilliard
1
Anda seharusnya melihat jawaban @bacar untuk solusi yang jauh lebih baik.
FBB
12
Jika Anda menambahkan failsafe:verifyke akhir hack pertama ( mvn clean test-compile failsafe:integration-test failsafe:verify) itu akan gagal membangun jika salah satu tes integrasi gagal.
Shadow Man
73

Saya menggunakan kode dari Blog Antonio Goncalves , yang berfungsi sempurna.

Anda dapat menggunakan properti berikut:

-DskipUTs=true untuk melewatkan tes jitu.

-DskipITs=true untuk melewatkan tes gagal aman.

-DskipTests=true untuk melewatkan semua tes.

The pom.xmladalah sebagai berikut:

<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
sumber
2
terima kasih, pendekatan yang bagus! itu juga berguna untuk mengesampingkan eksekusi default surefire (tes-default) lihat: stackoverflow.com/questions/11935181/…
pls
1
inilah alasan mengapa kadang-kadang Anda harus menggulir ke bawah dan mencari solusi yang bagus dengan semua informasi yang diperlukan. Terima kasih telah berbagi
Atul Chaudhary
Benar-benar solusi yang bagus. Namun, konfigurasi yang gagal aman berlebihan seperti skipITsstandarnya.
timomeinen
SkipITs adalah opsi khusus dalam konfigurasi ini. Anda benar dalam implementasi default, tapi itu bukan pertanyaan OP.
Martijn Burger
Salam, Anda adalah seorang guru pakar! Ini harus di superpom maven.
Adam
22

Semoga ini membantu!

Cobalah untuk menjalankan tes hanya dengan FailSafe (plugin untuk uji integrasi - ini akan memungkinkan Anda untuk hanya menjalankan tes integrasi dengan penamaan semacam ini, secara default: * / IT .java, ** / IT.java, * /*ITCase.java ;, tetapi Anda dapat dengan mudah mengubahnya dari file pom)

mvn failsafe:integration-test

Dan ketika Anda ingin menggunakan hanya SureFire (plugin untuk pengujian unit)

mvn surefire:test

atau satu tes sekaligus dengan:

mvn -Dtest=MyUnitlTest
Kati Holasz
sumber
9

Saya memang suka ini sehingga setiap fase biasanya dijalankan:

 mvn -Dtest=foo -DfailIfNoTests=false verify
Jérôme Herry
sumber
1
Ini adalah solusi termudah (dan jujur ​​yang paling cemerlang)!
Titulum
tidak perlu menambahkan apa pun di pom karena OP bertanya dan menjalankan semua fase seperti yang ditunjukkan. jawaban yang bagus
jnichols959
1

Untuk memperluas komentar dari @danidemi dan @GuillaumeHusta:

FYI: skipTests sekarang tidak digunakan lagi di Failsafe Plugin 3.0.0-M3 ( SUREFIRE-1611 )

Jadi untuk melewati tes unit, tetapi bukan tes integrasi, Anda dapat melakukan ini jika Anda menggunakan versi terbaru dari plugin Failsafe:

mvn verify -DskipTests

(tolong beri komentar yang disebutkan di atas jika ini membantu Anda)

Meustrus
sumber
-3

Coba jalankan tes integrasi atau unit Anda di profil yang terpisah. Kemudian Anda bisa mengaktifkan / menonaktifkan profil.

Steven
sumber
Mungkin menambahkan pom induk di mana Anda menentukan profil yang hanya menjalankan IT? semua sub modul proyek dapat mewarisi bentuk pom itu, sehingga Anda tidak perlu mengubah setiap pom atau menjalankan modul dengan sakelar khusus (karena Anda dapat mengaktifkan profil jika tidak ada properti).
yoosiba