테스트란 무엇인가?

KimSeongHeon·2021년 8월 1일
1

Test Code

목록 보기
1/1

Android 개발 시, 테스트 코드의 필요성과 작성법에 대해 작성한 포스트 입니다.

테스트란?

테스트에서는 어떤 동작(메소드)을 호출했을 때, 이런 것들을 확인합니다.

1. 값이 원하는 형태가 되는가.
2. 원하는 동작을 연계해서 수행하는가.


테스트는 왜 작성해야하는가?

처음 공부할 때 이부분이 가장 의문이었습니다.
왜 테스트를 작성해야하지?🧐 테스트 코드를 작성하면 개발 리소스만 더 드는 것이 아닌가?
QA팀에서 해야할 일을 왜 개발팀에서 해야하는거지?

하지만 테스트 코드를 작성하면 다음과 같은 이점을 얻을 수 있습니다.

1. 개발 시간을 줄여준다.
테스트 코드를 작성하는 것은 분명 리소스가 드는 일입니다. 하지만 테스트 코드를 작성하게 되면 개발자가 코드 작성 후 직접 버튼을 하나 하나 클릭해서 테스트 해보는 것보다 훨씬 더 빠르게 실행 시켜볼 수 있습니다.

또한 다른 코드 작업으로 발생한 Side Effect를 좀 더 빠르게 찾을 수 있습니다. 이전 작성한 Unit Test가 제대로 동작한다면 신규 작업한 코드의 문제이므로, 신규 코드에 문제가 있구나! 하며 문제점을 빠르게 파악하고 대응할 수 있습니다.

2. Testable Architecture
테스트 코드 작성을 위해서는 Testable Architecture가 필수적입니다.
아키텍쳐 설계가 제대로 이루어지지 않는다면 테스트 코드 작성은 분명 어려워 질 것입니다.
테스트 코드 작성을 염두에 두고 Architecture를 설계한다면 이는 분명 좋은 Architecture가 될 것입니다.

좋은 Architecture란?

  • 높은 응집도
    비슷한 역할을 하는 메소드, 로직을 모아 놓는 것을 이야기 합니다.
  • 낮은 결합도
    요구사항이 변경되었을 때, 유연하게 대처할 수 있는 가를 이야기 합니다.
    즉 메소드 하나를 건드릴 때 다른 메소드에 영향을 미치게 된다면 이는 높은 결합도를 가진다고 이야기 합니다.

3. 코드 리뷰를 돕는다
테스트 코드는 A를 넣었을 때 B라는 값을 리턴한다. 라는 것을 리뷰어들에게 알려줍니다.
리뷰어들은 해당 내용을 보고 이 메소드는 어떤 기능을 하는 것이구나 쉽게 파악하고 질 좋은 코드리뷰를 할 수 있습니다.


테스트를 어렵게 하는 것

지금까지 테스트 코드를 작성하면 얻는 이점들에 대해 알아보았습니다. 작성의 필요성을 조금씩 느끼죠?
하지만 테스트 코드를 작성하는 것은 쉬운 일은 아닙니다. 안드로이드에서 테스트 코드 작성에 어려움을 주는 것들이 있는데요. 대표적인 두 가지만 소개해보겠습니다.

1. 의존 클래스

class UserListPresenter(repository: Repository, view:View) {    
    fun loadAllUserList() {
    	repository.loadAllUserList()
        		  .subscribe(
                  	{view.showUserList(it)},
                    	{it.printStackTrace()}
                    	)
     }
                     			
}
  • 해당 클래스에 대한 테스트를 진행할 때, 우리는 당연히 해당 클래스에 대한 객체를 생성해야 하며 인스턴스화 하여야 합니다.
  • 하지만 인스턴스화 할 시 View,Repository를 필요로 합니다.
  • 해당 구현체가 없으면 Presenter가 올바르게 동작하지 않습니다. 이 때 Presenter는 'view와 repository에 의존한다' 라고 말합니다
  • loadAllUserList 메소드를 호출했을 때, 정상적인 동작이 이루어지는지 테스트를 해보고 싶은데 repository와 view 구현내용을 모르기 때문에 제대로 된 테스트를 할 수 없습니다.

2.안드로이드 의존 동작

  • android.jar 파일 내부의 코드는 unit Test시 사용할 수 없습니다.
  • 즉 테스트하려는 코드에 안드로이드 라이브러리 내부 객체(Context, MainThreadLooper)등이 들어가 있으면 테스트가 불가합니다.

테스트의 원칙

테스트를 어렵게 만드는 것을 살펴보았는데요. 그럼 저런 어려움을 어떻게 해쳐나가야 하는 것일까요? 테스트 작성에 도움을 주는 원칙을 소개하겠습니다.

  • 의존성 객체는 주입 받는다(이전 예시에서 Repository, View와 같은)
  • 안드로이드 의존 동작(Andoird 내부 SDK(Context,View 등))은 Wrapping하여 주입받는다.
  • 모든 동작은 Presenter / ViewModel을 통하도록 한다.
    • 모든 비지니스로직은 ViewModel, Presenter에서 실행하도록 하면서 ViewModel, Presenter에 대한 UnitTest만을 진행하도록 한다.

마치며

이번 포스팅에서는 이런 것들을 살펴보았습니다.

  1. 테스트란 무엇인가
  2. 테스트는 왜 해야하는가
  3. 어떤 요소가 테스트를 어렵게 하는가
  4. 테스트를 쉽게 하는 원칙

그럼 테스트 코드는 구체적으로 어떻게 작성을 해야할까요?
아까 말했던 의존성 객체를 주입받는다? / Wrapping해서 주입한다는 말은 무슨 말일까요?
다음 포스팅에서 구체적인 테스트 코드 작성방법에 대해 알아보겠습니다.

감사합니다 😃

profile
Android Developer

0개의 댓글