소프트웨어의 기능과 동작을 테스트하는데 사용되는 코드이며 결함을 찾아내고 수정하는 과정에서 매우 중요하게 사용된다 개발자가 작성한 코드를 실행하고 예상되는 결과가 나오는지 확인할때 사용한다
단위 테스트(Unit Testing)
통합 테스트(Integration Testing)
시스템 테스트(System Testing)
사용자 인수 테스트(User Acceptance Testing)
등 다양한 종류가 있으며 각각 테스트는 특정한 측면에서 소프트웨어를 평가한다
모든 테스트는 입력값과 출력값을 예상한 값을 반환하는지 확인하며 구분 이유는 단지 테스트 대상 범위가 다르기 때문이다
가장 일반적으로 사용하는 테스트 중 하나로 개별적인 코드 단위 보통(함수, 메서드)가 의도한 대로 작동하는지 확인 테스트이다
테스트 코드을 실행 하였을때 예상했던 반환 값이 나오면 성공 다르다면 실패이다
서로 다른 모듈들 간의 상호작용을 테스트하는 과정이다
예를 들어 신규 개발한 API 서버 내의 DB 호출 함수가 데이터베이스의 데이터를 잘 호출하고 있는지 테스트하는 과정이라고 생각하면 된다
보통 인터페이스 테스트, 시스템 레벨 테스트 등의 방법으로 수행된다 여러 개의 모듈이 연결된 백엔드 API 웹 애플리케이션의 경우
각 모듈 단위 테스트를 모두 완료한 뒤, 둘 이상의 모듈을 거쳐서 동작하는 API 테스트 시나리오를 기반으로 수행할 수 있다
(웹 서버, WAS, DBMS, 메세지 브로커, 파일서버)등이 있다
유닛보다 더 어렵긴 하지만 그만큼 시스템의 신뢰성과 안정성을 높일 수 있다
● 내가 무엇을 만들고 있는지 정확히 인지
● 리팩토링을 진행할 때 부담 덜어주기
테스트 코드가 있으면 수정 후에도 기능이 정상적으로 작동하는지 검증할 수 있어, 불안감에서 벗어날 수 있다
● 결합도와 의존성이 낮은 코드를 지향
테스트 코드 작성을 통해 의존성이 높은 부분을 개선하면 프로젝트의 코드 품질이 향상되고 좋은 경험들이 쌓인다
● 코드 품질 향상
테스트 코드를 통해 버그를 사전에 찾아내고 수정할 수 있어 신뢰있는 코드 작성을 도와줌
● 회귀 테스트
코드 변경이나 업데이트 시 기존 기능이 올바른지 작동 확인이 가능하며 이로인해 의도치 않은 버그를 빠르게 발견해 수정이 가능
● 문서화
기능 동작 방식을 이해하는데 도움이 되는 문서로 작용할 수 있다
● 리팩토링 지원
테스트 코드가 존재하면 코드 수정이나 구조 변경에 대한 두려움을 줄일 수 있고 리팩토링 후 기능 정상작동 확인이 가능
● 개발 시간 증가
개발 시간이 증가하면 개발 초기 비용이 증가하는 요인이 될 수 있으나 장기적으로는 버그나 수정 및 유지 보수 비용을 절감할 수도 있다
● 불완전한 테스트
모든 시나리오를 고려해 작성하기 어려우며 일부 버그가 테스트를 통과할 수 있다
● 오버 엔지니어링
테스트 코드에 과도한 시간을 투자하게 되면 오버엔지니어링으로 개발 속도가 저하 될 수 있다
● 유지 보수 비용
테스트 코드 역시 기능이 변경되거나 확장될 때마다 유지보수가 필요하기 때문에 추가적인 비용이 발생 가능하다
테스트 코드를 통해 모든 버그를 방지할 수 있는건 아니다 그저 도움을 받는거 일뿐 과도한 직찹은 오히려 프로젝트 진행과 품질에 더 안 좋은 영향을 미칠 수 있다
더 나은 개발자가 되기 위한 좋은 습관으로 생각하자