UnitTest

Unit Test

강강강 2021. 7. 6. 08:45
  1. local unit test  - JVM only
  2. instrumented unit test - physical device , emulator 

 

#JUnit : Unit Test Framework 

 

#Mokito : Mock Object 구현 도와줌 mock: 실제 객체를 만들기에는 시간 비용 낭비, 의존성이 크게 걸쳐져 있어 테스트시 제대로 구현 어려워 가짜 객체 만들어 사용하는 것 

 

#Robolectric : 배포 설치가 필요없도록  내 PC 의 JVM에서 안드로이드 코드를 실행해줌 

#Hamcrest : Test Class에서 사용하는 assert() 같은 Matcher 을 확장한 라이브러리 

- JUnit의 assertEquals를 사용하는 대신 Hamcrest의 assertThat구조와 표준 matcher 세트를 사용(명확한 값을 비교하기 위해 사용 )

왜? 더 유연하기도 하고 assertThat 을 이용하면 expected 와 actual을 헷갈리지 않고 의미를 분명히 할 수 있음 

ex) assertThat(actual, is(expected))     // acual 이 expected 와 같다는 식으로 문장을 읽기도 함 

      assertThat(actual, is(not(expected)))

 

assertThat("", actual, matcher )     // matcher → anyOf( and 논리 연산자처럼 동작 ) allOf  ..

 

http://junit.sourceforge.net/javadoc/org/junit/Assert.html  // 이건 junit 의 assert 함수 모음 

 

#JUnit 

  • JUnit 을 이용한 테스팅은 aseertXXX 함수를 이용해 기댓값과 실제값을 비교해 테스팅 통과 여부를 정함 
  • JUnit annotation
    @BEFORE : 테스트 시작 전 
    @TEST : 하나의 단위테스트 만들기 
    @AFTER : 테스트 완료되고 
    @RunWith : 라이브러리 사용 

 

#테스트 함수 작성하기

1.Given : 실제 테스팅에 필요한 action 전의 객체를 만드는 등의 set-up 을 한다  

    ex) task 라는 list 를 만들어서 action 전의 set-up을 함 

2. When : 실제 테스팅 하려는 action을 진행 

    ex) 테스팅할 action인 함수를 호출해 시행

3.Then : assert 부분으로 앞의 Given과 When 으로 어떤 결과가 나올지 작성  ( assertEquals(expected, actual) 등 을  이용해 expected 값과 actual 값 비교 ) 

    ex) action 의 결과를 assert 로 검증 

 

val context = ApplicationProvider.getApplicationContext<Context>()

// application 클래스 가져오기 , 생성자의 파라미터 Application 을 넘겨 Task

 

 

=========안드로이드 Context =========

developer: App 환경에 대한 다양한 정보를 담고있는 인터페이스 / 어떤 Activity, application 인가에 대해서 구별하는 정보가 context

  1. Application context : 어플리케이션 자체와 연동되는 것 / 앱의 lifecycle 이 지속되는 동안 동일한 객체 (즉 어플리케이션을 종료 후 다시 실행시킬때만 바뀌는 것)  →  getApplicationContext()

         → 항상 application 생명주기와 함께 한다.  // 현재 activity의 context 뿐만 아니라 application의 lifeCycle에 해당하는 Context가 사용된다.

  1. Activity context : 액티비티와 연동된 것으로 그 액티비티를 파괴 시키고 다시 시작 시키면 activity context 도 바뀜   → this 
    → Activity 가 destroy() 된 경우 사라질 수 있는 객체 /  Context에 Intent를 통해 다른 activity를 띄우면 activity stack 이 쌓이게 된다. 

============코틀린 람다식====================

** 함수는 변수에 할당될 수 있다. **

함수를 정의하면서 즉시 변수에 할당하면 변수 이름만 있어도 되기 때문에 함수에는 이름을 붙이지 않아도 된다.