모락 프로젝트를 진행하면서 제일 많이 고민했던 것은 테스트 코드이다.
따라서 테스트 코드에 대해서 내가 느낀 생각들에 대해서 정리해보려고 한다.
테스트 코드는 왜 작성해야 할까?
프로젝트를 하면서 제일 크게 느낀 것은 테스트 코드는 서비스의 품질을 보장한다.
테스트 코드를 이용하여 서비스에서 발생할 수 있는 에러를 미리 방지할 수 있다.
일단 우테코를 진행하면서, 테스트 코드를 작성하지 않는 것을 생각해본 적이 없다.
테스트 코드는 서비스에 생기는 에러를 미리 확인할 수 있게 해 준다. 테스트 코드가 작성되지 않은 서비스가 존재한다고 가정한다면, 개발자는 서비스를 배포하고나서야 서비스에 생기는 에러를 직면할 수 있다. 이러한 상황을 피하고자 우리는 테스트 코드를 작성해야 한다.
그렇다면 테스트 코드는 얼마나 작성해야 할까?
모락 프로젝트에서는 초반에 시간이 촉박하다는 이유로 테스트 코드를 많이 작성하지 않았다.
특정 요청을 보냈을 때 정상적인 응답을 받을 수 있다
정도의 테스트 코드만 작성하였다.
정상 요청에 대한 정상 응답에 대해서만 테스트하였기 때문에 비정상 요청에 대해서는 대응할 방법이 부족했다.
이러한 테스트 코드의 결과로 상당히 많은 부분에서 서비스가 의도대로 동작하지 않게 되었다.
사실 테스트 코드에서 중요한 것은 예외 상황을 발견하고 방어 로직을 구현하는 것이다.
그렇다면 테스트 코드를 많이 작성할수록 서비스의 품질이 좋아질까? 이에 대한 나의 대답은 Yes이다.
다양한 상황에 대한 테스트를 많이 작성할수록 다양한 예외 상황을 발견하게 되고, 이로 인해 서비스의 품질이 좋아진다고 생각한다.
그러나 우리의 프로젝트의 초반 모습처럼 테스트 코드를 작성할 시간이 부족하다면 어떻게 해야 할까?
프로젝트 기간 동안 이 부분에 대해서 제일 많은 고민을 하였다.
고민의 결과는 다음과 같다.
테스트 코드는 구현의 보조적인 수단이 아니며, 같은 레벨로 봐야 한다.
1. 테스트하기 좋은 코드 - 테스트하기 어려운 코드 라는 글에서 다음과 같은 내용을 확인하였다.
이 내용을 보고 테스트 코드는 프로덕션 코드와 마찬가지로 서비스의 일부라고 생각이 들었다.
기능 구현을 모두 완료하였지만 예외가 발생해서 제대로 동작하지 않는다면 누가 그 서비스를 사용하고 싶을까? 결국 테스트를 제대로 해보지 않은 서비스는 사용되지 않을 서비스가 될 것이다.
따라서 테스트 코드와 프로덕션 코드는 똑같이 중요하다!
결론적으로 테스트 코드를 작성할 시간이 없다는 것은 서비스를 만들 시간이 없다는 것이다!라고 생각하기로 했다.
그렇다면 테스트 코드를 어떻게 작성해야 할까?
프로젝트에서 부실한 테스트 코드로 인해 내가 쓴 프로덕션 코드를 불신하는 상황이 발생했었다.
이로 인해 테스트 코드를 효과적으로 작성하기 위한 나만의 방법을 생각해보았다.
1. 라인 커버리지 100%를 지향한다.
물론 지향이다. 100%를 맞추는 것은 개발을 진행하면서 매우 어려운 일이라고 생각한다.
토스ㅣSLASH 21 - 테스트 커버리지 100% 이 영상을 보고 테스트 커버리지가 100%를 지향해야겠다고 생각이 들었다.
영상에서 나온 이점을 정리해보면 다음과 같다.
테스트 커버리지 100%를 이룰 경우 내 코드에 대해 불신하는 상황을 크게 방지할 수 있다.
또한 테스트를 작성하면서 프로덕션 코드에 대한 이해도 올라간다.
2. 응답되는 객체를 확인할 때는 모든 필드를 확인한다.
응답되는 객체의 모든 필드에 대해 검증을 하는 것이 오버하는 것이라고 생각이 들 수도 있다. 실제로 함께 프로젝트를 진행하는 팀원들의 리뷰에서 찾아볼 수 있었다. 모든 필드를 검증하는 것보다는 유니크한 값을 가진 특정 필드만 검사하여도 되지 않을까?라는 리뷰를 받아보았다. 팀원의 의견도 맞는 말이라고 생각한다. 하지만 내가 작성한 테스트 코드를 더 신뢰하기 위해서는 모든 필드를 확인해야 한다고 생각한다. 테스트 코드와 프로덕션 코드를 동일 레벨로 보기로 했으므로, 테스트 코드도 확실하고 꼼꼼해야 한다.
3. 테스트하지 못한 코드는 없어야 한다.
테스트를 진행해보지 않았다는 것은 어떤 예외가 발생할 지 모르는 코드라는 것이다.
모락 프로젝트에서는 시간에 관련된 테스트를 진행할 수 없었다. 시간에 대한 로직이 존재했지만, 테스트를 진행할 수 없는 구조이기 때문에 테스트할 수 없었다. 우리는 시간에 관련한 기능에 대해 어떤 예외가 발생할 지 아직 모른다. 이러한 불안감을 가지고 서비스를 진행하는 것이 과연 맞을까? 라는 생각이 든다. 그리고 추후에 예외가 발생한다면 어떻게 대처할 것인가? 이러한 이유로 테스트는 꼭 진행해야한다.
그리고 테스트할 수 없는 구조가 존재한다면, 테스트할 수 있는 구조로 변경해야한다. 테스트 코드는 필수이다.
테스트 하기 좋은 코드를 구현하기 위해서는 위에서 보았던 1. 테스트하기 좋은 코드 - 테스트하기 어려운 코드에서 확인할 수 있다.
'우아한테크코스 > 공부' 카테고리의 다른 글
스프링 MVC 구조 파악하기 (5) | 2022.06.01 |
---|---|
빈 스코프 - prototype (1) | 2022.05.26 |
적시에 방어적 복사본을 만들라 (0) | 2022.04.04 |
제네릭과 가변인수를 함께 쓸 때는 신중하라 (0) | 2022.04.01 |
태그 달린 클래스보다는 클래스 계층구조를 활용하라 (0) | 2022.03.29 |
댓글