如何在Maven Deploy阶段自动运行全量测试而非仅快速测试?
自动切换Maven Surefire测试组配置的方案
你可以通过以下几种方式实现根据Maven命令自动切换测试组,不用手动输入参数:
方法1:利用Maven Profiles简化命令
定义两个Profile,默认激活仅跑快速测试的配置,执行deploy时激活全量测试的Profile:
<profiles> <!-- 默认激活,只跑fast测试 --> <profile> <id>fast-tests</id> <activation> <activeByDefault>true</activeByDefault> </activation> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <groups>fast</groups> </configuration> </plugin> </plugins> </build> </profile> <!-- 执行deploy时激活,跑所有测试 --> <profile> <id>full-tests</id> <activation> <activeByDefault>false</activeByDefault> </activation> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <groups>fast|slow</groups> </configuration> </plugin> </plugins> </build> </profile> </profiles>
之后执行deploy时只需加个短参数:mvn clean deploy -Pfull-tests,比手动输-Dgroups="fast|slow"简单很多,不容易出错。
方法2:完全自动切换(无需额外参数)
通过maven-antrun-plugin检查命令行内容,自动设置测试组属性,实现完全自动切换:
<build> <plugins> <!-- 初始化阶段判断命令行是否包含deploy,设置测试组属性 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> <executions> <execution> <phase>initialize</phase> <goals> <goal>run</goal> </goals> <configuration> <target> <!-- 默认跑fast测试 --> <property name="test.groups" value="fast"/> <!-- 如果命令行里有deploy,切换到全量测试 --> <condition property="test.groups" value="fast|slow"> <contains string="${maven.command.line}" substring="deploy"/> </condition> </target> </configuration> </execution> </executions> </plugin> <!-- 引用动态设置的测试组属性 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <groups>${test.groups}</groups> </configuration> </plugin> </plugins> </build>
这样执行mvn clean install时自动跑fast测试,执行mvn clean deploy时自动跑fast+slow测试,完全不用额外加参数,彻底避免手动输入错误。
方法3:通过阶段绑定避免重复测试
如果担心执行deploy时重复跑测试,可以结合Profile和阶段绑定,跳过默认test阶段,在deploy前只跑一次全量测试:
<profiles> <profile> <id>deploy-full-tests</id> <activation> <activeByDefault>false</activeByDefault> <!-- 当deploy不跳过时激活 --> <property> <name>maven.deploy.skip</name> <value>!true</value> </property> </activation> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <!-- 跳过默认的test阶段 --> <configuration> <skip>true</skip> </configuration> <!-- 在deploy前执行全量测试 --> <executions> <execution> <id>full-tests</id> <phase>pre-deploy</phase> <goals> <goal>test</goal> </goals> <configuration> <skip>false</skip> <groups>fast|slow</groups> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile> </profiles> <build> <plugins> <!-- 默认配置,跑fast测试 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <groups>fast</groups> </configuration> </plugin> </plugins> </build>
这个方案适合测试耗时较长的场景,避免重复执行浪费时间。
内容的提问来源于stack exchange,提问作者morgwai
相关产品推荐
相关产品推荐

