[java] 통합 테스트를위한 Spring-boot 기본 프로필

Spring-boot는 Spring 프로파일 ( http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html )을 활용 하여 예를 들어 다른 환경에 대해 별도의 구성을 가질 수 있습니다. 이 기능을 사용하는 한 가지 방법은 통합 테스트에서 사용할 테스트 데이터베이스를 구성하는 것입니다. 그러나 내 자신의 프로필 ‘테스트’를 만들고 각 테스트 파일에서이 프로필을 명시 적으로 활성화해야하는 것이 궁금합니다. 지금은 다음과 같은 방식으로 수행합니다.

  1. src / main / resources 내에 application-test.properties 생성
  2. 거기에 테스트 특정 구성을 작성하십시오 (지금은 데이터베이스 이름 만)
  3. 모든 테스트 파일에는 다음이 포함됩니다.

    @ActiveProfiles("test")
    

더 똑똑하고 간결한 방법이 있습니까? 예를 들어 기본 테스트 프로필?

편집 1 :이 질문은 Spring-Boot 1.4.1과 관련이 있습니다.



답변

내가 아는 한 귀하의 요청을 직접 처리하는 것은 없지만 도움이 될 수있는 제안을 제안 할 수 있습니다.

및을 구성 하는 메타 주석 인 자체 테스트 주석을 사용할 수 있습니다 . 따라서 여전히 전용 프로필이 필요하지만 모든 테스트에서 프로필 정의를 분산시키지 마십시오.@SpringBootTest@ActiveProfiles("test")

이 주석은 기본적으로 프로필로 설정되며 test메타 주석을 사용하여 프로필을 재정의 할 수 있습니다.

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@SpringBootTest
@ActiveProfiles
public @interface MyApplicationTest {
  @AliasFor(annotation = ActiveProfiles.class, attribute = "profiles") String[] activeProfiles() default {"test"};
}


답변

이를 수행하는 또 다른 방법은 실제 테스트 클래스가 확장 할 기본 (추상) 테스트 클래스를 정의하는 것입니다.

@RunWith(SpringRunner.class)
@SpringBootTest()
@ActiveProfiles("staging")
public abstract class BaseIntegrationTest {
}

콘크리트 테스트 :

public class SampleSearchServiceTest extends BaseIntegrationTest{

    @Inject
    private SampleSearchService service;

    @Test
    public void shouldInjectService(){
        assertThat(this.service).isNotNull();
    }
}

이를 통해 @ActiveProfiles주석 뿐 아니라 더 많은 것을 추출 할 수 있습니다 . 다른 종류의 통합 테스트 (예 : 데이터 액세스 계층 대 서비스 계층) 또는 기능적 전문성 (공통 @Before또는 @After방법 등)에 대해 더 전문화 된 기본 클래스를 상상할 수도 있습니다 .


답변

test / resources 폴더에 application.properties 파일을 넣을 수 있습니다. 거기 설정

spring.profiles.active=test

이것은 테스트를 실행하는 동안 일종의 기본 테스트 프로필입니다.


답변

이를위한 선언적인 방법 (사실 @Compito의 원래 답변에 대한 사소한 tweek) :

  1. 설정 spring.profiles.active=test에서 test/resources/application-default.properties.
  2. test/resources/application-test.properties테스트를 위해 추가 하고 필요한 속성 만 재정의합니다.


답변

maven을 사용하는 경우 pom.xml에 추가 할 수 있습니다.

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <configuration>
                <argLine>-Dspring.profiles.active=test</argLine>
            </configuration>
        </plugin>
        ...

그런 다음 maven은이 인수를 사용하여 통합 테스트 (* IT.java)를 실행해야하며 IntelliJ는이 프로필이 활성화 된 상태로 시작됩니다. 그러면 내부의 모든 속성을 지정할 수 있습니다.

application-test.yml

“-default”속성이 필요하지 않습니다.


답변

제 경우에는 다음과 같이 환경에 따라 다른 application.properties가 있습니다.

application.properties (base file)
application-dev.properties
application-qa.properties
application-prod.properties

application.properties는 적절한 파일을 선택하기 위해 spring.profiles.active 속성을 포함합니다.

내 통합 테스트를 위해 application-test.properties내부에 새 파일을 만들었고 주석을 test/resources사용하여 @TestPropertySource({ "/application-test.properties" })해당 테스트에 대한 요구 사항에 따라 원하는 application.properties를 선택하는 파일입니다.


답변

“테스트”프로필을 활성화하려면 build.gradle에 작성하십시오.

    test.doFirst {
        systemProperty 'spring.profiles.active', 'test'
        activeProfiles = 'test'
    }