반응형
GDG devcamp 2016 : 김종찬 발표자
Develop Testing
Go language
안드로이드에 MVP 패턴을 사용하는 이유 : 개발한 기능들을 테스팅하기 위함
개발자의 테스트란 : 객체에서 일어날 수 있는 상황 가정, 테스트 로직을 만들어서 코드로 구현
유닛 테스트 = 코드를 짜서 확인하는 것
유닛 테스트에서 Mock이라는 것이 중요함 = 외부 의존성의 상태에 상관없이 테스트해야 할 대상에 집중 가능
유닛 테스트 코드를 짜는 것이 옳은 것일까?
매번 빌드시마다 작성된 테스트들을 자동으로 수행
수정한 기능으로 인해 다른 영역에 결함이 생기지 않았는지 확인
ATSL : 구글에서 제공하는 테스팅 라이브러리
구글이 직접 안드로이드 테스팅 라이브러리를 제공함
AndroidJunitRunner (유닛테스트) / UI 테스팅 툴 Escpresso (UI 테스트) / UI Automator (랜덤하게 눌러보면서 테스트)
기존의 유닛테스팅 뿐만 아니라 UI 테스팅을 위한 툴까지 공개함
이 세션에서는 유닛 테스트만 다뤄봄
ProjectFolder/app/src
- AndroidTest (Espresso Testing) : UI 테스팅 Espresso 라이브러리를 이용한 테스팅 코드의 집합
- test(Unit Testing) : Unit 테스팅을 위해 mockito와 JUnit을 이용하여 작성하는 테스팅 코드의 집합
- androidTestMock : ex. 서버가 없는데 서버에 리퀘스트 하는 작업있을 때
폴더들의 내부 디렉토리를 똑같아야 함
Mockito 알아보기 - 자주 사용하는 기능들
@Mock
private NotesRepository mNotesRepository; @Mock private ImageFile mImageFile; @Mock private AddNoteContract.View mAddNoteView; private AddNotePresenter mAddNotesPresenter; @Before public void setupAddNotePresenter() { // Mockito has a very convenient way to inject mocks by using the @Mock annotation. To // inject the mocks in the test the initMocks method needs to be called. MockitoAnnotations.initMocks(this); // Get a reference to the class under test mAddNotesPresenter = new AddNotePresenter(mNotesRepository, mAddNoteView, mImageFile); } |
MockitoAnnotations.initMock(this)는
@Mock 어노테이션이 붙은 인스턴스들을 Mock 객체로 만들어냄
@Mock 이 안붙은 것은 이것 자체일 때
@Before 테스트를 위한 사전 준비
Test method 명은 상세하게 써줌
imageAvailable_SavesImageAndUpdatesUiWithThumbnail : 관심있는 것은 imageAvailable, 그에 따른 상황은 SavesImageAndUpdatesUiWithThumbnail
@Test
public void imageAvailable_SavesImageAndUpdatesUiWithThumbnail() { // Given an a stubbed image file String imageUrl = "path/to/file"; when(mImageFile.exists()).thenReturn(true); when(mImageFile.getPath()).thenReturn(imageUrl); // When an image is made available to the presenter mAddNotesPresenter.imageAvailable(); // Then the preview image of the stubbed image is shown in the UI verify(mAddNoteView).showImagePreview(contains(imageUrl)); } |
@Test 이 메소드가 테스트할 대상이라는 것을 알려줌
when() : Mock 객체
verify() : 맨 마지막에 검증
contains(“문자열”)
anyString
any(class) :
eq(“문자열”) :
테스트 코드 작성 흐름 알기
@Override
public void imageAvailable() { if (mImageFile.exists()) { mAddNoteView.showImagePreview(mImageFile.getPath()); } else { imageCaptureFailed(); } }
|
Travis CI : 빌드 서버가 테스트 서버가 발견되면 알려줌
협업할 때 필요
질문
테스트 코드가 acitivty가 매번 다시 켜지면서 테스팅 되는지
한번의 테스트 메소드에서는 한번의 verify만 가능한지 - 여러번의 verify가 가능 하지만 전부다 합격해야 통과됨
반응형