关于集成测试类的Spring配置文件

时间:2015-09-30 06:33:10

标签: spring spring-test

我们有由java测试类运行的selenium测试。

在本地环境中一切正常,但我想在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注释传递的某种形式的配置文件并考虑配置文件注释吗? :)

//更新: 可以使用类扩展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配置文件处于活动状态,但测试仍在运行)。

1 个答案:

答案 0 :(得分:2)

@Profile对测试类有影响。因此,您应该只删除该注释。

如果您希望仅在给定系统属性具有特定值时启用测试类,则可以使用@IfProfileValue

但是,在您的方案中,如果给定的系统属性具有特定值(即spring.profiles.active包含jenkins),则您希望禁用测试类

更优雅的解决方案是使用JUnit 假设来使整个测试类忽略,而不是实现自定义ActiveProfileResolver。假设失败。

这应该很适合你:

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的作者