[Video Review] 라인의 안드로이드 CI&Unit Test

[Video Review] 라인의 안드로이드 CI&Unit Test

이번 포스팅에서는 "라인개발실록" 유튜브 채널의 아래 영상을 리뷰하겠습니다.

https://www.youtube.com/watch?v=gHC4NHN-ZdA

서론

현업에서는 안드로이드 앱개발과 유지보수를 위해 어떤 방법들을 사용하고 있는지 궁금해 영상을 찾아봤습니다. 처음 듣는 용어나 기술들을 간략하게 서치해 정리하고 모르는 내용에 대해서 이후 포스팅을 통해 좀 더 깊게 학습해보겠습니다.

리뷰

Q. 라인 안드로이드의 테스트, CI와 같은 프로세스가 탄탄해진 이유?

예전의 누군가 실수한 내용을 자동화 테스트 도구에 계속 누적해 옴.

Q. ViewModel 및 Unit 테스트 위주인지? UI 테스트도 하는지?

기본적으로는 테스팅을 ViewModel 과 Presenter 위주로 함. 비즈니스 로직을 테스트하는 게 가장 큼.

UI 테스트도 하긴 하는데 잘 하진 않는다.

Android Instrumemted 테스트 같은 걸 활용할 수 있지만 그렇게 까지 하지 않는다.

Q. Instrumented 테스트가 뭔가요?

Unit 테스트를 돌릴 때 PC에서 돌리는 게 아니고, 휴대폰 위에 올려서 하는 것.

Espresso라고 UI를 테스트 해주는 라이브러리가 있다. 이걸 쓰면 실제로 폰을 연결해서 테스트 할 수 있다.

Q. 라인 안드로이드에서 Unit 테스트는 어떻게 하고 있나?

Robolectric이라고하는 테스트 라이브러리를 사용해 개발자 PC에서 Unit 테스트를 수행하고 있다.

Robolectric 은 PC의 Java VM 과 휴대폰의 ART(Android Runtime)이 굉장히 다른 황경이지만 PC 환경에서 안드로이드의 API 흉내를 내주는 여러 기능을 가지고 있다. 그래셔 몇몇 안드로이드 기능을 PC 에서 테스트 할 수 있다.

Q. 또 어떤 테스트가 있나?

코드 뿐 아니라 퍼미션 테스트

카메라 유무 체크를 코드 수준에서 하지 않고 APK 안에 특정 데이터가 있는데 그걸 활용하는 듯?

이전 존재하지 않는 권한을 요청해 앱이 스토어 승인을 받지 못하는 케이스가 있었음

서브모듈

하나의 모듈이 아닌 서브모듈로 분산해서 코드를 작성하는 경우가 많음, Git submodule

개별적으로 서브모듈이 작업되면 본체에서는 업데이트된 서브모듈의 해시를 가져와 사용한다.

그 해시를 업데이트 해줘야 업데이트가 반영됨. 여기 업데이트 과정에서 휴먼에러 가능성 있음.

그래서 git에서 PR 을 올릴 때 이런 실수를 하지 않았는지 테스트하는 로직을 추가함.

각 서브 모듈 내 Unit 테스트가 있고 라인 본체 앱에도 Unit 테스트가 다 따로 있다.

이전에는 PR 이 올라가면 본체 앱만 테스트를 했는데 문제가 종종 생겨 본체앱과 서브 모듈을 모두 테스트 한다.

휴먼 에러를 줄이기 위해 최대한 많은 내용을 자동으로 체크할 수 있도록 하고 있다.

Q. PR 올렸을 때 많은 테스트를 진행하는데 테스트를 뒷받침하는 시스템은?

현재 젠킨스(Jenkins)를 사용해 해당 테스트의 결과를 PR의 comment 나 checker로 타 통합되어 있다.

일부 테스트 결과는 Danger 라는 툴 이용

빌드 실패 같은 경우는 Gradle Enterprise 의 로그

Q. PR을 올리면 모든 테스트가 진행되기 까지 얼마나 걸리나?

30~40분 걸림

Q. 코드 품질 검사는 어떻게 하는지?

Lint 테스트 수행

정적 분석 툴 SonarQube 같은 것도 씀. 정적 분석을 통해 구조적인 코멘트도 날리고 있음.

기본적인 코드 포멧도 ktlint 를 사용해 검사중.

PR을 올리고 빈 줄 하나 때문에 에러가 검출되면 다시 PR 을 올리고 30분을 기다려야 해서 번거롭긴 함.

Q. Ktlint 의 룰을 커스터마이징 하셨는지?

임의 룰을 몇 개 끄고 사용 중.

Android Studio 와 ktlint 의 호환이 잘 되어 있지 않음.

이러면 IDE 에선 개발이 되지만 CI 시스템에서 오류를 내뱉는 경우가 생김.

이 부분을 관련 라이브러리에 이슈화 해놓으심.

Q. 안드로이드 디바이스 파편화, 어떻게 대응하여 테스트 하시는지?

개발자 입장에서는 그렇게까지 고려하지 않음. QA 쪽에서 함.

Q. Instrumented Test도 작성하고 있나요?

잘 안함.

DB 관련된 업그레이드 코드 같은 건 작성을 좀 함.

버전 업그레이드 시, 마이그레이션 중 작성함. 워낙 큰 일이라.

그걸 CI 시스템에 넣어서 테스트 하진 않음.

개발자가 폰인 폰으로 테스트함. 이후 CI 테스팅 후, QA 쪽에서 많이 봐주심.

최근데 일본쪽에서 Instrumented Test 환경을 구축해달라는 요청이 있어서 환경을 구축중이심.


