Programming

[GDG DevCamp 2016] Unit Test : ATSL을 이용한 유닛테스팅

 2016. 8. 20. 13:19
반응형

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(mNotesRepositorymAddNoteViewmImageFile);
}


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가 가능 하지만 전부다 합격해야 통과됨


반응형