Spring 集成测试配置文件 class

Spring profiles on integration tests class

我们有 selenium 测试 运行 by java 测试 class。

在本地环境中一切正常,但我想在 jenkins 上 运行 时关闭这些测试。

所以我使用:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebIntegrationTest("server.port=1234")
@Profile("!jenkins")
@ActiveProfiles("integrationtests")
public class LoginAndEditProfileSeleniumTest {
...

什么有效: 运行宁 mvn clean test 运行 所有本地测试, integrationtests 配置文件处于活动状态。我不想传递任何额外的参数。

我想达到的目标: 运行宁 mvn clean test -Dspring.profiles.active=jenkins 关闭此测试。

我能否以某种方式合并参数传递的配置文件、ActiveProfile 注释并考虑配置文件注释? :)

//更新: 可以使用 class 扩展 ActiveProfilesResolver:

public class ActiveProfileResolver implements ActiveProfilesResolver {
@Override
public String[] resolve(Class<?> testClass) {

    final String profileFromConsole = System.getProperty("spring.profiles.active");
    List<String> activeProfiles = new ArrayList<>();
    activeProfiles.add("integrationtests");
    if("jenkins".contains(profileFromConsole)){
        activeProfiles.add("jenkins");
    }
    return activeProfiles.toArray(new String[activeProfiles.size()]);
}
}

但它似乎不与@Profile 合作(jenkins 配置文件处于活动状态但测试仍在 运行ning)。

@Profile 对测试 class 的影响 为零 。因此,您应该简单地删除该注释。

如果你想启用测试class只有当给定系统属性存在特定值时,你可以使用@IfProfileValue.

但是,在您的场景中,如果给定系统 属性 存在特定值(即,如果 spring.profiles.active 包含 jenkins).

不是实现自定义 ActiveProfileResolver,更优雅的解决方案是使用 JUnit 假设 使整个测试 class 成为 忽略 如果假设失败。

这应该很适合你:

import static org.junit.Assume.*;

// ...

@BeforeClass
public static void disableTestsOnCiServer() {
    String profilesFromConsole = System.getProperty("spring.profiles.active", "");
    assumeFalse(profilesFromConsole.contains("jenkins"));
}

此致,

Sam(Spring TestContext Framework 的作者)