【问题标题】:Force run of @Ignore'd JUnit test using Maven command line使用 Maven 命令行强制运行 @Ignore'd JUnit 测试
【发布时间】:2023-09-11 12:36:01
【问题描述】:

我有一个带有 @Ignore 属性的 JUnit 测试,例如 -

public class HealthCareGov
{
    @Test
    @Ignore
    public void performancetest()
    {
        // stuff
    }
}

在大多数 IDE(例如 IntelliJ)中,即使有 @Ignore 属性,我也可以通过选择方法名称来强制运行此测试。我猜 Eclipse 也允许这样做?

但是,当我尝试通过执行以下命令在 Maven 中执行相同的行为时 -

mvn -Dtest=HealthCareGov#performancetest test

Maven 似乎跳过了测试。这是输出 -

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running HealthCareGov
Tests run: 1, Failures: 0, Errors: 0, Skipped: 1, Time elapsed: 0.032 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 1

我可以使用什么 Maven 命令行来强制执行此测试以重现我的 IDE 产生的行为?修改 Java 源代码不是一种选择。

【问题讨论】:

    标签: maven junit


    【解决方案1】:

    这可以添加到测试中。

    @IfProfileValue(name="test-profile", value="IntegrationTest")
    public class PendingChangesITCase extends AbstractControllerIntegrationTest {
        ...
    }
    

    要选择要执行的测试,只需将值添加到配置文件以执行集成测试。

    <properties>
        <test-profile>IntegrationTest</test-profile>
    </properties>
    

    另外,您可以使用命令行来设置 test-profile 变量:

    mvn -Dtest-profile=IntegrationTest
    

    【讨论】:

    • 为了完整性.. 这需要包含 spring-test jar 和以下注释 @RunWith(SpringJUnit4ClassRunner.class) @IfProfileValue(name="test-profile", value="IntegrationTest") @ ContextConfiguration(locations = "")
    • 有没有不涉及拉入Spring的解决方案?
    【解决方案2】:

    我没有覆盖@Ignore 注释,而是执行了以下操作:

    • 将您的测试命名为您希望仅从标准 maven 测试运行器命名法(surefirefailsafe)之外的命令行运行。这将确保您的测试不会被常规的 Maven 生命周期测试执行所接受。
    • 像往常一样编写测试,在测试方法上为您的框架添加注释。
    • 当您希望运行测试时,只需手动将其作为参数提供给运行程序即可。

      -Dtest=Foo # for surefire

      -Dit.test=Foo # for failsafe

    这将强制您在想要运行测试时通过命令行参数手动指定测试,否则忽略测试。

    【讨论】:

    • 我认为最好的解决方案。根据@RikkiGibson 的要求,独立于弹簧。谢谢。