티스토리 뷰
CI를 돌리는데 사진과 같은 오류가 발생했다.
CI에서는 Build, Test Job을 분리한 상태였는데, Test는 성공했지만 Build Job에서의 Test가 실패했다.
로컬에서 빌드를 해봐도 Test는 제대로 돌아가는데, Build Job에서만 Test가 실패하는게 이상했다.
첨부한 사진 가장 상단에 testReleaseUnitTest라고 적혀있는 것을 보면, debug 모드가 아닌 release 모드로 빌드하고 있다는 것을 알 수 있다.
- name: Build with Gradle
run: ./gradlew build
CI 스크립트를 보니 이렇게 작성되어 있었다.
./gradlew build는 release 모드로 빌드를 한다. 반면에 ./gradlew assembleDebug는 debug 모드로 빌드를 한다.
- name: Run Test
run: ./gradlew testDebugUnitTest
CI의 Test Job에서는 위처럼 debug 모드로 빌드하기 때문에 오류가 발생하지 않았던 것이다.
즉, Build Job에서도 debug 모드로 빌드할 수 있도록 ./gradlew build를 ./gradlew assembleDebug로 변경하면 해결된다.
그런데 release 모드에서는 왜 테스트가 실패하는지 궁금했다.
오류 로그를 자세히 보면, java.lang.RuntimeException at RoboMonitoringInstrumentation 오류가 발생한 것을 알 수 있다.
이 오류는 Robolectric를 사용해 UI Test를 unit test로 실행시킬 때, compose 테스트 관련 의존성이 존재하지 않을 때 발생한다.
즉, compose 테스트 의존성을 implementation이 아닌 debugImplementation으로 추가한 것이다.
debugImplementation로 추가했으니 release 모드에서는 의존성을 찾지 못해 오류가 발생하는 것이 당연하다.
debugImplementation를 testImplementation이나 implementation로 변경하면 해결된다.
그런데 CI는 보통 debug 모드에서 테스트 실패/오류 체크에 사용되기 때문에, release 모드에서 빌드되는 건 어색하다고 생각했다.
그래서 테스트 의존성은 그대로 냅두고 CI에서 debug 모드로 빌드되도록 ./gradlew assembleDebug로 변경하는 방식을 선택했다!
요약
문제 상황
Robolectric을 사용해 UI 테스트를 unit test에서 돌렸다.
로컬에서는 테스트가 성공하지만, CI에서 java.lang.RuntimeException at RoboMonitoringInstrumentation 오류가 발생했다.
원인
테스트 관련 의존성을 debugImplementation로 추가했다.
하지만 CI에서는 release 모드로 빌드하고 있기 때문에, 테스트 관련 의존성을 찾지 못했다.
해결
1) release 모드에서도 정상적으로 UI 테스트가 가능하도록 테스트 관련 의존성을 debugImplementation이 아닌 implementation이나 testImplementation로 변경한다.
2) CI에서 debug 모드로 빌드할 수 있도록 ./gradlew build를 ./gradlew assembleDebug로 변경한다.
느낀점
나는 기존에 구현했던 프로젝트나 다른 자료를 보고 그대로 의존성을 가져오는 경우가 많다.
어떤 의존성인지에 따라 implementation, debugImplementation, releaseImplementation, testImplementation, androidTestImplementation를 달리 작성해야 하지만, 다른 곳에서 그대로 의존성을 가져오면 이를 고려하지 못하는 문제가 생길 수 있다.
테스트 관련 의존성은 테스트에서만 사용될 수 있도록 testImplementation로 작성하는 것이 적절하지만, debugImplementation로 작성된 것처럼 말이다.
깊게 생각하지 않고 의존성을 복붙하기 보다는어떤 의존성인지, 어떤 빌드 환경인지를 항상 고려하여 의존성을 추가해야겠다. ㅎ
참고
'android' 카테고리의 다른 글
[우아한테크코스/안드로이드] R8 컴파일러 난독화 적용해보기 (6) | 2024.08.31 |
---|---|
[안드로이드/코틀린] 특정 뷰가 화면에서 가려지는지 여부를 동적으로 확인하기 (1) | 2024.01.28 |
[안드로이드/오류] Failed to compile values file. Resource compilation failed. Check logs for details. (1) | 2024.01.18 |
[안드로이드/코틀린] Dagger의 Hilt 라이브러리로 의존성 주입 (0) | 2023.12.03 |
[안드로이드/코틀린] BottomNavigationView 커스텀 (1) | 2023.10.25 |