Maven'de Test kodunu paylaşma


183

Maven'deki başka bir modülün test koduna nasıl güvenebilirsiniz?

Örnek, 2 modülüm var:

  • baz
  • Ana

Main'de baz test sınıfını genişletmek için Main'de bir test senaryosu istiyorum. Mümkün mü?

Güncelleme: Test kavanozu oluşturmayı içeren kabul edilebilir bir cevap bulundu .


1
Aşağıdaki kabul edilen cevabın kombinasyonuna eşdeğer bir cevap gibi görünüyor, ki bu aslında aşağıdaki daha büyük cevaba bir not, şimdi Maven sitesinde: Test sınıflarını içeren bir kavanoz nasıl oluşturulur
David Tonhofer

Yanıtlar:


189

Sınıflandırıcı yerine tür kullanmanızı öneririm (ayrıca bkz: sınıflandırıcı ). Maven'e ne yaptığınızı biraz daha açık bir şekilde anlatıyor (ve m2eclipse ve q4e'nin her ikisini de daha iyi sevdiğini gördüm).

<dependency>
  <groupId>com.myco.app</groupId>
  <artifactId>foo</artifactId>
  <version>1.0-SNAPSHOT</version>
  <type>test-jar</type>
  <scope>test</scope>
</dependency>

5
Com.myco.app için özel olarak test-jar tipi için ayrı bir bağımlılık girişi olmalı mı?
Noah Watkins

20
Ayrıca maven-jar-eklenti yapılandırmasına test kavanozu eklemeyi unutmayın: maven.apache.org/guides/mini/guide-attached-tests.html
user1338062

11
Bu cevabı ilk okurken kafam karışmıştı ... Bunun nedeni aslında kendi başına bir anlam ifade etmemesi, önce aşağıdaki cevabı okumalısın: stackoverflow.com/questions/174560/…
TanguyP

179

Temel modül önerisi için teşekkürler. Ancak, sadece bu amaçla yeni bir modül oluşturmak istemem.

Surefire Maven belgelerinde ve bir blogda kabul edilebilir bir cevap buldu . Ayrıca bkz . " Test sınıflarını içeren bir kavanoz nasıl oluşturulur ".

Bu src/test/java, jar eklentisini kullanarak jar jar dosyasını oluşturur , böylece testli modüller kodu paylaşabilir.

<project>
  <build>
    <plugins>
     <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-jar-plugin</artifactId>
       <version>2.4</version>
       <executions>
         <execution>
           <goals>
             <goal>test-jar</goal>
           </goals>
         </execution>
       </executions>
     </plugin>
    </plugins>
  </build>
</project>

Yukarıda oluşturulan ekteki test JAR'ı kullanmak için, ana teste belirli bir test sınıflandırıcısı ile bir bağımlılık belirtmeniz yeterlidir:

<project>
  ...
  <dependencies>
    <dependency>
      <groupId>com.myco.app</groupId>
      <artifactId>foo</artifactId>
      <version>1.0-SNAPSHOT</version>
      <type>test-jar</type>
      <scope>test</scope>
    </dependency>
  </dependencies>
  ...
</project> 

14
Bağımlılıkta <classifier> testleri </ sınıflandırıcısının kullanımıyla ilgili sorunlar olabileceğini unutmayın. Bunun yerine <type> test-jar </type> kullanın. Maven jira.codehaus.org/browse/MNG-2045'te bir sorun ve IntelliJ'de alakasız bir konu youtrack.jetbrains.net/issue/IDEA-54254
Emil Sit

Bu benim için çok yararlı oldu, ama bir sorun buldum: "install -Dmaven.test.skip = true" komutunu çalıştırdığımda, bağımlılık testi-jar gereklidir ve işlem başarısız olur
Javi Pedrera

@JaviPedrera 'mvn clean install -DskipTests = true' yapsam ve test kavanozunu oluştursa bile benim için çalışıyor. hata yok
Karussell

1
@ Kavanozunuzu kavanozunuzu paketlerken ServiceResultTransformer'ı kullandığınızdan emin misiniz? Aksi takdirde, birbirinin üzerine yazan servis dosyaları ile sonuçlanabilir.
jontejj

1
maven.apache.org/plugins/maven-shade-plugin/examples/… orada daha fazla bilgi edinebilirsiniz.
jontejj

12

Bunu src / main / java gibi test kodlu bir maven projesi yaparak ve projelere aşağıdaki bağımlılığı ekleyerek çözdük:

    <dependency>
        <groupId>foo</groupId>
        <artifactId>test-base</artifactId>
        <version>1</version>
        <scope>test</scope>
    </dependency>

Evet, işe yarar, teşekkürler! Tercih ettiğim alternatif cevap için aşağıdaki yorumuma bakın.
flicken

1
Bu yaklaşımı da kullanıyoruz, sınıflandırıcılar veya türler (çoğu kullanıcı için Maven'de neredeyse temel değildir) için zorlanmak zorundasınız ve gerçekten ihtiyacınız olmadığında JAR oluşturmalısınız veya - bu durumda olduğu gibi - sadece test kodu için temel olarak de-facto test dışı kodunuz vardır.
virgo47

-3

Evet ... Ana modülü sadece Main'e bağımlı olarak ekleyin. Yalnızca test kodunu devralıyorsanız, Maven'in dağıtıldığında eserinizdeki kodu içermediğinden emin olmak için kapsam etiketini kullanabilirsiniz. Böyle bir şey işe yaramalı:

<dependency>
    <groupId>BaseGroup</groupId>
    <artifactId>Base</artifactId>
    <version>0.1.0-SNAPSHOT</version>
    <scope>test</scope>
</dependency>
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.