📖 테스트란
소프트웨어 테스트란 개발한 소프트웨어의 기능 및 동작을 검증하여 결함을 찾아내고 수정하는 과정입니다.
이때 테스트를 위해 작성하는 코드가 테스트 코드이고, 테스트 코드를 수행함으로써 개발자가 예상한 결과가 나오는지 확인합니다.
대표적인 테스트의 종류는 다음과 같습니다.
- 정적 테스트(static test): 코드를 실행하지 않고 테스트합니다. 기능이 구현되기 전과 같이 개발 프로세스 초기에 결함을 발견하기 위한 목적으로 수행합니다. 타입스크립트로 함수의 파라미터 타입을 검사하는 것도 정적 테스트에 해당합니다.
- 단위 테스트(unit test): 개별적인 코드 단위가 의도한 대로 동작하는지 테스트합니다. 보통 함수나 메서드가 알맞은 입력값과 출력값을 반환하는지 확인합니다. 그 밖에도 유틸성 함수, 커스텀 훅 또는 외부 의존성이 없는 컴포넌트 등을 테스트합니다.
- 통합 테스트(integration test): 서로 다른 모듈들 간의 상호작용이 의도한 대로 이루어지는지 테스트합니다. 보통 UI와 유저가 발생시키는 이벤트 사이의 상호작용이 잘 일어나는지 또는 상태 변화에 따른 UI 변경이 잘 일어나는지 확인합니다.
- E2E 테스트(end to end test): 애플리케이션의 흐름을 처음부터 끝까지 사용자의 입장에서 테스트합니다. 브라우저 환경에서 테스트를 수행하기 때문에 실제 상황에서 발생할 수 있는 오류를 검출해 낼 수 있습니다.
📖 테스트 코드 작성의 장단점
개발하면서 테스트 코드를 작성하는 것의 장점은 다음과 같습니다.
- 코드 품질 향상: 테스트를 염두해두고 코드를 작성하면, 예상되는 동작과 시나리오를 미리 생각하여 버그를 사전에 방지하고 더욱 꼼꼼한 예외 처리를 수행합니다. 따라서 코드의 견고성과 일관성이 높아지게 됩니다.
- 빠른 피드백: 코드가 변경되었더라도 테스트를 통해 기존의 예상대로 동작이 이루어지는지 바로 검증할 수 있습니다. 이를 통해 새로운 코드나 수정된 부분의 문제점을 빠르게 찾아낼 수 있습니다.
- 커뮤니케이션 향상: 테스트 코드 및 케이스가 문서화 역할을 하여, 다른 개발자가 코드를 볼 때 해당 코드가 어떤 동작을 수행해야 하는지 명확하게 이해할 수 있습니다.
- 버그 재발 방지: 발견된 버그와 관련된 내용을 통과해야 하는 테스트 케이스로 추가하여 같은 버그가 발생하지 않도록 합니다.
단점은 다음과 같습니다.
- 초기 개발 속도의 저하: 개발 초기에는 요구사항이 빈번하게 바뀔 수 있어, 테스트 코드를 작성하는 데 요구되는 시간이 증가합니다.
- 테스트 난이도: 로직이 복잡하거나 외부 api 호출이 필요한 코드의 경우, 해당 코드에 맞는 테스트 코드를 작성하는 데에 많은 시간이 소요됩니다. 외부 의존성이 많다면, 실제로 참조하는 대신 mocking을 사용하거나 stub을 사용하기 위해 추가적인 작업이 요구될 수 있습니다.
- 유지보수의 부담: 테스트 대상이 되는 코드가 변경되었을 때, 그에 대응되는 테스트 코드 또한 변경이 필요합니다. 이때 기능보다 테스트 코드의 유지보수가 더 어려울 수 있으며 잘못된 테스트 코드를 작성한 경우에 또 다른 문제가 발생할 수 있습니다.
- 과도한 테스트 커버리지: 발생할 수 있는 모든 상황을 테스트해야 한다는 강박이 생길 수 있습니다.
- 초기 학습 필요: 테스트에 사용되는 프레임워크를 익히고 테스트 코드를 작성하는 데 시간과 노력이 요구됩니다.
읽어주셔서 감사합니다:)