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


94

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과 관련이 있습니다.

답변:


93

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

및을 구성 하는 메타 주석 인 자체 테스트 주석을 사용할 수 있습니다 . 따라서 여전히 전용 프로필이 필요하지만 모든 테스트에서 프로필 정의를 분산시키지 마십시오.@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"};
}

1
주석에서 사용할 여러 활성 프로필을 선언하기 위해 이것을 어떻게 사용합니까?
payne

간단하고 깔끔한 수정.
Vignesh

53

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

@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방법 등)에 대해 더 전문화 된 기본 클래스를 상상할 수도 있습니다 .


43

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

spring.profiles.active=test

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


@ActiveProfiles ( "test")를 설정하지 않으려면 내 테스트 케이스에서이 항목을 사용합니다. 그것은 당신을 위해 작동하지 않습니까?
Compito

36
src/test/resources/application.properties파일을 생성 src/main/resources/application.properties하면 테스트를 실행할 때 콘텐츠가 무시됩니다.
ciastek

6
@ciastek application-test.properties테스트를 위해 추가 하고 필요한 속성 만 재정의 할 수 있습니다 .
Advicer

3
@Advicer는 기본 속성 spring.profiles.active=test이 대답과 같이 지정하지 않는 한 선택되지 않습니다 .
OrangeDog

4
@OrangeDog 정확히-아마도 기본적으로 활성화되어있는 'default'프로필을 사용할 수 있습니다. 따라서 test / resources / application-default.properties에 이러한 행을 추가 할 수 있습니다 (물론 src / main / application-default.properties 파일이 이미있는 경우는 예외입니다. :-)
joensson

16

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

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

2
application.properties클래스 경로 의 기본값 도 구문 분석 된 다음 test/resources/application-default.properties"test"프로필이 감지 되었기 때문에 구문 분석 된다는 의미 test/resources/application-test.properties입니까? 그렇지 않으면 @Compito의 답변 아래에 언급 된 @ciastek의 문제가 해결되지 않습니다 .
anddero

8

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"속성이 필요하지 않습니다.


나를 위해 일했지만 안전 장치와 함께 확실한 플러그인에 구성을 추가해야했습니다.
Mohammed Atif

5

제 경우에는 다음과 같이 환경에 따라 다른 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를 선택하는 파일입니다.


당신은 사용해야 @ActiveProfiles하지 @TestPropertySource.
OrangeDog

@TestPropertiesSource를 사용해도 괜찮다고 생각합니다. 프로필 테스트 구성간에 구성을로드하는 방법이기도합니다.
soyphea

5

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

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

4

이를위한 또 다른 프로그래밍 방식 :

  import static org.springframework.core.env.AbstractEnvironment.DEFAULT_PROFILES_PROPERTY_NAME;

  @BeforeClass
  public static void setupTest() {
    System.setProperty(DEFAULT_PROFILES_PROPERTY_NAME, "test");
  }

잘 작동합니다.


4

테스트 특정 속성을 src/test/resources/config/application.properties.

이 파일에 정의 된 속성은 src/main/resources/application.properties테스트 중에 정의 된 속성을 재정의합니다 .

이것이 작동하는 이유에 대한 자세한 내용은 Spring Boots 문서를 참조하십시오 .


여기에 많은 좋은 아이디어가 많은 경우에 유용합니다. IMHO @Matze 대답은이 질문에 대한 가장 간결하고 직접적인 대답입니다. 프로파일 필요 없음, 테스트 코드 수정 필요 없음 ... 또한 로깅이 더 깔끔합니다 (제 경우에는 Spring이 방언을 사용하여 기록하는 혼란 스러움 : org.hibernate.dialect.PostgreSQL93Dialect 내 테스트가 고맙게도 대신 테스트 H2 데이터베이스를 사용하는 경우).
Raymond Naseef

1

maven을 통해 빌드 할 때 기본 프로필을 설정 / 사용하려면 다음 -Dspring.profiles.active=test 과 같이 인수를 전달하십시오.

mvn clean install -Dspring.profiles.active = dev


0

추가 spring.profiles.active=tests귀하의 application.properties 파일에, 당신처럼 봄 부팅 응용 프로그램에서 여러 속성 파일을 추가 할 수 있습니다 application-stage.properties, application-prod.properties등 그리고 파일을 추가하여 참조하는 동안 당신은 당신의 application.properties에 파일을 지정할 수 있습니다 spring.profiles.active=stage또는spring.profiles.active=prod

다음 명령을 제공하여 스프링 부트 애플리케이션을 실행할 때 프로필을 전달할 수도 있습니다.

java -jar-Dspring.profiles.active=localbuild/libs/turtle-rnr-0.0.1-SNAPSHOT.jar

프로필 이름에 따라 속성 파일이 선택됩니다. 위의 경우 프로필을 전달하는 경우 파일을 local고려 application-local.properties하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.