自定义 Java 注释以忽略 CI 服务器上的集成测试

Custom Java Annotation to ignore integration tests on CI server

我认为为 junit 方法和包含集成测试的 类 自定义注释会很方便。当测试在我们的 CI (Jenkins) 服务器上执行时,此注释将有效地像 @Ignore junit 注释一样工作,并且测试将 运行 在本地开发机器上正常运行。为了确定 运行 测试机器是否应该允许集成测试执行,我会检查 System.getenv("WORKSPACE") 以查看它是否 exists/contains "jenkins".

没有写过注解,对junit的实现细节不熟悉。我所描述的可能吗?如果是这样,我该怎么做?

JUnit 5

JUnit 5 有 Environment Variable Conditions 用于此目的。在您的情况下,尝试添加以下内容:


@Test
@EnabledIfEnvironmentVariable(named = "WORKSPACE", matches = "jenkins")
void onlyOnJenkins() {
    // ...
}

@Test
@DisabledIfEnvironmentVariable(named = "WORKSPACE", matches = "jenkins")
void notOnJenkins() {
    // ...
}

请注意,matches 注释属性是支持通配符的正则表达式。详情请阅读@EnabledIfEnvironmentVariable and @DisabledIfEnvironmentVariable

的JavaDoc

JUnit 用户指南中的 Conditional Test Execution 一章提供了更多您可能会觉得有用的注释和示例。


JUnit 4

请阅读此 answer 以了解如何使用 org.junit.Assume 有条件地执行测试。

很好的信息,谢谢!我将不得不在我们的积压工作中添加一项技术债务项目以升级到 Junit 5。

但是,Assume 完全满足了我的需要。我能够将以下内容添加到我的测试中 class:

    @Before
    public void checkHost(){
        final String workspaceKey = "WORKSPACE";
        final String workspaceValue = System.getenv(workspaceKey);
        final boolean isJenkins = StringUtils.contains(workspaceValue, "Jenkins");
        log.info("checkHost(): " + workspaceKey + ":" + workspaceValue + " -> isJenkins: " + isJenkins);
        assumeFalse(isJenkins);
    }