Robolectric의 테스트 캐시를 관리하는 방법은 무엇인가요?

_____
Q1: Robolectric 테스트 캐시란 무엇인가요?
A1: Robolectric 테스트 캐시는 테스트 실행 속도를 높이기 위해 자주 사용하는 리소스와 JVM 내부 상태를 디스크에 저장해 두는 메커니즘입니다. 이를 통해 반복 테스트 시 초기화 비용을 줄입니다.

Q2: Robolectric 테스트 캐시는 어디에 저장되나요?
A2: 기본적으로 프로젝트의 `build` 디렉터리 내 `robolectric-cache` 폴더에 저장됩니다. 위치는 프로젝트 설정이나 환경 변수에 따라 변경될 수 있습니다.

Q3: Robolectric의 테스트 캐시를 수동으로 삭제하는 방법은?
A3: 일반적으로 `build/robolectric-cache` 폴더를 직접 삭제하면 됩니다. 이 폴더를 삭제하면 다음 테스트 실행 시 캐시가 새로 생성됩니다.

```bash
rm -rf build/robolectric-cache
```

또는 Gradle 명령어로 캐시 클린 작업을 추가하여 관리할 수 있습니다.

Q4: Robolectric 테스트 캐시 자동 관리 방법은?
A4:
- Gradle 빌드 스크립트에 `clean` 작업에 캐시 삭제를 포함시킬 수 있습니다.
- Robolectric 4.3 이상에서는 자동 캐시 관리를 지원하며 별도 설정 없이도 효과적으로 캐시를 사용하는 편리함이 있습니다.

Q5: 캐시 삭제가 필요한 경우는 언제인가요?
A5:
- 테스트 리소스 변경 후 캐시가 갱신되지 않아 테스트가 실패할 때
- Robolectric 버전 업그레이드 시 캐시 충돌이 의심될 때
- 의도하지 않은 테스트 오류나 이상 현상이 발생할 때

Q6: 캐시 경로를 커스텀 설정할 수 있나요?
A6: 네, `robolectric.properties` 파일에 아래와 같이 `robolectric.cache` 속성으로 경로를 지정할 수 있습니다.

```properties
robolectric.cache=/custom/path/to/robolectric-cache
```

Gradle 빌드 시 환경 변수 또는 시스템 속성으로 설정할 수도 있습니다.

Q7: 테스트 실행시 캐시 사용을 비활성화할 수 있나요?
A7: Robolectric은 기본적으로 캐시 사용을 권장하지만, 환경 변수 `ROBOLECTRIC_DISABLE_CACHE=true` 설정 또는 시스템 속성을 통해 캐시를 비활성화할 수 있습니다. 그러나 테스트 속도가 크게 느려질 수 있습니다.

요약
- 캐시는 `build/robolectric-cache`에 저장됨
- 변경 사항 반영이 안 될 때 캐시 삭제 권장
- `rm -rf build/robolectric-cache` 명령어로 삭제
- `robolectric.properties`로 경로 설정 가능
- Gradle의 `clean` 작업에 캐시 삭제 포함 가능
- 필요 시 캐시 사용 비활성화 가능하지만 권장하지 않음

이렇게 Robolectric 테스트 캐시를 관리하면 테스트 안정성과 빌드 속도를 모두 잡을 수 있습니다.
Robolectric은 안드로이드 UI 테스트를 JVM 환경에서 수행할 수 있게 해주는 프레임워크로, 테스트 실행 속도를 높이기 위해 여러 자원과 상태를 캐싱합니다.

하지만 때로는 이 캐시가 이전 테스트 결과를 남겨두거나 환경 변화를 반영하지 못해, 테스트 결과의 신뢰도에 영향을 줄 수 있습니다.

따라서 Robolectric의 테스트 캐시를 적절히 관리하는 것이 중요합니다.

1. Robolectric 캐시의 기본 작동 원리 Robolectric은 애플리케이션의 리소스, Android 프레임워크 클래스들을 시뮬레이션 하기 위해 다양한 데이터를 메모리에 올리고 이 데이터를 재사용합니다.

예를 들어, 리소스 로딩, AndroidManifest 파싱, Shadow 객체 생성 등의 초기화 비용이 큰 작업들은 캐시되어 이후 테스트에서 빠르게 재사용됩니다.

이 때문에 같은 테스트를 반복하거나 관련 테스트들을 연달아 수행할 때 시간 절감 효과가 큽니다.



