안드로이드 스튜디오를 사용하다 보면 이런 화면을 본 적이 있을 겁니다. 이곳은 단위테스를 하는 공간입니다. 그렇다면 단위테스트는 또 무엇일까요? 이번 포스팅에서는 단위테스트 무엇인지 단위테스트를 왜 써야 하는지를 알아보도록 합시다.
단위 테스트(Unit Test)는뭐지?
단위 테스트는 일반적으로 응용 프로그램에서 테스트 가능한 가장 작은 소프트웨어를 실행하여 예상대로 동작하는지 확인하는 테스트입니다. 즉 기능들의 잘 동작하는지 확인하는 작업이라고 생각하면 됩니다. 안드로이드 스튜디오 환경에서는 프로젝트생성 시 단위테스트를 할 수 있는 공간들을 자동으로 만들어 줍니다. 이 공간에서 기능들이 잘 작동하는지 테스트를 할 수 있습니다. 또한 코틀린에서는 @Test라는 어노테이션을 이용하여 해당함수가 단위테스트용 함수라는 것을 컴파일러에게 알려 줄 수 있습니다.
단위테스트에서는 이런 내용들을 확인할 수 있습니다.
- 일반적인 유스 케이스(happy path) : 요소가 사용될 거라 예상되는 일반적인 방법을 테스트합니다. (간단한 숫자 몇 개를 테스트
- 일반적인 오류 케이스와 잠재적인 문제 : 제대로 동작하지 않을 거라고 예상되는 일반적인 부분, 과거에 문제가 있었던 부분 등을 테스트합니다
- 엣지 케이스와 잘못된 아규먼트 : Int의 경우 Int.MAX_VALUE를 사용하는 경우, nullable의 경우 null 또는 null값으로 채워진 객체를 쓰는 경우를 의미합니다.
단위 테스트는 왜써야 할까?
여기서 드는 의문은 main에서 돌려도 되고 디버깅을 따로 돌려도 되는데 굳이 단위테스트를 써야 할 이유가 있을까라는 생각이 들기 시작합니다. 책에서는 다양한 종류의 테스트를 하는 것이 중요하다고 합니다. 개발자의 관점으로 보았을 때 내부적으로 올바르게 작동하는지를 확인하는 게 아니라 사용자관점에서 외부적인 여러 피드백을 받는 것도 좋지만 이걸로는 앱이 올바르게 작동한다는 것을 확신할 수는 없습니다. 이런 문제를 해결하는데 단위테스트 유용하다고 합니다. 단위 테스트는 개발자가 만들고 있는 요소가 제대로 동작하는지를 빠르게 피드백해 주므로 개발하는 동안 큰 도움이 됩니다. 테스트는 계속 축적되므로 회귀 테스트도 쉽습니다. 또한 수동 테스트하기 어려운 것들도 확인할 수 있습니다.
이러한 단위테스트 방식에는 TDD 접근방식도 있습니다. TDD는 개발 전에 테스트를 먼저 작성하고 테스트를 통과시키는 걸 목적으로 하나하나 구현해 가는 방식입니다. 이방식은 나중에 더 자세히 알아보도록 합시다.
장점
- 테스트가 잘 된 요소는 신뢰할 수 있다. 요소를 신뢰할 수 있으므로 요소를 활용한 작업에 자신감이 생긴다
- 테스트가 잘 만들어져 있다면 리팩터링 하는 게 두렵지 않다. 테스트가 있으므로 리팩터링 했을 때 버그가 생기는지 쉽게 확인할 수 있다. 따라서 테스트를 잘 만든 프로그램은 코드가 점점 발전한다. 반면 테스트가 없으면 실수로 오류를 일으킬 수도 있다는 생각에 레거시 코드를 수정하려고 만지는 걸 두려워하게 된다
- 수동 테스트하는 것보다 단위 테스트로 확인하는 게 빠르다. 빠른 속도의 피드백 루프가 만들어지므로 개발의 전체적인 속도가 빨라지고 재밌다. 버그를 빨리 찾을 수 있어 버그 수정 비용도 줄어든다
단점
- 단위 테스트를 만드는 데 시간이 걸린다. 다만 장기적으로 좋은 단위 테스트는 디버깅 시간과 버그를 찾는 데 소모되는 시간을 줄여준다. 또한 단위 테스트가 수동 테스트 또는 다른 종류의 테스트보다 훨씬 빨라서 시간이 절약된다
- 테스트를 활용할 수 있게 코드를 조정해야 한다. 변경하기 어렵지만 이런 변경을 통해서 잘 정립된 아키텍처를 쓰는 게 강제된다
- 좋은 단위 테스트를 만드는 작업이 꽤 어렵다. 남은 개발 과정에 대한 확실한 이해가 필요하다. 잘못 만들어진 단위 테스트는 득 보다 실이 크다. 단위 테스트를 제대로 하려면 올바르게 단위 테스트를 하는 방법을 배워야 한다. 소프트웨어 테스팅 또는 TDD 관련 내용을 이해해야 한다
이처럼 단위테스트에는 장점과 단점이 있습니다. 그렇지만 이러한 단점들도 결국은 안정성과 비교해 보면 단점 축에도 들지 않을 것입니다.
- 복잡한 부분
- 계속 수정이 일어나고 리팩터링이 일어날 수 있는 부분
- 비즈니스 로직 부분
- 공용 API 부분
- 문제가 자주 발생하는 부분
- 수정해야 하는 프로덕션 환경에서의 버그
또한 이러한 중요한 부분에 있어 단위테스트를 한다면 앱의 안정성이 더욱 커질 것입니다.
결과적으로 코드를 더 안전하게 효율적으로 작성하기 위해서는 이러한 단위테스트가 큰 도움이 됩니다.
'코틀린 > Effective Kotlin' 카테고리의 다른 글
[Effective Kotlin] 11. 가독성 - 가독성을 목표로 설계하라 (0) | 2023.08.09 |
---|---|
[Effective Kotlin] 안정성파트를 끝내며 (0) | 2023.08.03 |
[Effective Kotlin] 9. 안정성 - use를 사용하여 리소스를 닫아라 (0) | 2023.08.01 |
[Effective Kotlin] 8. 안정성 - 적절하게 null을 처리하라 (0) | 2023.07.28 |
[Effective Kotlin] 7. 안정성 - 결과 부족이 발생할 경우 null과 Failure를 사용하라 (0) | 2023.07.24 |