Maven Entegrasyon testlerimi nasıl çalıştırırım


170

Bir Maven2 çok modüllü projesi var ve benim çocuk modüllerinin her birinde ben adlandırılır JUnit testleri Test.javave Integration.javasırasıyla birim testler ve entegrasyon testleri için. Çalıştırdığımda:

mvn test

*Test.javaalt modüller içindeki tüm JUnit testleri yürütülür. İdam ettiğimde

mvn test -Dtest=**/*Integration

Integration.javatestlerin hiçbiri alt modüller içinde yürütülmez.

Bunlar benim için aynı komut gibi görünüyor ama -Dtest = / * Entegrasyon ** ile çalışan çalışmıyor o test herhangi bir test olmayan üst düzeyde 0 test çalıştığını gösterir


4
Kief'in cevabı, Maven'deki entegrasyon testlerini tanımlamak için mevcut standart olduğu için kabul edilen cevap olmalıdır.
heenenee

Yanıtlar:


110

Maven's Surefire'ı, birim testlerini ve entegrasyon testlerini ayrı ayrı çalıştıracak şekilde ayarlayabilirsiniz. Standart birim test aşamasında, bir entegrasyon testiyle eşleşmeyen her şeyi çalıştırırsınız. Daha sonra ikinci bir test aşaması oluşturursunuz , yalnızca tümleştirme sınamalarını çalıştıran oluşturursunuz.

İşte bir örnek:

    <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
Bunu söylediğin gibi yapılandırdım ve sadece * Test * Integration.java dosyaları yürütülürken çalışmaz: mvn install Varsayılan olarak * Test.java'mı çalıştırmam gerekiyor, ancak nightlty derlemem için her ikisini de çalıştırmalıyım * Test .java ve * Integration.java. Her alt-alt dizine mvn install sonra cd yürütmek ve mvn yürütmek zorunda -Dtest = ** / * Entegrasyon testi
Peter Delaney

66
Güvenli çalışma eklentisini değil, entegrasyon testi için Arıza güvenliği eklentisini kullanmalısınız. Bu kadar yapı başarısız olmayacak sonrası sonrası entegrasyon aşaması tamamlandığında; yapı başarısız olmadan önce test kaynaklarını (örneğin bir web sunucusu) yıkmanıza olanak tanır. Bu nedenle arızaya karşı güvenli.
John Gordon

benim için, entegrasyon öncesi aşamasının bir parçası olarak, iskele sunucusu başlar. Son günlük satırı: [INFO] Jetty Server'ı başlattı. Bundan sonra hiçbir şey olmuyor. Takılıyor. maven surefire failsafe eklentisi testleri yürütmez veya iskele sunucusu durmaz. Neyin yanlış olduğu hakkında bir fikrin var mı? Sizin belirttiğiniz ile aynı yapılandırmayı kullanıyorum.
Tarun Kumar

6
Bu cevap çok eski ve güncellenmeli veya kaldırılmalıdır.
Zac Thompson

Bu konuda herhangi bir yardım? stackoverflow.com/questions/48639730/…
Rohit Barnwal

250

Maven inşa yaşam döngüsü artık "test" aşamasında çalıştırılır birim testler ayrı işletilmektedir entegrasyon testleri, çalıştırmak için "entegrasyon test" fazını içerir. "Paket" ten sonra çalışır, bu nedenle "mvn verify", "mvn install" veya "mvn deploy" komutlarını çalıştırırsanız, entegrasyon testleri yol boyunca çalıştırılır.

Varsayılan olarak, tümleştirme sınaması adlı test sınıflarını çalıştırır **/IT*.java , **/*IT.javave **/*ITCase.javafakat bu yapılandırılabilir.

Bunların nasıl kablolanacağına ilişkin ayrıntılar için, Arızaya karşı koruma eklentisine , Arızaya karşı kullanım sayfasına (bunu yazarken önceki sayfadan doğru şekilde bağlanmamıştır) bakın ve ayrıca bu Sonatype blog yayınına bakın .


