테스트 코드 작성 이유

송준섭 Junseop Song·2023년 11월 10일

📑 Reference

테스트 코드는 왜 만들까? | 요즘IT

🏭 테스트 코드란

테스트 코드란 소프트웨어의 기능과 동작을 테스트하는 데 사용되는 코드
소프트웨어의 결함을 찾아내고 수정하는 과정에 도움을 줌
특정 입력값에 대하여 기대한 출력값을 반환하는지 확인

일반적으로 각 단계의 테스트 코드는 V 모델을 통해 살펴볼 수 있음
V 모델은 소프트웨어 개발 생명 주기 중 하나로, 시스템 개발 과정을 시각화한 모델

테스트 코드에는 여러 종류가 존재

  • 단위 테스트 (Unit Testing)
  • 통합 테스트 (Integration Testing)
  • 시스템 테스트 (System Testing)
  • 사용자 인수 테스트 (User Acceptance Testing)
  • ,,

단위 테스트

소프트 웨어 개발에서 개별적인 코드 단위(보통 함수, 메서드)가 의도한 대로 작동하는지 확인
소프트웨어의 개별 코드 단위를 테스트하여 오류를 발견하고, 이를 수정하여 전체적인 소프트웨어의 품질을 향상
테스트 케이스를 작성하여 각각의 코드 단위가 입력에 대하여 정확한 출력값을 반환하는지 확인

단위 테스트 작성을 위해서 다양한 라이브러리, 프레임워크 들이 존재
ex) Node.js Jest, Java Junit, ,,,


통합 테스트

서로 다른 모듈들 간의 상호작용을 테스트하는 과정
예를 들어, 신규로 개발한 API 서버 내의 DB 호출 함수가 데이터베이스의 데이터를 잘 호출하고 있는지 테스트하는 과정은 통합 테스트

보통 모듈 간 인터페이스 테스트, 시스템 레벨 테스트 등의 방법으로 수행
여러 개의 모듈이 연결된 백엔드 API 웹 애플리케이션의 경우 서로 다른 모듈들 간의 상호작용을 테스트하기 위해 각 모듈 단위 테스트를 모두 완료한 뒤, 둘 이상의 모듈을 거쳐서 동작하는 API 테스트 시나리오를 기반으로 통합 테스트를 진행할 수 있음
여기서 말하는 모듈에는 웹 서버, WAS, DBMS, 메시지 브로커(Message Broker), 파일 서버(File Server) 등이 될 수 있음

모듈 간의 상호작용을 테스트하기 때문에 각기 다른 모듈의 설정 방법을 알아야 하고, 테스트를 다시 수행할 수 있는 깨끗한 환경으로 되돌려놔야 하는 경우도 있어 작성하기 어려울 수 있음
테스트에 영향을 끼치는 요인이 데이터와 로직 뿐 아니라 통신 구간이나 해당 모듈의 환경 설정 정보 등 많음

통합 테스트를 GUI 환경에서 사용할 수 있는 도구로 Selenium, Postman, Apache JMeter 등이 있음
앞서 말한 Junit, Jest 등 테스트 라이브러리를 이용해서 코드 기반으로 작성하는 것도 가능

❓ 테스트 코드를 작성해야 하는 이유

  • 내가 무엇을 만들고 있는지 정확히 인지
    테스트 코드 작성을 통해 요구사항의 기능적인 항목들을 정리하고, 코너 케이스를 찾게되며, 문서의 역할을 수행하기도 함
  • 리팩토링을 진행할 때 부담 덜어주기
    코드 수정 후에도 기능이 정상적으로 작동하는지 빠르게 검증이 가능
    프로젝트의 규모가 커질 수록 기억이 나지 않는 코드이거나 다른 사람의 코드를 수정하는 일이 발생할 확률이 높음
    이럴 때 테스트 코드가 있다면 수정 후에도 기능이 요구사항에 맞게 작동하는지 확인할 수 있음
  • 결합도와 의존성이 낮은 코드를 지향
    의존성이 높은 부분을 개선하면 프로젝트의 코드 품질이 향상되고 개발자로서의 경험을 쌓을 수 있음

    • 결합도(Coupling): 시스템 내의 두 모듈 간에 얼마나 강하게 연결되어 있는지. 높은 결합도는 한 모듈의 변경이 다른 모듈에 큰 영향을 미칠 가능성이 높다는 것을 의미하며, 낮은 결합도는 모듈 간의 독립성이 높다는 것을 나타냄.
    • 의존성(Dependency): 한 모듈이 다른 모듈에 얼마나 의존하고 있는지. 모듈 간의 의존성이 높으면, 하나의 모듈을 변경할 때 다른 모듈도 영향을 받을 가능성이 높다는 것을 나타냄.

테스트 코드의 작성은 결합도와 의존성을 낮추는 데 도움이 됨
테스트 코드를 작성하면서 모듈을 독립적으로 테스트할 수 있기 때문에, 각 모듈이 기대한 대로 작동하는지 확인
결합도와 의존성을 낮추면 코드의 유지보수성이 향상되고, 변경이 더 쉬워지며, 테스트 작성 및 유지보수가 더 효율적으로 이루어짐

장/단점 요약

  • 장점
    • 코드 품질 향상: 버그 확인
    • 회귀 테스트: 코드 수정 후 빠른 기능 작동 검증
    • 문서화: 기능 동작 방식 이해를 도움
    • 리팩토링 지원: 코드 수정 및 변경에 대한 두려움 감소
  • 단점
    • 개발 시간 증가: 테스트 코드 작성 자체로 초기 개발 시간이 많이 소요될 가능성 있음
    • 불오나전한 테스트: 모든 시나리오를 고려하는 테스트 코드를 작성하는 것의 어려움
    • 오버 엔지니어링: 테스트 코드 작성에 비효율적으로 과한 시간과 노력을 투자할 때
    • 유지 보수 비용: 소프트웨어 기능 변경 및 확장시 테스트 코드 역시 유지 보수
    • 학습 곡선: 테스트 프레임워크 및 테스트 작성 방법에 대한 학습 시간 필요

하지만 단점보다 장점이 더 크게 작용한다고 생각이 됨
시스템을 유지 보수하는데 드는 전체 시간과 노력을 고려하면 테스트 코드 작성에 소요되는 시간과 노력의 비중은 비교적 적음

0개의 댓글