Спільний код тестування в Мейвіні


183

Як ви можете залежати від тестового коду іншого модуля в Maven?

Наприклад, у мене є 2 модулі:

  • База
  • Основна

Мені б хотілося, щоб тест у Майні розширив базовий тестовий клас у Base. Чи можливо це?

Оновлення: знайдено прийнятну відповідь , яка передбачає створення тестової банки.


1
Здається, відповідь, еквівалентна комбінації прийнятої відповіді нижче, що насправді є заміткою на більшу відповідь далі нижче, зараз знаходиться на сайті
Мейвен

Відповіді:


189

Я рекомендую використовувати тип замість класифікатора (див. Також: класифікатор ). Це трохи більше чітко повідомляє Maven, що ви робите (і я виявив, що m2eclipse і q4e обом це подобається краще).

<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 спеціально для типу тестової банки?
Ной Уоткінс

20
Також не забудьте додати тест-jar до конфігурації плагіна maven-jar: maven.apache.org/guides/mini/guide-attached-tests.html
user1338062

11
Я розгубився, коли вперше прочитав цю відповідь ... Це насправді тому, що самостійно це не має сенсу, спершу слід прочитати відповідь нижче: stackoverflow.com/questions/174560/…
TanguyP

179

Дякуємо за пропозицію базового модуля. Однак я б краще не створив новий модуль саме для цієї мети.

Знайшов прийнятну відповідь в документації на Surefire Maven і в блозі . Дивіться також " Як створити банку з тестовими класами ".

Це створює jar файл коду з src/test/javaвикористанням плагіна jar, щоб модулі з тестами могли спільно використовувати код.

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

Для використання доданого тесту JAR, який був створений вище, ви просто вкажете залежність від основного артефакту із визначеним класифікатором тестів:

<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
Зауважте, що можуть бути проблеми із використанням тестів <classifier> / / класифікатора в залежності. Замість цього використовуйте <type> test-jar </type>. Ось один випуск у Maven jira.codehaus.org/browse/MNG-2045 та незв’язаний у IntelliJ youtrack.jetbrains.net/issue/IDEA-54254
Еміль Сит

Мені це було дуже корисно, але я виявив проблему: коли я виконую "install -Dmaven.test.skip = true", потрібен також тест-залежність банку, і процес не вдається
Javi Pedrera

@JaviPedrera працює для мене, навіть якщо я 'mvn clean install -DskipTests = true', і тестовий jar буде створювати. без помилок
Каруссел

1
@Allen Ви переконалися, що під час упаковки вашої банки використовуєте ServiceResultTransformer? В іншому випадку ви можете перетворити файли служб, що перезаписують один одного.
jontejj

1
maven.apache.org/plugins/maven-shade-plugin/examples/… там ви можете прочитати більше про це.
jontejj

12

Ми вирішили це, зробивши проект maven з тестовим кодом як src / main / java та додавши до проектів таку залежність:

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

Так, спасибі! Дивіться мій коментар нижче для альтернативної відповіді, яку я вважаю за краще.
флікен

1
Ми також використовуємо цей підхід, трохи нерозумно ви змушені шукати класифікатори або типи (що майже не є основою в Maven для більшості користувачів), і що вам доведеться будувати JAR з деякими зусиллями, коли вам не потрібно це або - як у цьому випадку - у вас фактично нетестовий код є базовим лише для тестового коду.
virgo47

-3

Так ... просто включіть модуль Base як залежність від Main. Якщо ви успадковуєте лише тестовий код, то можете використовувати тег області, щоб переконатися, що Maven не включає код у свій артефакт при розгортанні. Щось подібне повинно працювати:

<dependency>
    <groupId>BaseGroup</groupId>
    <artifactId>Base</artifactId>
    <version>0.1.0-SNAPSHOT</version>
    <scope>test</scope>
</dependency>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.