[트러블슈팅]테스트 환경에서 환경 변수 세팅

김강욱·2024년 4월 25일
1

Project-Evertrip

목록 보기
4/19

😊 오류 발생

@SpringBootTest 환경에서 테스트를 진행하다 아래와 같은 에러가 발생하였습니다.

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'jasypt.encryptor.password' in value "${jasypt.encryptor.password}"

원래의 어플리케이션 환경에서는 VM Option에다 jasypt.encryptor.password에 대한 값을 설정해줬기 때문에 정상적으로 동작하였지만 테스트 환경에서는 해당 변수를 읽어오지 못하여 에러를 발생하는 것으로 보였습니다.

그래서 @SpringBootTest 환경에서도 똑같은 방법으로 Test Configurations에 VM Option을 넣어줬는데도 역시나 해결되지 않았습니다.

테스트 환경에서는 VM Option이 적용되지 않는 듯 하였습니다.

이에 대해 OKKY 사이트에서 저와 똑같은 문제를 겪으신 글을 보고 해결할 수 있었습니다.

인텔리제이에서 기본 애플리케이션을 실행할 때와 테스트 코드를 수행하는 경우 동작 방식이 다른 부분에 원인이 있었습니다.

기본 애플리케이션을 실행할 때에는 환경 변수가 지정된 JVM을 그대로 사용하기 때문에 프로퍼티를 VM Options으로 전달하여 사용할 수 있었습니다.

하지만, Gradle이나 JUnit으로 동작하는 경우에는 VM Options으로 프로퍼티를 전달할 수 없었습니다. Gradle Test의 경우 직접적으로 JVM을 실행하는 것이 아니라 내부적으로 JVM을 실행시키기 때문에 VM Options가 적용되지 않았던 것입니다.

저같은 경우도 Gradle Test를 실행하고 있었기 때문에 VM Options가 적용되지 않았습니다.


😊 문제 해결

해결 방법은 크게 두가지 방법 정도가 있었습니다.

첫 번째 방법은 다음과 같이 VM Options이 아니라 Environment Variables에 환경 변수를 세팅해주는 것입니다.

두 번째 방법은 테스트 코드 내에서 @TestPropertySource를 사용하여 환경 변수를 넣어주는 것입니다.

@TestPropertySource 를 사용하면 테스트 클래스 또는 특정 테스트 메소드에 대한 프로퍼티 소스를 지정할 수 있습니다.

참고로 인텔리제이에서 VM Options를 주고 테스트하는 방식은 동일 환경 테스트가 보장이 안되기 때문에 권장하지 않는다고 합니다.

VM 옵션을 사용하면 테스트가 해당 환경 설정에 의존하게 되기 때문에 다른 CI/CD 환경에서 실행될 때 설정을 정확히 일치시키지 않으면 테스트 결과가 달라질 수 있기 때문입니다.

또한 VM 옵션을 사용하면 모든 테스트가 글로벌한 JVM 설정에 영향을 받기 때문에 @TestPropertySource를 이용하여 각 테스트가 필요한 환경을 독립적으로 설정하고 정리할 수 있도록 구성하는 것이 좋다고 합니다.


😊 참고 : Gradle Test vs Junit Test

테스트 실행환경은 개발자의 필요에 따라 Gradle 설정 파일이나 IDE의 테스트 실행 옵션을 통해 테스트 실행 환경을 설정할 수 있습니다.

Gradle을 통한 테스트 실행

Gradle 빌드 도구를 사용할 때, gradle test 명령어로 프로젝트의 테스트를 실행할 수 있습니다.

Gradle에서 테스트를 실행하면 build.gradle 파일에서 지정한 설정에 따라 테스트가 수행됩니다.

build.gradle 예시
test {
    useJUnitPlatform()
    include '**/MySpecificTest.class'  // 특정 테스트 클래스만 실행
    testLogging {
        events "passed", "skipped", "failed"  // 테스트 결과 로깅 설정
    }
}

IDE에서 JUnit으로 테스트 실행

IDE에서는 JUnit 테스트 러너를 사용하여 직접 테스트를 실행할 수 있습니다.

IDE 내에서 테스트 클래스나 테스트 메소드를 Run을 선택하여 해당 테스트를 실행하면 내부적으로 JUnit 라이브러리를 사용하여 테스트를 관리하고 실행 결과를 사용자에게 보여줍니다.

JUnit 5에서는 @Tag 어노테이션을 사용하여 테스트 메소드나 클래스를 태그로 분류하고, 실행 환경에서 특정 태그가 지정된 테스트만 실행되도록 설정할 수 있습니다.

Junit @Tag
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;

@Tag("critical")
public class CriticalTests {
    @Test
    public void testSomethingImportant() {
        // 중요한 테스트 로직
    }
}
Gradle에서 태그 이용하여 테스트 실행
test {
    useJUnitPlatform {
        includeTags 'critical'  // 'critical' 태그가 붙은 테스트만 실행
    }
}



Settings 설정에서 테스트 실행 환경에 대한 세팅을 진행하실 수 있습니다

참고 사이트
OKKY SpringBootTest 오류 해결

profile
TO BE DEVELOPER

0개의 댓글

관련 채용 정보