Maven 2 有没有办法在maven中只跳过一个测试?

Maven 2 有没有办法在maven中只跳过一个测试?,maven-2,surefire,Maven 2,Surefire,在启动mvn安装时,我只想跳过一个测试 有什么方法可以做到这一点吗?在JUnit4中,当我想这样做时,我会添加一个@Ignore注释。这对您来说是可行的,除非您只希望有时忽略测试,或者只在构建从maven运行时忽略测试。如果是这样,我会问“为什么?” 测试应该是一致的,应该是可移植的,并且应该始终通过。如果一个特定的测试是有问题的,我会考虑重新编写它,完全删除它,或者把它移到一个不同的测试套件或项目。 如果使用这个命令:,我认为这应该起作用。 mvn archetype:create -Dgro

在启动
mvn安装时,我只想跳过一个测试


有什么方法可以做到这一点吗?

在JUnit4中,当我想这样做时,我会添加一个
@Ignore
注释。这对您来说是可行的,除非您只希望有时忽略测试,或者只在构建从maven运行时忽略测试。如果是这样,我会问“为什么?”


测试应该是一致的,应该是可移植的,并且应该始终通过。如果一个特定的测试是有问题的,我会考虑重新编写它,完全删除它,或者把它移到一个不同的测试套件或项目。

如果使用这个命令:

,我认为这应该起作用。
mvn archetype:create -DgroupId=test -DartifactId=test
(对于测试,将pom.xml和测试类更改为以下内容,并使用mvn安装)

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>test</groupId>
<artifactId>test</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>test</name>
<url>http://maven.apache.org</url>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.5</source>
                <target>1.5</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <excludes>
                    <exclude>
                        test/AppTest.java
              </exclude>
                </excludes>
            </configuration>
        </plugin>
    </plugins>
</build>
<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.5</version>
        <scope>test</scope>
    </dependency>
</dependencies>
使用
@Category
注释查看

public class AccountTest {

    @Test
    @Category(IntegrationTests.class)
    public void thisTestWillTakeSomeTime() {
        ...
    }

    @Test
    @Category(IntegrationTests.class)
    public void thisTestWillTakeEvenLonger() {
        ...
    }

    @Test
    public void thisOneIsRealFast() {
        ...
    }
}
然后使用测试套件运行:

@RunWith(Categories.class)
@IncludeCategory(SlowTests.class)
@SuiteClasses( { AccountTest.class, ClientTest.class })
public class LongRunningTestSuite {}
您还可以包括(
)/excludedGroups(
excludedGroups
)使用maven的那些测试,例如:

mvn -DexcludedGroups=com.mycompany.tests.IntegrationTests test

通常需要排除集成测试,但需要包括单元测试。 为了实现这一点,我建议使用后缀IntegrationTest(例如AbcIntegrationTest.java)命名所有集成测试

然后在maven构建中放入以下内容:

  <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <excludes>
                    <exclude>**/*IntegrationTest.java</exclude>
                </excludes>
            </configuration>
        </plugin>

org.apache.maven.plugins


PS要排除单个测试,只需在排除列表中显式地命名它。简单。

您可以通过在
-Dtest
选项前面加一个
来指定排除模式(感叹号)。例如:

在中找到并验证其是否正常工作。例如,我可以通过以下方法跳过片状詹金斯试验:

mvn -Dtest=\!CronTabTest* package

如果要使用CLI排除单个测试,应使用
-Dtest
-Dit.test
标志

小心重置默认值。当您使用
符号所有默认值都将被删除,您应该将它们放回原处。对于由
surefire
执行的正常测试,您应该添加
*测试,测试*,*测试,*测试用例
,而对于由
故障保护执行的集成测试,您应该添加
IT*,*IT,*ITCase

您可以在此处找到更多信息(正常测试)

这里是(集成测试)

-Dit.test='!ITsometestIT,IT*,*IT,*ITCase'

完整的
mvn
命令可以是:

mvn-e-B-Dtest='!unitTestABC,*测试,测试*,*测试,*测试用例“-Dit.Test=”!ITintegrationestabcit,IT*,*IT,*ITCase'-DfailIfNoTests=false clean安装

记住使用
而不是
。当使用双引号时,其中的任何
都将由
bash评估


还请记住,
mvn test
时不会运行集成测试。使用
mvn verify
时,只会运行集成测试,而不会运行单元测试

用例是我的团队中有人正在修复一个测试,我希望启动所有其他测试,但在它再次工作之前不会启动此测试。因此,您是对的,我应该禁用它这是暂时的。有点不同意所有测试都应该是可移植的,等等。单元测试,是的,但有一个有效的理由来编写集成测试,以确保您可以在开发时连接数据源,而不是等到部署时。这些测试不应该在构建时运行,而只应该在开发时测试配置。我反对我有一个测试在我的环境中失败了,它与我的工作无关,我不想把@Ignore放到代码中,因为我还有其他的更改。所以我想在maven build“mvn clean安装”期间跳过它“我不想花时间分析或修复它,因为我清楚地知道这不是我的领域,我可以更好地利用我的时间做其他事情。”。所以这个问题的一个好答案很有意义。所以说教@忽视并不总是理想的。考虑别人的测试,是的,它是坏的(如果运行得太频繁,但一开始就失败了),但你没有时间去修复它,也没有时间说服别人把它拿出来或者自己修复,而且你不想意外地忽略它,因为它实际上测试了一些有价值的时间……1给另一个实际回答问题的人。当它没有回答问题时,这是如何被接受的答案?如果你使用的是故障保护插件:
mvn clean install-Dit.test=\!TestToSkip.*
该功能是在2.19中实现的,请参阅。是否有方法将包含和排除结合起来?例如,我可能想运行Cron*测试,CronFlakyTest除外。我尝试了
mvn-Dtest=“\!CronFlakyTest,Cron*Test”安装
,但它仍然运行flakytest警告:虽然有用,但这可能会破坏排除规则,例如导致在单元测试期间运行cucumber集成测试。您也可以使用以下语法按名称跳过多个测试:
mvn Test-Dtest=\!FirstTestClass,\!SecondTestClass
我得到
没有执行任何测试!(设置-DfailIfNoTests=false忽略此错误。
尽管测试日志包含以下内容:`Tests run:1,Failures:0,Errors:0,Skipped:0,Time passed:0,Time passed:0.071s-Test1…Tests run:1,Failures:0,Errors:0,Skipped:0,Time passed:0.071s-Test2…`不确定如何解释它…是否可以在上指定类别maven命令行/不接触代码?
mvn -Dtest=\!FlakyTest* install
mvn -Dtest=\!CronTabTest* package