키워드

  1. 자동화 테스트 도구

  2. ViewModel 및 Presenter

  3. UI 테스트

  4. Android Instrumented 테스트

  5. Espresso

  6. Robolectric

  7. 퍼미션 테스트

  8. 서브모듈

  9. Git submoudule

  10. PR 테스트 시스템

  11. 젠킨스(Jenkins)

  12. Danger

  13. Gradle Enterprise

  14. Lint 테스트

  15. SonarQube

  16. ktlint

  17. 안드로이드 디바이스 파편화 대응


요약 정리

  1. 자동화 테스트 도구: 과거의 버그나 실수를 기반으로 작성된 테스트 케이스를 자동으로 실행하여, 동일한 실수가 반복되지 않도록 도와주는 도구입니다. 예를 들어, CI(Continuous Integration) 환경에서 자동으로 실행되기도 합니다.

  2. ViewModel 및 Presenter: 안드로이드 앱에서 UI와 비즈니스 로직을 분리하여 관리하는 구조입니다. ViewModel은 데이터 처리와 관련된 로직을 담당하고, Presenter는 UI에 데이터를 전달하는 역할을 합니다. 이로 인해 테스트가 용이해집니다.

  3. UI 테스트: 사용자 인터페이스를 테스트하여, 사용자가 앱과 상호작용할 때 모든 기능이 올바르게 작동하는지 확인하는 과정입니다. 실제 디바이스나 에뮬레이터를 사용하여 테스트할 수 있습니다.

  4. Android Instrumented 테스트: 앱의 기능을 실제 디바이스나 에뮬레이터에서 실행하여 테스트하는 방법입니다. PC에서 수행하는 테스트와 달리, 실제 환경에서 앱이 제대로 동작하는지 확인할 수 있습니다.

  5. Espresso: 안드로이드 앱의 UI 테스트를 자동화할 수 있는 라이브러리입니다. 사용자가 앱을 사용하는 것처럼 시나리오를 작성하여 테스트할 수 있으며, 자동으로 테스트를 실행하여 결과를 확인할 수 있습니다.

  6. Robolectric: 안드로이드 앱을 PC에서 테스트할 수 있도록 도와주는 프레임워크입니다. 실제 디바이스 없이도 안드로이드 API를 흉내내어 테스트 환경을 제공하므로, 빠르고 효율적인 테스트가 가능합니다.

  7. 퍼미션 테스트: 앱이 요구하는 권한이 제대로 설정되고 작동하는지 확인하는 테스트입니다. 예를 들어, 카메라 접근 권한이 올바르게 설정되어 있는지 테스트하여, 사용자에게 필요한 권한을 올바르게 요청하고 있는지 확인합니다.

  8. 서브모듈: 큰 프로젝트를 여러 개의 작은 모듈로 나누어 관리하는 방식입니다. Git submodule을 사용하여 각 모듈을 독립적으로 개발하고, 필요할 때 본 프로젝트에 통합합니다. 이는 코드 관리와 협업을 용이하게 합니다.

  9. Git submodule: 하나의 Git 리포지토리 내에 다른 Git 리포지토리를 포함시키는 기능입니다. 공통 모듈을 여러 프로젝트에서 재사용하고 독립적으로 버전 관리할 수 있습니다.

  10. PR 테스트 시스템: Pull Request(코드 변경 요청)가 제출될 때 자동으로 테스트를 실행하여 코드의 품질을 확인하고, 잠재적인 버그를 발견하는 시스템입니다. 이는 코드 변경 사항이 문제 없이 통합될 수 있도록 도와줍니다.

  11. 젠킨스(Jenkins): 소프트웨어 개발을 위한 지속적 통합(CI) 도구입니다. 코드를 변경할 때마다 자동으로 빌드하고 테스트를 수행하여 개발 과정을 자동화합니다. 이는 개발 속도를 높이고, 오류를 줄이는 데 도움을 줍니다.

  12. Danger: 코드 리뷰 시 자동으로 검사하여 잠재적인 문제를 알려주는 도구입니다. 코드 스타일, 테스트 커버리지 등 다양한 측면에서 검토할 수 있으며, 코드 품질을 높이는 데 도움을 줍니다.

  13. Gradle Enterprise: 빌드 및 테스트 과정의 효율성을 높여주는 도구입니다. 빌드 실패 원인 분석, 캐시 사용 최적화 등을 지원하여, 빌드 시간을 단축하고 안정성을 높입니다.

  14. Lint 테스트: 소스 코드에서 잠재적인 버그, 스타일 문제, 성능 문제 등을 자동으로 검출하는 도구입니다. 이는 코드 품질을 유지하는 데 도움을 주며, 개발 과정에서 실수를 줄이는 데 기여합니다.

  15. SonarQube: 코드 품질 관리 플랫폼입니다. 코드의 버그, 취약점, 코드 스멜 등을 분석하고 시각화하여 개발자에게 피드백을 제공함으로써 코드 품질을 지속적으로 개선할 수 있습니다.

  16. ktlint: Kotlin 코드 스타일 검사 도구입니다. 코딩 규칙을 자동으로 적용하고, 규칙에 맞지 않는 코드를 발견하여 수정하도록 돕습니다. 이는 일관된 코드 스타일을 유지하는 데 도움을 줍니다.

  17. 안드로이드 디바이스 파편화 대응: 다양한 안드로이드 기기와 OS 버전에 대해 앱이 제대로 작동하는지 테스트하는 작업입니다. QA 팀에서 주로 담당하며, 다양한 디바이스에서의 호환성을 확인하여 사용자 경험을 보장합니다.