Запустите JUnit test * методы * изолированно

Может ли maven-surefire-plugin запускать все методы тестирования JUnit изолированно? То есть, может ли он создавать JVM для каждого метода тестирования, а не для каждого класса тестирования?

Устаревший вариант

<forkMode>pertest</forkMode>

и текущий

<forkCount>1</forkCount>
<reuseForks>false</reuseForks>

кажется, только форк для каждого тестового класса.

PS: Методы тестирования должны быть независимыми, и поэтому никому не нужно запускать каждый из них на новой JVM (и не сказать, что это будет очень дорого). Но мне было интересно, есть ли такой вариант или нет.

1 ответ

Плагин Maven Surefire поддерживает эту конфигурацию:

<parallel>methods</parallel>

Для версий JUnit>= 4.7

Например:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.20</version>
    <configuration>
      <parallel>methods</parallel>
      <threadCount>10</threadCount>
    </configuration>
  </plugin>

Подробнее здесь.

Изменить 1 на основе вашего комментария:

Я хотел бы запускать каждый метод тестирования на новой JVM, а не на другом потоке на той же JVM

Когда используешь reuseForks=true и forkCount > 1, тестовые классы передаются разветвленному процессу один за другим. Итак, с parallel=methods занятия выполняются в forkCount параллельные процессы, каждый из этих процессов использует threadCount число потоков для параллельного выполнения методов одного класса.

Таким образом, похоже, что верный огонь не поддерживает ваш вариант использования.

FWIW, порождая JVM для каждого метода тестирования, может показаться дорогим. Возможно, вы сталкиваетесь с проблемой, когда методы тестирования имеют нежелательные побочные эффекты в JVM (возможно, они устанавливают свойства системы или меняют статические параметры), и эти побочные эффекты нельзя изолировать? Если это так, возможно, пересмотр тестов с целью устранения этих побочных эффектов может быть более желательным, чем реализация индивидуального и потенциально дорогого тестера.

Я нашел этот проект, который утверждает, что это делает, хотя, когда я пытался, он, похоже, не работал (возможно, устарел). Во всяком случае, я полагаю, что это не могло сработать ни для чего, кроме базового@Test-аннотированные методы: нет @RunWith(Parameterized.class) и т.п.

Другие вопросы по тегам