首页 > 解决方案 > 尝试为 Spring Boot App 的黄瓜集成测试加载不同的属性?

问题描述

我正在尝试对 cucumber 使用不同的属性来为我的 spring boot 应用程序运行集成测试。如果我使用主应用程序类中加载的默认属性,我可以让它运行。但是,当我将 @TestPropertySource 指定到配置属性的这个不同位置时,它仍然使用主 Application 类的应用程序上下文。因此,测试执行时的应用程序上下文与应用程序在服务器上运行时的应用程序上下文相同。我不想要这个。

这是一个使用 Spring Boot 1.5.18、Cucumber 4.2.2 的工作相关 Web 应用程序。

我所有的 java 类和包的目录结构是 src/main/java, src/main/resources 带有 application.properties 和其他一些,一个具有环境日志记录和安全属性的根级文件夹。然后我有 src/test/java 和我的黄瓜代码和 src/test/resources 和我想在测试执行时使用的修改过的 application.properties 文件。我还想指定一个不同的环境、安全性、日志配置属性文件以进行测试。

这是我尝试使用不同属性源的 ApplicationTest.Java 类。

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class, webEnvironment = 
SpringBootTest.WebEnvironment.RANDOM_PORT)
@TestPropertySource( value = 
{"file:${env.dir}/deploy/acceptance/config/env.properties",
    "file:${env.dir}/deploy/acceptance/config/AppConfig.properties",
    "file:${env.dir}/deploy/acceptance/security/auth.properties", 
"classpath:application-test.properties"})
public abstract class ApplicationTest {
    public ApplicationTest() {
}

这是我的 Cucumber4Test.Java 类

@RunWith(Cucumber.class)
@CucumberOptions(features = "src/test/resources", 
    plugin = {"pretty", "html:target/cucumber", 
"junit:target/reports/cucumber.json"}, glue = { "com.test.packages.cucumber" 
}, monochrome = true)

public class CucumberTest {

}

我不确定在学习教程时是否遗漏了这些课程中的任何内容。但正如我所说,如果我没有在我的 ApplicationTest 类中设置任何属性源,并在 eclipse 中将 CucumberTest.java 作为 junit 运行,或者运行 mvn clean install、mvn test 等,黄瓜测试将按预期执行。

我已经在这里搜索了很多问题,尝试了很多事情,但似乎没有什么对我有用。 在 Spring Boot 中使用 @TestPropertySource 覆盖 @PropertySource

在 SpringBoot 测试中加载不同的 application.yml

编辑:我认为@TestPropertySource 不起作用的原因是:Spring 中的属性源优先级。当我在 src/test/java 中加载 cucumber 时,它会加载我指定的那些属性,但随后它会在 src/main/java 文件夹中启动应用程序。这里它在 Application.java 中加载默认属性。Spring 文档说最后加载的属性优先,所以我的 TestPropertySource 在应用程序启动时被覆盖。

我的工作解决方案:我想让 cucumber 在 Jenkins 中运行,而不是我们的构建和部署管道。但是找不到解决我的工作标准的配置和属性的路径和目录结构的方法。所以我做了什么:

1) 将我需要的属性添加到 src/test/resources 中的类路径中。

2) 现在这有点 hacky,但是 src/test/java 中的第二个 Application.java 与 @Propertysources 反映了我想要使用的属性。

3) 在 jenkins 中,我在运行 mvn 测试之前执行了预构建步骤。这个 shell 只是将 src/test/java/package/with/Application.java 移动到 src/main/java/package/with/Application.java 中。这会用不同的属性覆盖通常的 Application.java 类。

4) 运行 mvn 测试

5) 利润

标签: javaspringspring-bootcucumberintegration-testing

解决方案


这行得通。

使用默认应用程序。

package cucumber.examples.spring.txn;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

@SpringBootApplication
@EnableWebMvc
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

还有一些application.properties

key=App

然后运行:

package cucumber.examples.spring.txn;

import cucumber.api.junit.Cucumber;
import org.junit.runner.RunWith;

@RunWith(Cucumber.class)
public class RunCukesTest {
}

并使用此测试上下文配置

package cucumber.examples.spring.txn;

import cucumber.api.java.Before;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.TestPropertySource;

@SpringBootTest
@AutoConfigureMockMvc
public class CucumberContextConfiguration  {

    @Value("${key}")
    private String value;

    @Before
    public void setup_cucumber_spring_context(){
        // Dummy method so cucumber will recognize this class as glue
        // and use its context configuration.

        System.out.println("Property was " + value);
    }
}

将打印Property was App

添加@TestPropertySource("classpath:test.properties")CucumberContextConfiguration创建一个test.properties包含

key=Test

将打印Property was Test


推荐阅读