2. 캐시가 문제될 수 있는 상황 - 테스트 코드 변경 이후에도 이전 상태가 남아 있어 테스트가 올바르게 초기화되지 않는 경우 - AndroidManifest 파일이 변경됐는데 캐시된 이전 매니페스트가 참조되는 경우 - 리소스나 설정 변경이 테스트에 반영되지 않는 경우 - 지속적으로 데이터를 유지함으로써 메모리 누수가 발생하는 경우 이런 문제를 회피하기 위해 캐시를 적절히 초기화하거나 무효화 해야 할 때가 있습니다.



3. 캐시 관리 방법 - RobolectricConfig 또는 @Config의 리소스/매니페스트 설정 변경 `@Config(manifest = Config.NONE)` 혹은 `@Config(manifest = "src/test/AndroidManifest.xml")` 같은 설정을 변경하면 Robolectric은 다른 파일 경로나 없는 매니페스트를 기준으로 캐시를 새로 만듭니다.

따라서 리소스나 manifest가 달라졌을 때 설정을 조절해 캐시를 다르게 생성하도록 유도할 수 있습니다.

- `Robolectric::reset()` 메서드 호출 Robolectric 내부적으로 캐시를 비우고 초기 상태로 돌아가도록 하는 메서드들이 있으나, 공식적으로 테스트 코드에서 직접 호출하는 API는 자주 권장되진 않습니다.

하지만 특정 상황에서 필요하다면 `ShadowExtractor` 등을 통해 특정 객체 상태를 reset 하거나, 테스트 라이프사이클 내에서 직접 초기화 코드를 삽입할 수 있습니다.

- Gradle 또는 테스트 런너에 캐시 무효화 옵션 활용 Robolectric은 Gradle 플러그인에서 테스트 캐시 관련 설정을 제공합니다.

예를 들어, Gradle의 `clean` 작업 수행 또는 테스트 실행 시 `--no-build-cache` 옵션을 주면 빌드 및 테스트 캐시를 새로고침하게 됩니다.

또한 Robolectric 자체가 사용하는 빌드 캐시를 주기적으로 클린하는 것도 방법입니다.

- JUnit 템플릿 및 Lifecycle 활용 `@Before` / `@After` 메서드 내에서 Context, Application 상태를 명시적으로 초기화하거나, `RobolectricTestRunner`의 생명주기 훅을 이용해 각 테스트가 독립적인 환경에서 수행되도록 조절합니다.

예를 들어, 매 테스트마다 새 Application 인스턴스를 생성하게 하여 이전 테스트 캐시 영향을 줄이는 전략입니다.

- 프로퍼티 조정을 통한 캐시 동작 제어 Robolectric은 내부적으로 `robolectric.offline` 같은 시스템 프로퍼티를 사용해 리소스 로딩 방식을 조절할 수 있습니다.

테스트 환경이나 CI 파이프라인에서 이 값을 조정하면 캐시 동작에 영향을 끼칠 수 있습니다.



4. 실무 팁 - 캐시 관련 오류가 반복 발생한다면 IDE나 명령어로 전체 캐시(clean) 작업을 수행한다.

- AndroidManifest나 리소스 파일을 수정한 후 테스트를 실행할 때는 반드시 클린 빌드 및 캐시 초기화를 한다.

- 커스텀 로직이 많은 Shadow 클래스나 복잡한 Fixture를 사용하는 경우, 테스트 간 독립성을 유지하기 위해 각 테스트 종료 후 상태를 리셋한다.

- 대규모 테스트 세트에서는 캐시를 적절히 활용하되, 특정 중요한 테스트는 캐시 무효화 상태에서 실행해 신뢰성을 확보한다.

--- Robolectric 테스트 캐시는 테스트 속도를 높여주는 중요한 역할을 하지만, 환경이 바뀔 때는 적절히 초기화하거나 무효화해야 합니다.

이를 위해 테스트 설정(@Config) 조정, 테스트 라이프사이클 내 초기화, Gradle 빌드 캐시 관리, 그리고 필요 시 직접 캐시를 리셋하는 코드를 사용하는 방법이 있습니다.

이를 통해 깨끗하고 신뢰성 있는 Robolectric 테스트 환경을 유지할 수 있습니다.

작성자: 박지후 [비회원] | 작성일자: 1년 전 2025-05-26 03:52:00
조회수: 159 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.