복붙노트

[SPRING] 프로파일을 이용한 Spring 통합 테스트

SPRING

프로파일을 이용한 Spring 통합 테스트

스프링 웹 애플리케이션에서는 스프링 빈 프로파일을 사용하여 개발, 통합 및 생산이라는 세 가지 시나리오를 구별한다. 다른 데이터베이스에 연결하거나 다른 상수를 설정하는 데 사용합니다.

스프링 빈 프로파일을 사용하면 웹 애플리케이션 환경을 변경하는 데 매우 효과적입니다.

우리가 가지고있는 문제는 통합 테스트 코드가 환경에 변화를 요구할 때입니다. 이러한 경우 통합 테스트는 웹 응용 프로그램의 응용 프로그램 컨텍스트를로드합니다. 이렇게하면 데이터베이스 연결, 상수 등을 다시 정의 할 필요가 없습니다 (DRY 원칙 적용).

우리는 다음과 같은 통합 테스트를 설정했습니다.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = ["classpath:applicationContext.xml"])
public class MyTestIT
{
   @Autowired
   @Qualifier("myRemoteURL")  // a value from the web-app's applicationContext.xml
   private String remoteURL;
   ...
 }

@ActiveProfiles를 사용하여 로컬로 실행할 수는 있지만 하드 코딩되어 있으므로 테스트가 빌드 서버에서 실패합니다.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = ["classpath:applicationContext.xml"])
@ActiveProfiles("development")
public class MyTestIT
{ ... }

또한 @WebAppConfiguration을 사용하여 Maven에서 spring.profiles.active 속성을 가져올 수 있기를 바랬지 만 작동하지 않습니다.

한 가지 다른 점은 개발자가 웹 응용 프로그램을 실행하고 IntelliJ의 테스트 러너 (또는 다른 IDE)를 사용하여 테스트를 실행할 수 있도록 코드를 구성해야한다는 것입니다. 이것은 통합 테스트를 디버그하는 데 훨씬 쉽습니다.