1
@WillV Doğru. Codehaus'un mezarlığı. Ve maven-failsafe-eklentisi şu anda Apache'de. Afedersiniz. :)
Jin Kwon

38
Varsayılan olarak mvn integration-testbirim testleri de (surefire kullanarak) mvn failsafe:integration-testçalışır, ancak yalnızca arızaya dayanıklı entegrasyon testlerini çalıştırır.
Gölge Adam

22
İnanılmaz bir şekilde, Failsafe eklentisi belgeleri, kullanım sayfası ve SSS, * / IT .java, ** / * IT.java ve ** / * ITCase.java adlı test sınıflarını çalıştırdığından bahsetmiyor ...
Henno Vermeulen

1
Aşamadan sonra çalışırsa package, bunun yerine tüm BT java kaynak kodumu doğru src/main/javayerine koymalıyım src/test/java?
Bruce Sun

5
@HennoVermeulen Testlere ne isim vereceğim konusunda kafam karıştı. Testlerin Dahil Edilmesi ve Hariç Tutulması bölümünde açıklanmıştır . Varsayılanların geçersiz kılınabilmesi güzel, ancak daha önce varsayılanlardan bahsetmeleri iyi olurdu.
Joshua Taylor

63

Ne yapmak istediğinizi TAMAMEN yaptım ve harika çalışıyor. Birim testleri "* Testler" her zaman çalışır ve "* IntegrationTests" yalnızca bir mvn doğrulaması veya mvn yüklemesi yaptığınızda çalışır. İşte POM'umdan snippet. serg10 neredeyse doğru vardı .... ama tam olarak değil.

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

İyi şanslar!


Tam olarak ne yapmaya çalıştım, ama VARSAYILAN ATLAMA DEĞİL çünkü entegrasyon testleri mvn test aşamasında çalışmaya devam etti. Test yürütmesini yapılandırmanın onu geçersiz kılacağını düşündüm. Açıkladığınız gibi, sadece yeni bir yürütme ekler (böylece her şey iki kez çalışır). Yani benim için atlama parçası eksikti. +1 Bu yapılandırma soruyu% 100'e yanıtladığında
Nils Schmidt

2
O zaman cevap bu yanıt için kutuyu işaretlemek için çekinmeyin!
HDave

benim için, entegrasyon öncesi aşamasının bir parçası olarak, iskele sunucusu başlar. Son günlük satırı: [INFO] Jetty Server'ı başlattı. Bundan sonra hiçbir şey olmuyor. Takılıyor. maven surefire failsafe eklentisi testleri yürütmez veya iskele sunucusu durmaz. Neyin yanlış olduğu hakkında bir fikrin var mı? Sizin belirttiğiniz ile aynı yapılandırmayı kullanıyorum.
Tarun Kumar

@Tarun - Yeni bir soru sorun yeniden
HDave

2
Bu kabul edilen cevap olmalı. İlişkili maven hedefi: clean compile integration-test -Dmaven.test.failure.ignore=false
Neill Lima

31

JUnit kategorileri ve Maven kullanarak bunları kolayca bölebilirsiniz.
Bu, bölme birimi ve entegrasyon testleri ile çok, çok kısaca aşağıda gösterilmiştir.

Bir İşaretleyici Arayüzü Tanımlama

Bir testi kategorileri kullanarak gruplamanın ilk adımı bir işaretleyici arabirimi oluşturmaktır.
Bu arayüz, entegrasyon testi olarak çalıştırmak istediğiniz tüm testleri işaretlemek için kullanılacaktır.

public interface IntegrationTest {}

Test sınıflarınızı işaretleyin

Kategori ek açıklamasını test sınıfınızın üstüne ekleyin. Yeni arayüzünüzün adını alır.

import org.junit.experimental.categories.Category;

@Category(IntegrationTest.class)
public class ExampleIntegrationTest{

    @Test
    public void longRunningServiceTest() throws Exception {
    }

}

Maven Birim Testlerini Yapılandırma

