[번역] DroidKaigi 2016 ~ 내가 테스트 써라고 말하는 아저씨가 된 경위와 그 과정에서 한 일

[번역] DroidKaigi 2016 ~ 내가 테스트 써라고 말하는 아저씨가 된 경위와 그 과정에서 한 일

Feb 29, 2016. | By: pluulove

본 포스팅은 droidkaigi-2016 을 기본으로 번역하여 작성했습니다

제 일본어 실력으로 인하여 오역이나 오타가 발생할 수 있습니다.

실제 발표내용에 해당하는 슬라이드와 슬라이드의 일본어 부분만 번역만 번역했다는 점 양해바랍니다.


1p

내가 테스트 쓰라고 말하는 아저씨가 된 경위와 그 과정에서 한 일

2p

자기소개

  • kaido yuya
  • 주식회사 Eureka
  • 테스트 쓰라고 하는 아저씨 (신졸)
  • Android는 2년

3p

주식회사 Eureka

  • 자사 서비스의 기획 · 개발 · 운영
    • 온라인 데이팅 서비스 : pairs
    • 커플 전용 어플 : COUPLES
  • 사원 수 : 85명
  • IAC 그룹
엔지니어 : 55명
비엔지니어 : 30명

4p

Android 버전을 담당 → COUPLES

6p

개요

  • 납기를 우선으로 한 나머지 설계가 소홀히
  • 당연히 테스트를 작성할 여유 따윈 없다
  • 나중에 테스트를 작성하려 해도 적을 수 없다
  • 테스트 가능한 설계로 하기 위해서 무엇을 했는가

7p

목차

  • 테스트가 없으면 어떻게 괴로운가
  • Couples의 설계
  • 테스트 가능한 수준 높은 설계
  • 테스트 방법 · 프레임워크
  • 샘플 어플에서 테스트
  • 테스트를 작성하는 문화를 만들기 위해서
  • 정리

9p

Couples에서의 사례

  • 방대한 테스트 케이스의 입력 확인
  • 영향 범위 고려 실수에 의한 버그
  • 테스트 케이스의 복잡화

10p

방대한 테스트 케이스의 입력 확인

  • Couples은 꽤 기능이 많다
  • 50페이지 이상의 Google Spreadsheet
  • 릴리즈 전에 영향이 있는 테스트케이스를 입력하고 전부 확인

11p

괴롭다!!

12p

방대한 테스트 케이스의 입력 확인

  • 입력하지 않으면 불가능한 테스트 케이스도 있다
  • 하지만, 자동 테스트 가능할 것 같은 부분도 꽤 있다

13p

그 외 화면

  • 프로필로 이동
  • 즐겨찾기로 이동
  • 히스토리로 이동
  • etc…

자동화 가능하잖아

14p

영향 범위 고려 실수에 의한 버그

  • iOS의 배포 후에 Android에 착수했기에, 당시는 빨리 릴리즈하는 것을 중시
  • 파탄난 기반설계와 Copy&Paste 때문에 전혀 관계없는 부분에서 버그가 발생
  • 배포 전에 전체 테스트 케이스를 포함하는 것은 현실적이지 안다

15p

테스트 케이스의 복잡화

  • 테스트 케이스에 의존관계가 발생하기 시작
  • 이 케이스 필요한 경우는 그 케이스도 하지 않으면 안되는

16p

각각의 문제점

  • 방대한 테스트 케이스의 입력확인
    • 인적 자원의 낭비
  • 영향 범위 고려 실수에 의한 버그
    • 사용자 이탈
  • 테스트 케이스의 복잡화
    • 인적 자원의 낭비

17p

아저씨는 이렇게 생각했다

18p

  • 이대로는 유연적이지 않다
  • 오히려 유지 보수 불가능하게 된다
  • 하지만, 아직 맞출 수 있을거야

19p

그래, 테스트를 쓰자

20p