해결법

  1. ==============================

    1.이미 다른 사람들이 지적했듯이 Maven을 사용하여 spring.profiles.active 시스템 속성을 설정하고 @ActiveProfiles를 사용하지 않도록 할 수 있지만 IDE 내에서 실행되는 테스트에는 적합하지 않습니다.

    이미 다른 사람들이 지적했듯이 Maven을 사용하여 spring.profiles.active 시스템 속성을 설정하고 @ActiveProfiles를 사용하지 않도록 할 수 있지만 IDE 내에서 실행되는 테스트에는 적합하지 않습니다.

    프로그래밍 방식으로 활성 프로파일을 설정하려면 몇 가지 옵션이 있습니다.

    문안 인사,

    Sam (Spring TestContext Framework 작성자)

  2. ==============================

    2.필자는 비슷한 문제를 겪었습니다. 기본 프로파일을 사용하여 모든 통합 테스트를 실행하려고했지만 사용자가 @ActiveProfiles 값을 변경하지 않고도 다른 환경이나 db flavor를 나타내는 프로파일로 대체 할 수있었습니다. 사용자 정의 ActiveProfilesResolver와 함께 Spring 4.1 이상을 사용하는 경우 가능합니다.

    필자는 비슷한 문제를 겪었습니다. 기본 프로파일을 사용하여 모든 통합 테스트를 실행하려고했지만 사용자가 @ActiveProfiles 값을 변경하지 않고도 다른 환경이나 db flavor를 나타내는 프로파일로 대체 할 수있었습니다. 사용자 정의 ActiveProfilesResolver와 함께 Spring 4.1 이상을 사용하는 경우 가능합니다.

    이 예제 리졸버는 시스템 프로퍼티 인 spring.profiles.active를 찾고, 존재하지 않으면 단순히 @ActiveProfiles 주석을 사용하는 기본 리졸버에 위임합니다.

    public class SystemPropertyActiveProfileResolver implements ActiveProfilesResolver {
    
    private final DefaultActiveProfilesResolver defaultActiveProfilesResolver = new DefaultActiveProfilesResolver();
    
    @Override
    public String[] resolve(Class<?> testClass) {
    
        if(System.getProperties().containsKey("spring.profiles.active")) {
    
            final String profiles = System.getProperty("spring.profiles.active");
            return profiles.split("\\s*,\\s*");
    
        } else {
    
            return defaultActiveProfilesResolver.resolve(testClass);
        }
    }
    

    }

    그리고 테스트 클래스에서는 다음과 같이 사용합니다.

    @RunWith(SpringJUnit4ClassRunner.class)
    @ActiveProfiles( profiles={"h2","xyz"},
    resolver=SystemPropertyActiveProfileResolver.class)
    public class MyTest { }
    

    물론 활성 프로파일을 설정하는 시스템 등록 정보의 존재 여부를 확인하는 것 외에도 다른 방법을 사용할 수 있습니다. 희망이 사람을 도움이됩니다.

  3. ==============================

    3.프로필을 하드 코딩하지 않으려면 시스템 속성 spring.profiles.active를 사용하여 특정 환경에서 필요한 모든 항목으로 설정할 수 있습니다. 우리는 서로 다른 환경에 대한 "개발", "단계"및 "자극"프로필을 가지고 있습니다. 또한 우리는 테스트를 위해 "테스트", "테스트 로컬"및 "테스트 서버"프로파일을 가지고 있습니다.

    프로필을 하드 코딩하지 않으려면 시스템 속성 spring.profiles.active를 사용하여 특정 환경에서 필요한 모든 항목으로 설정할 수 있습니다. 우리는 서로 다른 환경에 대한 "개발", "단계"및 "자극"프로필을 가지고 있습니다. 또한 우리는 테스트를 위해 "테스트", "테스트 로컬"및 "테스트 서버"프로파일을 가지고 있습니다.

    쉼표로 구분 된 값 목록을 사용하여 해당 시스템 속성에 둘 이상의 프로필을 가질 수 있습니다. "test, test-qa".

    maven surefire 플러그인에서 maven 프로젝트의 시스템 속성을 지정하거나 다음과 같이 전달할 수 있습니다.

    mvn -DargLine="-DpropertyName=propertyValue"
    
  4. ==============================

    4.@ElderMael이 언급했듯이, 당신은 maven surefire plugin의 argLine 속성을 사용할 수 있습니다. 때로는 다른 특정 스프링 프로파일로 모든 테스트를 실행해야 할 때마다 추가 메이븐 프로파일을 정의합니다. 예:

    @ElderMael이 언급했듯이, 당신은 maven surefire plugin의 argLine 속성을 사용할 수 있습니다. 때로는 다른 특정 스프링 프로파일로 모든 테스트를 실행해야 할 때마다 추가 메이븐 프로파일을 정의합니다. 예:

    <profiles>
        <profile>
            <id>foo</id>
            <dependencies>
                <!-- additional dependencies if needed, i.e. database drivers ->
            </dependencies>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-surefire-plugin</artifactId>
                        <configuration>
                            <argLine>-Dspring.profiles.active=foo</argLine>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>
    

    이 방법을 사용하면 활성화 된 프로필을 사용하여 모든 테스트를 maven 명령으로 쉽게 실행할 수 있습니다.

    mvn clean test -Pfoo
    

    @ActiveProfile 주석은 좋지만 때로는 활성화 된 특정 프로파일을 사용하여 모든 테스트를 실행해야하며 문제가있는 하드 코딩 된 @ActiveProfile 매개 변수를 사용해야합니다.

    예를 들어 H2 in-memory db로 기본 통합 테스트를하지만, 때로는 "실제"데이터베이스에서 test를 실행하려고합니다. 추가 메이븐 프로파일을 정의하고 Jenkins 작업을 정의 할 수 있습니다. SpringBoot를 사용하면 application / foo.yml (또는 속성)이라는 이름의 테스트 / 리소스에 추가 속성을 추가 할 수 있으며 이러한 속성은 고려됩니다.

  5. ==============================

    5.이 문제에 대한 많은 얼굴들이 있습니다. 제 경우에는 build.gradle에 대한 간단한 추가가 이미 도움이되었습니다.

    이 문제에 대한 많은 얼굴들이 있습니다. 제 경우에는 build.gradle에 대한 간단한 추가가 이미 도움이되었습니다.

    test { systemProperties = System.properties }
    
  6. from https://stackoverflow.com/questions/20551681/spring-integration-tests-with-profile by cc-by-sa and MIT license