Bu çözümün güzelliği, şeylerin birim test tarafı için gerçekten hiçbir şeyin değişmemesidir.
Herhangi bir entegrasyon testini yok saymasını sağlamak için maven surefire eklentisine bazı yapılandırmalar ekliyoruz.

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

Bunu yaptığınızda mvn clean test, yalnızca işaretlenmemiş birim testleriniz yapılır.

Maven Entegrasyon Testlerini Yapılandırma

Yine bunun konfigürasyonu çok basit.
Standart başarısız güvenlik eklentisini kullanıyoruz ve yalnızca entegrasyon testlerini çalıştıracak şekilde yapılandırıyoruz.

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

Yapılandırma, derlemenin tümleştirme testi aşaması sırasında başarısız güvenlik eklentisini çalıştırmak için standart bir yürütme hedefi kullanır.

Şimdi bir yapabilirsiniz mvn clean install.
Bu kez ve birim testleri çalışıyor, entegrasyon testleri entegrasyon testi aşamasında yapılır.


JUnit'in bana daha fazla sırrı olmadığını düşündüm. İyi nokta!
gertas

4
Bu, yalnızca işaretçi arayüzü Maven'in kullanabileceği bir yerde mevcutsa çalışır. İşaretleyici arabiriminiz aynı çok modüllü yapının başka bir modülünde varsa çalışmaz.
EngineerBetter_DJ

@EngineerBetter_DJ Bununla ne demek istiyorsun? Çoklu proje tabanlı bir maven yapılandırmanız varsa bunu yapamazsınız?
matthieusb

16

Maven failsafe eklentisini kullanmayı denemelisiniz . Belirli bir test seti içermesini söyleyebilirsiniz.


1
+1 Ben bunu kullanıyorum. İyi çalışır ve yerel sunucu uygulaması kapsayıcısını başlatma ve kapatma gibi ön / son kurulum yapmanızı sağlar.
mdma

maven-failsafe-pluginEklenti Mezarlığı'na
Jin Kwon

