Birim testlerini engelleyin ancak Maven'de entegrasyon testlerine izin verin


157

Bazı birim testleri çalıştırmak için SureFire eklentisini ve bazı entegrasyon testlerini çalıştırmak için FailSafe eklentisini kullandığım bir Maven yaptım. Sadece FailSafe eklentisinin testlerini yapmanın bir yolunu istiyorum.

Pom'a farklı profiller veya başka bir şey eklemek benim için iyi bir çözüm değil, çünkü çok modüllü bir yapı ve her modülün pom'unu düzenlemek istemiyorum.

Orada skip.testsve maven.test.skipve skipTestshangi durdurmak tüm testler ve skipITssadece yedekli eklenti durur ki,.

Yani, Maven için bir komut satırı bayrağı var skipITs, bunun yerine "onlyITs" işlevselliği var mı?


Denediniz mi maven.test.skipyoksa skipTests?
Thomas

1
Teoride @khmarbaise, evet. Ama çalıştığım çoğu projede, aslında bellek içi bir db ile entegrasyon testlerinin yapıldığı “birim testleri” (şanslıysanız)
Sean Patrick Floyd

9
@khmarbaise Çok sayıda birim testi. Çalışmaları birkaç dakika alır ve bu durumda koşmaları için onlara ihtiyacımız yoktur. Özellikle, yapıyı oluşturmadan önce birim testleri yapıyoruz (elbette), ancak BT'leri birden çok ortamda çalıştırmak istiyoruz. Bu noktada ünite testlerini yeniden çalıştırmak için hiçbir nokta yoktur.
Matthew Gilliard

2
Merhaba @khmarbaise, benim kurulumda skipTestssadece emin testlerini atlar, başarısızlık testi değil! Belki de yeni bir özellik?
danidemi

2
FYI: skipTests artık Failsafe Plugin 3.0.0- M3'te ( SUREFIRE-1611 ) kullanımdan kaldırıldı
Guillaume Husta

Yanıtlar:


171

Sadece surefire testlerini atlamanın en basit yolunun surefire'ı ( ancak başarısız değil ) yapılandırmak olduğunu şu şekilde buldum :

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

Bu, mvn verify -Dskip.surefire.testsgüvenli çalışmanızı değil, sadece emin olmanızı sağlar , testler atlanır; entegrasyon öncesi ve entegrasyon dahil olmak üzere gerekli tüm diğer aşamaları da çalıştıracak ve entegrasyon testleriniz başarısız olursa verifyasıl derlemenizde gerçekten başarısız olması için gereken hedefi de çalıştıracaktır .

Bunun, testlerin atlanması gerektiğini belirtmek için kullanılan özelliği yeniden tanımladığını unutmayın; bu nedenle, kanonik veri sağlarsanız -DskipTests=true, emin ateş bunu görmezden gelecektir, ancak başarısızlık buna saygı gösterecektir; Basit bir çözüm varsayılan olarak görünüyor skip.surefire.testsdeğerine skipTestssizin de <properties>pom bölümünde:

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

Gerekirse, skip.failsafe.testsfailsafe için adlandırılan benzer bir parametre sağlayabilir , ancak gerekli bulamadım - ünite testleri genellikle daha erken bir aşamada çalışır ve ünite testlerini çalıştırmak istiyorsam, entegrasyon testlerini yapmak istemiyorsam, testyerine faz verifyfazı. Deneyimleriniz değişebilir!

Bu skip.(surefire|failsafe).testsözellikler muhtemelen surefire / failsafe kodunun kendisine entegre edilmelidir, ancak "1 küçük fark dışında tam olarak aynı eklentidir" ethosunu ne kadar ihlal edeceğinden emin değilim.


4
Bu çözümü kullanarak çerçevemi ayarlayabildim, böylece -DskipUnitTests emin ateş eklentisi üzerinden atlıyor, -DskipIntegrationTests başarısız güvenli eklentiyi atlıyor ve DskipTests her ikisini de atlıyor. Tam olarak ne gerekiyordu!
Alex Jansen

2
benim IDE "sembol 'skipTests çözülemez" hakkında şikayet ediyor çözüm <skipTests>false</skipTests>hala komut satırı argümanlarının üzerine yazdığı gibi -DskipTests veya -Dskip.surefire.tests herhangi bir kombinasyonu ile çalışan bir satır eklemek oldu stackoverflow.com/questions/13708738 /… Bunu çözümünüze eklemek isteyebilirsiniz
globalworming

<skipTests>${skip.surefire.tests}</skipTests>maven-surefire-pluginsürümü ile çalışmıyor 3.0.0-M3. Tüm emin ateş testleri hala devam ediyor. Bunu başka kimse buldu mu? Ancak Sean Patrick Floyd'un aşağıdaki çözümü çalışıyor.
John Meyer

