Maven Surefire Двойной счет Тесты
Хотя я не очень хорошо разбирался в жизненных циклах Maven, за последние ~ три дня я прочитал довольно много документации и не нашел ничего, что указывало бы на связь между циклами сборки, целями или моими плагинами и проблемой, с которой я столкнулся.
У меня возникла странная проблема с последним плагином Surefire (3.0.0-M1), когда мои модульные тесты успешно завершаются, но, кажется, выполняются дважды (или, может быть, просто подсчитываются дважды?).
Некоторый контекст - прежде чем я определил какой-либо плагин или версию в этом POM-файле, Surefire запустился самостоятельно с версией по умолчанию, используя:
mvn clean package
Понятия не имею почему. И я никогда не останавливался, чтобы спросить, почему это может быть. Просто так всегда было, поэтому я воспринимал это как должное, и теперь он ведет себя странно. Я, наверное, заслуживаю этого.
Это файл POM для этого прогона (с некоторыми удаленными свойствами и дистрибутивом):
<build>
<sourceDirectory>src/main/java</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.8</version>
<configuration>
<destFile>${basedir}/target/jacoco.exec</destFile>
<dataFile>${basedir}/target/jacoco.exec</dataFile>
</configuration>
<executions>
<execution>
<id>jacoco-initialize</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>jacoco-site</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<createDependencyReducedPom>true</createDependencyReducedPom>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.capitalone.cardcore.App</mainClass>
</transformer>
</transformers>
<artifactSet>
<excludes>
<artifact>junit:*</artifact>
<artifact>org.hamcrest:*</artifact>
<artifact>org.junit.jupiter:*</artifact>
<artifact>org.apiguardian:*</artifact>
<artifact>org.powermock:*</artifact>
<artifact>org.mockito:*</artifact>
<artifact>commons-beanutils:*</artifact>
<artifact>javax.xml.*</artifact>
<artifact>org.apache.hadoop:hadoop-yarn-client:*</artifact>
<artifact>org.apache.hadoop:hadoop-yarn-server-common:*</artifact>
<artifact>org.apache.hadoop:hadoop-yarn-api:*</artifact>
</excludes>
</artifactSet>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
<exclude>**/*.dll</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.1</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.1</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.6</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
<!-- HTTP -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.4</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>
</dependency>
<dependency>
<groupId>com.google.http-client</groupId>
<artifactId>google-http-client</artifactId>
<version>1.23.0</version>
</dependency>
<dependency>
<groupId>com.google.http-client</groupId>
<artifactId>google-http-client-jackson2</artifactId>
<version>1.23.0</version>
</dependency>
<!-- JRECORD -->
<dependency>
<groupId>net.sf.JRecord</groupId>
<artifactId>JRecord</artifactId>
<version>0.81.1</version>
</dependency>
<dependency>
<groupId>net.sf.bruce_a_martin.cb2xml</groupId>
<artifactId>cb2xml</artifactId>
<version>0.95.3</version>
</dependency>
<!-- PGP -->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpg-jdk15on</artifactId>
<version>1.47</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpkix-jdk15on</artifactId>
<version>1.47</version>
</dependency>
<!-- UNIT TESTS -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.0.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-core</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito2</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-easymock</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>2.0.2-beta</version>
<scope>test</scope>
</dependency>
<!-- PARQUET OUTPUT -->
<dependency>
<groupId>org.apache.parquet</groupId>
<artifactId>parquet-avro</artifactId>
<version>${parquet.version}</version>
</dependency>
<dependency>
<groupId>org.apache.parquet</groupId>
<artifactId>parquet-common</artifactId>
<version>${parquet.version}</version>
</dependency>
<dependency>
<groupId>org.apache.parquet</groupId>
<artifactId>parquet-encoding</artifactId>
<version>${parquet.version}</version>
</dependency>
<dependency>
<groupId>org.apache.parquet</groupId>
<artifactId>parquet-column</artifactId>
<version>${parquet.version}</version>
</dependency>
<dependency>
<groupId>org.apache.parquet</groupId>
<artifactId>parquet-hadoop</artifactId>
<version>${parquet.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>${hadoop.version}</version>
</dependency>
</dependencies>
Так что - никаких упоминаний о верном плагине, но он все равно запускал мои тесты. Запускает все тесты и возвращает мне число 144 (это правильно). Так было уже больше года, но я добавил несколько настроек кода, и теперь мне нужно включить его в качестве плагина, потому что мне нужно несколько переменных среды для моих тестов, например, так:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M1</version>
<configuration>
<environmentVariables>
<env>dev</env>
<ENV>DEV</ENV>
</environmentVariables>
</configuration>
</plugin>
Но теперь я получаю это, когда я запускаю свой набор тестов:
Первый вопрос: я схожу с ума? Когда я не включаю плагин, плагин surefire запускается по умолчанию, когда я ничего не делаю (я даже не знаю, как его отключить), а когда я его включаю, он запускается дважды. Один из моих других плагинов работает без трансляции? Это вопрос, которым я не горжусь. Но потом - если я оставлю плагин включенным в свой POM в качестве позиции, но установлю для него версию по умолчанию:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12.4</version>
<configuration>
<environmentVariables>
<env>dev</env>
<ENV>DEV</ENV>
</environmentVariables>
</configuration>
</plugin>
Я получаю ожидаемый результат 144 и мои тесты запускаются, потому что у них есть переменные, которые им нужны. Так может ли быть проблема с последней версией верной версии? Или просто так, как я включаю его в другие пакеты?
Кто-нибудь сталкивался с этим с этим новым Surefire? Или, может быть, это сочетание плагинов?
РЕДАКТИРОВАНИЕ № 1 - 18.11.2008
Включая мой класс TestSuite:
package com.business.cardcore.tests;
import com.business.cardcore.tests.classes.app.*;
import com.business.cardcore.tests.classes.librarytools.*;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
@RunWith(Suite.class)
// run the test classes
@Suite.SuiteClasses({
// App
AppCoreTests.class,
AppFileMapperErrorTests.class,
AppFileProcessorErrorTests.class,
AppSchemaWriterErrorTests.class,
// LibraryTools
ChamberOfSecretsTests.class,
ConfigurationTests.class,
CopybookReaderErrorTests.class,
CopybookReaderTests.class,
DatawiseTests.class,
FileMapperTests.class,
HttpWrapperTests.class,
OutputAsciiTests.class,
OutputEbcdicTests.class,
OutputParquetTests.class,
PGPDecryptTests.class,
SchemaWriterTests.class,
TokenValidationTests.class,
TuringTests.class,
ValidationTests.class
})
public class TestSuite { }
1 ответ
См. Раздел " Ссылки " этого ответа на вопрос Maven: жизненный цикл, фаза, плагин и цель, чтобы узнать, почему плагины запускаются во время сборки Maven, не объявив их.
Дикая догадка относительно ваших двойных тестов: на вашем первом изображении мы видим, что вы запускаете TestSuite
, Возможно, ваши тесты запускаются (или подсчитываются) один раз через этот набор и один раз по отдельности. Что делать, если вы удалите / отключите набор.