본문 바로가기
Android

[Android] implementation과 testImplementation의 차이

by 너츠너츠 2023. 9. 2.

배경

현재 프로젝트에 테스트 코드를 도입하려고 여러 자료를 공부하는 와중에 nowinandroid testing 모듈에 대한 의존성 설정에 대한 의문점이 들었습니다. A -> B, B -> A에 대한 의존성을 가질 때 순환참조가 발생하게 되는데 왜 발생하지 않을까? 라는 의문이 들었고 한번 내용을 정리해보고자 합니다. 순환참조에 대한 개념은 이 링크를 참고해주세요!

testing 모듈의 build.gradle
domain 모듈의 build.gradle

implementation의 종류

implementation의 종류에는 implementation, testImplementation, androidTestImplementation, debugImplementation이 있습니다. 앞에 붙은 이름은 각 라이브러리들이 적용될 범위를 뜻합니다. 

 

애플리케이션을 개발할 때 릴리즈, 디버그, 테스트 범위별로 다른 라이브러리가 들어가야 하는데 설정을 잘못한다면 불필요한 라이브러리가 릴리즈에 들어갈 때 앱 번들의 크기가 커질 수 있습니다.

 

대표적인 scope는 다음과 같습니다.

Scope keyword
compile implementation, api
compile only compileOnly
debug debugImplementation
runtime runtimeOnly
test testImplementation, testCompileOnly, testRunTimeOnly
android test androidTestImplementation

nowinandroid의 build.gradle

 

그렇다면 왜 순환참조는 발생하지 않는걸까?

implementation으로 각각 test1, test2가 서로 알도록 의존성을 설정한 후 sync를 해줄 때는 문제가 없습니다.

하지만 빌드를 할 경우엔 다음과 같은 에러가 발생합니다.

결론적으로는 debug, release 단계에서 순환참조를 발견될 경우 에러를 발생시키는 것이고, test를 할 때는 bundle에 영향을 전혀 주지 않기 때문에 에러가 발생하지 않습니다.

 

따라서 nowinandroid처럼 testing 모듈에 대해 의존성을 가져도 크게 문제되지 않는 것입니다.

 

 

 

<참고>

https://kotlinworld.com/316

https://github.com/android/nowinandroid

반응형

댓글