9
Mezarlık sayfası sadece failsafeeklentinin taşındığını söylüyor maven-failsafe-plugin. Görünüşe göre maven-failsafe-pluginhala aktif (dokümanlar en son Mart 2014'te itildi).
James Kingsbery

13

Varsayılan olarak Maven, yalnızca sınıf adında bir yerde Test olan testleri çalıştırır.

IntegrationTest olarak yeniden adlandırın ve muhtemelen işe yarayacaktır.

Alternatif olarak Maven yapılandırmasını bu dosyayı içerecek şekilde değiştirebilirsiniz, ancak testlerinizi SomethingTest olarak adlandırmanız muhtemelen daha kolay ve daha iyidir.

Gönderen İçermelerin ve Testlerin Hariç :

Varsayılan olarak, Surefire Eklentisi aşağıdaki joker karakter kalıplarına sahip tüm test sınıflarını otomatik olarak içerecektir:

  • \*\*/Test\*.java - "Test" ile başlayan tüm alt dizinlerini ve tüm java dosya adlarını içerir.
  • \*\*/\*Test.java - tüm alt dizinlerini ve "Test" ile biten tüm java dosya adlarını içerir.
  • \*\*/\*TestCase.java - tüm alt dizinlerini ve "TestCase" ile biten tüm java dosya adlarını içerir.

Test sınıfları adlandırma kuralına uymuyorsa, Surefire Eklentisini yapılandırın ve dahil etmek istediğiniz testleri belirtin.


Merhaba ve teşekkürler Ben kovulmak SomethingTest.java denilen normal POJO Junit testleri iki çeşit testleri var. Ayrıca, işten atılmayan SomethingIntegration.java adlı entegrasyon testlerim var. SomethingTest.java, mvn testi veya mvn yüklemesi ile tetiklenir. İkinci testler ateşlenmez. mvn testi -Dtest = ** / * Entegrasyon
Peter Delaney

.. ve "Maven sadece sınıf adında bir yerde Test olan testleri çalıştırır" demek "Maven güzel ateşleme eklentisi sadece sınıf adında bir yerde Test olan testleri çalıştırır".
Joshua Davis

1
"Sınıf adının bir yerinde" değil, "sınıf adı Test ile biter", örneğin MyTest çalışır ancak MyTests çalışmaz
Julian

10

Maven ile entegrasyon testleri yapmanın başka bir yolu da profil özelliğini kullanmaktır:

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

Koşu 'install temizlemek MVN' varsayılan yapı çalışacaktır. Yukarıda belirtildiği gibi entegrasyon testleri göz ardı edilecektir. Koşu 'mvn temiz -P entegrasyon-testleri install' entegrasyon testleri yer alacak (Ben de evreleme entegrasyon testleri görmezden). Ayrıca, entegrasyon testlerimi her gece çalıştıran bir CI sunucum var ve bunun için 'mvn test -P entegrasyon testleri' komutunu veriyorum .


1
Neden entegrasyon testi aşamasını kullanmıyorsunuz? Profiller daha sonra Arquillian'ın yaptığı gibi çeşitli uygulama sunucularına karşı entegrasyon testi gibi şeyler için kullanılabilir. Ben bir Maven uzmanı değilim, ama uzmanların bunun çok 'Maven-y' olmadığını söyleyebilirler.
Joshua Davis

1
@Joshua Sanırım bunu bu şekilde yapıyorum çünkü entegrasyon testlerimin çalışması en az 5 dakika sürüyor ve yerel maven depomdaki eserlerimi güncellemem gerektiğinden günde birçok kez 'mvn clean install' veriyorum. İnsanların yukarıda söylediklerine göre, 'install' komutunun çalıştırılması entegrasyon testi aşamasının çalışmasına ve geliştiricinin değerli zamanını kaybetmeme neden olacak.
Jorge

Hmm ... entegrasyon testini yapan 'install' komutundan emin değilim. Her halükarda hala profil yerine aşamayı kullanırdım. Profiller, farklı uygulama sunucularını destekleme gibi şeyler için daha iyi kullanılır
Joshua Davis

1
Devam edip bununla oynayacağım. Tavsiye için teşekkürler!
Jorge

@jorge Sanırım burada kullanmak için doğru hedef doğru olurdu, değil mi?
Kilokahn

1

Derleme testlerini derleme ile birlikte çalıştırmak ve entegrasyon testlerini ayrı olarak çalıştırmak için maven belgelerini takip edebilirsiniz .

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

Bu, varsayılan olarak devre dışı bırakılmış tüm entegrasyon testleriyle çalışmanıza olanak tanır. Bunları çalıştırmak için şu komutu kullanın:

mvn install -DskipTests=false

0

Birim testlerini çalıştırmak için maven surefire eklentisini ve entegrasyon testlerini çalıştırmak için maven failsafe eklentisini kullanmalısınız.

Bu testlerin yürütülmesini bayraklar kullanarak değiştirmek istiyorsanız lütfen aşağıdakileri takip edin.

Maven Yapılandırması

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

Bu nedenle, testler aşağıdaki bayrak kurallarına göre atlanacak veya değiştirilecektir:

Testler aşağıdaki bayraklarla atlanabilir:

  • -DskipTests hem birim hem de entegrasyon testlerini atlar
  • -DskipUnitTests birim testlerini atlar ancak entegrasyon testlerini yürütür
  • -DskipIntegrationTests entegrasyon testlerini atlıyor ancak birim testlerini yapıyor

Testleri Çalıştırma

Yalnızca Birim Testlerini yürütmek için aşağıda çalıştırın

mvn clean test

Testleri çalıştırmak için aşağıdaki komutu yürütebilirsiniz (hem birim hem de entegrasyon)

mvn clean verify

Yalnızca Entegrasyon Testlerini çalıştırmak için aşağıdakileri uygulayın:

mvn failsafe:integration-test

Veya birim testlerini atla

mvn clean install -DskipUnitTests

Ayrıca, sırasındaki entegrasyon testlerini atlamak mvn installiçin,

mvn clean install -DskipIntegrationTests

Düğmesini kullanarak tüm testleri atlayabilirsiniz.

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