120

Geçici bir çözüm:

mvn clean test-compile failsafe:integration-test

Kuşkusuz, bu çirkin, ama sorununuzu çözebilir.


Veya (başka bir hack):

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

Referans:


1
İkinci öneri benim için çalıştı. entegrasyon öncesi testi başarıyla çağrıldı
Lawrence Tierney

7
Bu iyi bir fikir mi? Entegrasyon testleriniz başarısız olsa bile yapınızın başarılı olmasına neden olmaz mı? Yani, hata korumalı bütün özü var sen yoksa da 'doğrulamak' hedefi çalıştırın . Alıntı: "Hataya Dayanıklı Eklenti, entegrasyon testi aşamasında derlemede başarısız olmaz". Entegrasyon testlerinin başarılı olup olmadığını size bildirmek için doğrulama hedefini çalıştırmanız gerekir!
bacar

2
@bacar doğrudur, ancak 2. çözüm verifyyerine kullanın integration-test.
Matthew Gilliard

1
Aslında çok daha iyi bir çözüm için @bacar cevabını görmelisiniz.
FBB

12
failsafe:verifyİlk hack ( mvn clean test-compile failsafe:integration-test failsafe:verify) sonuna eklerseniz , tümleştirme testlerinden biri başarısız olursa derleme başarısız olur.
Gölge Adam

73

Kodunu kullanıyorum Mükemmel çalışan Antonio Goncalves Blog'un .

Aşağıdaki özellikleri kullanabilirsiniz:

-DskipUTs=true emin testlerini atlamak için.

-DskipITs=true güvenli testleri atlamak için.

-DskipTests=true tüm testleri atlamak için.

Aşağıdaki pom.xmlgibidir:

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

2
teşekkürler, harika bir yaklaşım! ayrıca emin ateşin varsayılan yürütülmesini geçersiz kılmak da yararlıdır (varsayılan test) bkz: stackoverflow.com/questions/11935181/…
pls

1
bu nedenle bazen aşağı kaydırıp gerekli tüm bilgileri içeren iyi bir çalışma çözümü bulmanız gerekir.
Paylaştığınız

Gerçekten güzel bir çözüm. Ancak, arıza korumalı yapılandırma skipITsvarsayılan olarak yedeklidir .
timomeinen

SkipITs bu yapılandırmada özel bir seçenektir. Varsayılan uygulamada haklısın, ama bu OPs sorusu değildi.
Martijn Burger

Kudos, sen bir maven gurususun! Bu maven süperpomasında olmalıdır.
Adam

22

Bu yardımcı olur umarım!

Testi yalnızca FailSafe (entegrasyon testi eklentisi) ile çalıştırmayı deneyin - varsayılan olarak sadece bu tür adlandırma ile entegrasyon testlerini çalıştırmanıza izin verir: * / IT .java, ** / IT.java, * /*ITCase.java ;, ama bunu pom dosyasından kolayca değiştirebilirsiniz)

mvn failsafe:integration-test

Ve sadece SureFire (birim testi için eklenti) kullanmak istediğinizde

mvn surefire:test

veya aşağıdakilerle tek seferde bir test:

mvn -Dtest=MyUnitlTest

9

Her aşama normal olarak yürütülür böylece bunu yapmak:

 mvn -Dtest=foo -DfailIfNoTests=false verify

1
Bu en kolay (ve dürüstçe en parlak) çözümdür!
Titulum

OP'nin istediği gibi pom'a herhangi bir şey eklemeyi gerektirmez ve belirtildiği gibi tüm fazları çalıştırır. mükemmel cevap.
jnichols959

1

@Danidemi ve @GuillaumeHusta'nın yorumlarına genişlemek için:

FYI: skipTests artık Arıza Eklentisi 3.0.0- M3'te ( SUREFIRE-1611 ) kullanımdan kaldırıldı

Birim testlerini atlamak, ancak entegrasyon testlerini atlamak için, Failsafe eklentisinin en son sürümünü kullanıyorsanız bunu yapabilirsiniz:

mvn verify -DskipTests

(bu size yardımcı olursa, lütfen söz konusu yorumlara bir oy verin)


-3

Entegrasyonunuzu veya birim testlerinizi ayrı bir profilde çalıştırmayı deneyin. Ardından profili etkinleştirebilir / devre dışı bırakabilirsiniz.


Belki de yalnızca BT çalıştıran profili tanımladığınız üst pom'ı ekleyebilirsiniz? tüm proje alt modülleri bu pom'u devralabilir, bu nedenle her pom'ı değiştirmenize veya özel anahtarlarla modülleri çalıştırmanıza gerek kalmaz (çünkü mülk yokluğunda profili etkinleştirebilirsiniz).
yoosiba
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.