ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Tests App on Android(1)
    Android 2021. 6. 28. 17:54

    테스트를 하는 이유

    • 장애에 관한 신속한 피드백
    • 개발 주기에서 조기 장애 감지
    • 코드를 최적화할 수 있도록 하는 더 안전한 Code Refactoring
    • 기술적 문제를 최소화하는 안정적인 개발 속도

     

     

     

    반복적인 테스트 주도 개발과 관련된 두 사이클

    안드로이드 테스트 종류

    Unit Test

    - 일반적으로 코드의 유닛 단위(메소드, 클래스, 컴포넌트)의 기능을 실행하는 방식

    - JVM 상에서 실행되는 local unit tests

    - 실제 기기 및 에뮬레이터에서 실행되는 instrumented unit tests

     

    Integration Tests

    - 단위 테스트가 완료된 모듈들을 합쳐서 하는 테스트

    - 앱에서 데이터가 가공되는 로직 테스트

     

    UI Tests

    - 사용자 인터랙션(버튼 클릭, 텍스트 입력 등) 테스트

    - 단일 앱 UI tests

    - 멀티 앱 UI tests (예 : 카메라 앱이 타사 소셜 미디어 앱과 이미지를 공유하는 테스트)

    Levels of the Testing Pyramid

     

    Small Test

    - 각 컴포넌트 및 기능 단위의 동작을 검증

     

    Medium Test

    - 각 모듈 간의 상호작용을 검증하는 통합 테스트

     

    Large Test

    - 실제 유저가 보는 화면을 기준으로, emulator나 실제 Device에서 예상대로 작동하는지 확인하는 테스트

     

    일반적으로 Small 70%, Medium 20%, Large 10% 비율로 테스트 추천한다.

    Android Unit Tests

    Local unit tests

    - module-name/src/test/java/ 에 테스트 파일 저장

    - 컴퓨터의 로컬 JVM(Java Virtual Machine)에서 실행되는 테스트

    - 안드로이드 프레임워크 종속성이 없거나 모의 객체를 생성할 수 있는 경우 사용

     

    Instrumented tests

    - module-name/src/androidTest/java/ 에 테스트 파일 저장

    - 안드로이드 기기나 에뮬레이터에서 실행되는 테스트

    - 사용자 상호작용을 자동화하는 통합 및 기능적 UI 테스트를 작성하거나 테스트에 모의 객체가 충족할 수 없는 Android 종속성이 있는 경우 사용

    Android Unit Tests framework

    Junit

    - Java Unit Test Framework

    - 어노테이션(Annotation) 지원

    - 단정문으로 테스트 케이스의 수행 결과를 판별함 Ex) assertEquals(예상 값, 실제 값)

    - 결과는 성공(녹색), 실패(붉은색)으로 표시

     

    Mockito

    - Java에서 단위 테스트를 하기 위해 Mock(가짜 객체)를 만들어주는 Framework

    - Junit과 함께 Unit test를 작성하는데 사용

     

    Roboletric

    - android sdk가 제공하는 클래스에 가짜 동작을 심어서 JVM에서 android 코드를 실행하는 Framework

    - View객체를 별도의 mock(가짜 객체) 없이 그대로 사용가능

    주요 Annotation

    @Before, @After가 메소드 위에 선언되면 
    해당 테스트 클래스 안에 메소드들이 테스트(@Test) 되기 전과 후에 각각 실행되게 지정하는 어노테이션이다.

     

    @Test가 메소드 위에 선언되면 이 메소드는 테스트 대상 메소드임을 의미한다.

     

    @Test(timeout=5000)를 메소드 위에 선언합니다. 시간단위는 밀리 초 입니다. 
    이 테스트 메소드가 결과를 반환하는데 5,000밀리 초를 넘긴다면 이 테스트는 실패하는 것이다.

     

    @Test(expected=RuntimeException.class)가 메소드 위에 선언되면 
    이 테스트 메소드는 RuntimeException이 발생해야 테스트가 성공, 그렇지 않으면 실패하는 것이다.

     

    @BeforeClass, @AfterClass가 메소드 위에 선언되면 
    해당 테스트 클래스에서 딱 한 번씩만 수행되도록 지정하는 어노테이션이다.

    단정문

    assertArrayEquals(a,b) : 배열 a와b가 일치함을 확인 
    assertEquals(a,b) : 객체 a와b의 값이 같은지 확인 
    assertSame(a,b) : 객체 a와b가 같은 객체임을 확인 
    assertTrue(a) : a가 참인지 확인 
    assertNotNull(a) : a객체가 null이 아님을 확인 

    이외에도 다양한 단정문이 존재한다. 

    References

    'Android' 카테고리의 다른 글

    ViewPager2  (0) 2021.07.10
    Tests App on Android(2) - Robolectric  (0) 2021.07.01
    Room Database  (0) 2021.06.14
    ConstraintLayout(2)  (0) 2021.06.13
    ConstraintLayout(1)  (0) 2021.06.11
Designed by Tistory.