한계효용의 법칙과 파레토 법칙
개발자가 좋아하기도 하지만 때로는 귀찮아하는 테스트에 대해 이야기해보겠습니다.
여기 공부를 잘하고 싶은 학생과 개발을 잘하고 싶은 개발자가 있습니다.
이 둘의 과정을 비교해볼까요?
학생은 문제를 풀고, 개발자는 새로운 기능을 개발합니다.
학생은 채점을 통해 틀린 문제를 확인하고, 개발자는 기능이 잘 작동하는지 확인하며 버그를 찾습니다.
학생은 틀린 문제를 보고 "다음엔 틀리지 않겠어!"라고 결심하지만 또 틀리고,
개발자는 버그를 수정하며 "다음엔 실수하지 않겠어!"라고 다짐하지만 또 실수를 합니다.
조금 더 나은 학생은 오답노트를 작성하지만, 다시 보지 않으면 의미가 없습니다.
하지만 개발자가 테스트 코드를 작성해 두면, 다시 확인하지 않아도 코드가 잘 작동하는지 자동으로 검증할 수 있습니다.
이처럼 테스트는 개발자의 실수를 줄이고 코드의 품질을 높이는 강력한 도구입니다.
테스트를 처음 접한 개발자들은 "내 코드의 버그를 자동으로 찾아주다니, 이걸 왜 안 만들겠어?"라며 흥미를 느낍니다.
특히, 테스트 주도 개발(TDD) 같은 개념은 테스트를 통해 더 나은 코드를 작성하는 데 도움을 줍니다.
그런데 왜 개발자들은 시간이 지나면서 테스트를 귀찮아하거나 싫어하게 될까요?
이 현상을 이해하려면 먼저 코드 커버리지라는 개념을 알아야 합니다.
코드 커버리지는 전체 코드 중 테스트로 검증된 부분의 비율을 의미합니다.
테스트가 충분히 작성되었는지 평가하는 대표적인 지표죠.
많은 매니저들이 코드 커버리지를 목표로 설정하며 개발자들에게 테스트를 작성하라고 요구합니다.
이제 다시 학생과 개발자의 사례로 돌아가, 테스트를 싫어하게 되는 이유를 살펴보겠습니다.
학생이 열심히 공부하고 있는데, 부모님이 "공부 좀 더 열심히 해라!"라고 잔소리를 하면 의욕이 꺾이죠.
마찬가지로 개발자가 테스트를 작성하고 있는데, 매니저가 "코드 커버리지를 80% 이상 달성하라"고 지시하면 부담을 느끼고 동기부여가 떨어집니다.
학생이 공부를 하다가 모르는 개념이 생겼는데 물어볼 사람이 없다면, 쌓이고 쌓여 결국 포기하게 됩니다.
개발자도 비슷합니다. 테스트를 작성하다 보면 "내가 제대로 작성하고 있는 걸까?"라는 의문이 생깁니다.
이때 도움을 받을 시니어 개발자가 없으면, 적당히 작성하고 넘어가게 됩니다.
결국 테스트는 점점 복잡해지고, 시간이 오래 걸리며, 점점 귀찮아지는 작업으로 느껴집니다.
코드 커버리지는 수치로 테스트의 양을 측정하는 데 유용합니다.
그러나 테스트는 단순히 커버리지를 높이는 작업이 아니라, 코드의 품질을 높이고 팀의 문화를 형성하는 데 그 목적이 있습니다.
효율적인 테스트를 위해 고려해야 할 요소는 다음과 같습니다.
테스트는 결과가 일관적이고 재현 가능해야 합니다.
동일한 테스트를 여러 번 실행했을 때, 항상 같은 결과가 나와야 개발자가 신뢰할 수 있습니다.
신뢰도가 낮은 테스트는 개발자가 테스트 결과를 믿지 못하게 만들고, 버그 수정에도 방해가 됩니다.
Production 환경에서 발생한 버그를 커버하는 테스트를 작성해야 합니다.
Production에서 발생한 버그는 매우 심각하며, 이를 다시 발생하지 않도록 예방하는 것이 테스트의 중요한 역할입니다.
이러한 테스트는 코드의 중요도를 파악하는 데도 도움이 됩니다.
새로운 기능이 추가되더라도 테스트 코드를 크게 수정하지 않아야 합니다.
비즈니스 요구사항에 초점을 맞춘 테스트는 유연성을 유지하면서도 유지보수 비용을 줄일 수 있습니다.
테스트는 팀의 모든 개발자가 참여해야 합니다.
특정 개발자에게만 테스트를 맡기기보다는, 팀원 전체가 테스트를 작성하고 학습할 수 있는 환경을 만들어야 합니다.
이렇게 해야 팀 전체의 역량이 향상되고, 테스트에 대한 책임감을 공유할 수 있습니다.
현실적으로는 코드 커버리지 목표를 설정해야 할 때도 있습니다.
그러나 무작정 높은 커버리지를 목표로 삼기보다는, 아래 원칙을 활용하는 것이 중요합니다.
모든 코드를 테스트하려는 시도는 효율이 떨어집니다.
중요한 코드, 즉 버그 가능성이 높거나 사용자와 밀접한 코드부터 테스트를 작성하세요.
이렇게 하면 제한된 리소스 안에서도 효과적인 품질 관리를 할 수 있습니다.
잘 설계된 테스트는 코드의 20%만 커버해도, 전체 버그의 80%를 탐지할 수 있습니다.
초기에는 중요한 코드의 100% 커버리지를 목표로 삼고, 이후 점진적으로 확장하는 방식이 효과적입니다.
테스트는 단순히 코드 검증을 위한 도구가 아닙니다.
테스트를 통해 팀의 문화와 개발 역량을 향상시키고, 코드의 품질을 유지하는 것이 진정한 목표입니다.
코드 커버리지는 테스트의 수준과 방향성을 점검하는 보조 지표일 뿐, 그 자체가 목표가 되어서는 안 됩니다.
테스트는 팀의 모든 개발자가 함께 참여하고, 효율적으로 작성하며, 코드의 중요한 부분을 중점적으로 다룰 때 진정으로 성공할 수 있습니다.
https://www.youtube.com/watch?v=MFa3seC3gOE