테스트 방침

  • UI는 빈번히 변경이 있으므로, 비용적으로 맞지 않을 가능성이 있다
  • 먼저 변경이 적은 백엔드부터 하자
  • 백엔드
    • 어디까지나 Android 어플내의 백엔드
    • DB나 API 접근

22p

테스트를 못 적겠다

24p

현재 설계

25p

현재 설계

  • 견고한 Activity/Fragment
    • 정말로 놀랄 정도로 견고함
    • 테스트를 쓰지는 못할망정 기능추가도 괴롭다
  • 백엔드 클래스간의 의존관계가 복잡
    • 테스트를 쓰기 어렵다
    • MockServer로 바꿔치기가 어렵다

Pluu: 여기서 견고라고 표현한 것은 Activity/Fragment에 3000 라인 이상이 포함된 코드라고 생각하시면 됩니다.

26p

아저씨의 선택지

  • 기존 백엔드에 직접 손을 가하다
  • 새로운 백엔드를 만들어 전환

27p

아저씨의 결단

  • 기존 백엔드에 직접 손을 가하다
    • 의존관계가 복잡
    • 테스트가 없는 상태에서 손을 가하는것이 무섭다
  • 새로운 백엔드를 만들어 전환
    • 의존관계를 말끔히 정리
    • 테스트를 작성하면서 기능 단위로 차례로 교체함으로 리스크를 줄인다

29p

테스트 가능을 높이기 위해서는

  • 각층의 역할이 명확
    • 적절한 모듈화
  • CI 서버에 지속해서 테스트가 가능

30p

프론트 엔드 ↔ Model ↔ 백엔드

31p

백엔드

32p

백엔드

  • 각층의 역할이 명확하게
  • CI 서버상에서 지속해서 테스트할 수 있게

33p

프론트엔드

  • 현재는 MVC
  • 현재 방침을 검토 중
    • MVC
    • MVP
    • etc…

34p

  • View-Model
    • 기본적으로는 직접 참조하지 않는다
  • Model → Controller
    • 갱신 데이터
  • Controller → Model
    • 모델 조작
  • View → Controller
    • UI 이벤트
  • Controller → View
    • 갱신

35p

MVC

  • 장점
    • 일반적인 아키택쳐로서 널리 알려졌다
  • 단점
    • Activity/Fragment가 View와 Controller의 성질을 가지기 때문에, 견고하게 되기 쉽다

36p

MVP

  • View-Model
    • 기본적으로는 직접 참조하지 않는다
  • Model → Presenter
    • 갱신 데이터
  • Presenter → Model
    • 모델 조작
  • View → Presenter
    • UI 이벤트
  • Presenter → View
    • 갱신

37p

MVP

  • 장점
    • 직무의 분리
      • Activity/Fragment = View
      • Presenter = Controller
  • 단점
    • 클래스 수가 많아진다
    • 팀 개발이면 어느 정도 문서가 필요

38p

프론트엔드

  • 여러 가지 아키택처가 존재하지만, 아직 개인적으로 마음에 드는 것이 없다
  • 결국은 테스트를 적는 것이 목적이므로, 특정 아키택처에 구애될 필요는 없다
  • 백엔드를 간결하게 하는 것으로 프론트도 어느 정도 간결하게 되므로 테스트를 쓸 수 있을 것 같다

40p

테스트 방법

  • 유닛 테스트
    • 메소드 단위로 로직의 타당성을 테스트 하는 것
  • UI 테스트
    • UI 동작도 포함한 테스트하는 것

41p

테스트 프레임워크

  • 로직 테스트
    • JUnit4
  • UI 테스트
    • Espresso
    • Robolectric

42p

JUnit4

  • Testing Support Library
  • 유닛 테스트를 위한 프레임워크
  • 로직의 테스트만이라면 이걸로 충분

43p

Espresso

  • Testing Support Library
  • UI 동작도 포함한 테스트 작성을 할 수 있다
  • 실제 단말로 테스트 실행
  • 인간이 조작하는 것과 같은 시간이 걸린다

45p

Robolectric

  • UI 동작을 포함한 테스트 작성을 할 수 있다
  • 실제 단말이 요구되지 않는다
  • 공식적으로는 API 21까지만 서포트하고 있지만, API 23에서도 사용할 수 있다.

47p

샘플 구현

48p

Contributor

49p

GithubDatabase

50p ~ 56p

GithubNetwork

57p ~ 58p

GithubDatabase의 테스트

59p

TestSubscriber

  • RxJava 테스트용 클래스
  • 이벤트를 기록해주는 편리한 클래스
  • onNext(), onError(), onCompleted()에서 assert를 작성해도 괜찮지만,,,

60p ~ 61p

TestSubscriber

62p ~ 65p

GithubDatabase의 테스트

66p ~ 67p

GithubNetwork의 테스트

68p

MockWebServer

  • square/okhttp/mockwebserver
  • 이름대로 Web 서버의 Mock이 가능
  • 신뢰하는 Square 제품

69p ~ 72p

MockWebServer

73p

Mockito

74p ~ 78p

메소드 호출 확인

79p ~ 82p

메소드 반환값의 Mock

83p ~ 87p

GithubNetwork 테스트

89p

테스트를 작성하는 문화를 만들기 위해서

  • 주 1회 스터디를 개최
  • Android 팀은 10명
  • 테스트를 작성할 수 있는 환경을 만드는 것만으로는 불충분
  • 솔직히 이것이 가장 중요

90p

스터디

  • 아키택처에 대해서
  • 일반적인 테스트에 대해서
  • Android에서의 테스트에 대해서
  • 테스트 작성시의 Tips

91p

아키택처에 대해서

  • 새로운 아키택처의 개요
  • 새로운 라이브러리
    • Retrofit
    • OkHttp
    • RxJava
    • Gson

92p

일반적인 테스트에 대해서

  • 소프트웨어 테스트
  • 화이트/블랙박스 테스트
  • 동일값/경계값
  • 명령/분기/조건 다수

93p

Android에서의 테스트에 대해서

  • 테스트 프레임워크
    • JUnit4
    • Espresso
    • Robolectric

94p

테스트 작성시의 Tips

  • 테스트의 부작용
  • Obserable 테스트 방법
  • 비동기처리의 테스트

96p

정리

  • 테스트가 없으면 어떻게 괴로운가
    • 방대한 테스트 케이스로 인해 인적 자원 낭비나 예기치 못한 버그
    • 기회손실

97p

정리

  • Couples의 현재 설계
    • Activity/Fragment가 견고하다
    • 백엔드의 의존관계가 복잡

98p

정리

  • 테스트하기 쉬운 수준 높은 설계
    • UI는 빈번히 변경되므로, 우선은 백엔드부터 하자
    • 데이터 취득 로직을 Activity/Fragment로부터 분리
    • Android에 의존하지 않고 테스트할 수 있도록

99p

  • 테스트 방법
    • 유닛 테스트
    • UI 테스트
  • 테스트 프레임워크
    • JUnit4
    • Espresso
    • Robolectric

100p

정리

  • 샘플 어플에서의 테스트
    • Github의 Contributors를 표시
    • Database, Service의 테스트

101p

정리

  • 테스트를 작성하는 문화를 만들기 위해서
    • 주 1회로 스터디
    • 테스트를 작성할 수 있는 환경을 만드는 것만으로는 불충분하며, 이것이 가장 중요할지도

102p

마지막으로

  • 테스트가 목적이 되서는 안됨
  • 편하게하고 싶다
  • 엔지니어는 태만해져야 하며
  • 유익하게 업무시간을 쓰도록 된다면, 엔지니어도 사용자도 행복!

105p

보조자료

106p

ResponseUtil

107p ~ 108p

GithubRepository

comments powered by Disqus

Currnte Pages Tags

Android DroidKaigi Test

About

Pluu, Android Developer Blog Site

이전 블로그 링크 :네이버 블로그

Using Theme : SOLID SOLID Github

Social Links