# console.log 가 있는데 Testing 이 왜 필요하죠?

## **Introduction**

테스트는 소프트웨어 개발에서 필수적인 과정입니다. 개발자들은 구현한 기능이 올바르게 작동하는지 확인하기 위해 테스트를 수행합니다. 주로 어떤 방식으로 테스트를 진행할까요?

주로 두 가지 방법을 사용합니다:

1. `console.log`
2. 사용자의 동작 (클릭, 스크롤 등)

이 두 가지 방법은 기능 개발에 있어서 유용하게 사용되어 왔습니다. 그러나 아래와 같은 상황에서는 어떨까요?

1. 20개의 필터 종류로 게시물을 필터링해야 하는 상황
2. 각 게시물이 5가지 종류 중 하나이고, 게시물 클릭 시 해당 종류에 맞는 경로로 이동해야 할 때

이러한 경우 모든 가능한 경우의 수를 테스트하려면 100개의 테스트를 수행해야 할 것입니다. 일반적으로 10번 이내로 테스트하며 기능을 확인하고 동작하는지 확인합니다. 그러나 시간이 충분하다면, 리팩토링을 할 수 있을까요? 이미 작동 중인 코드를 변경하는 것은 거리낌이 가는 일일 것입니다. 특히 100가지 경우에 영향을 미칠 수 있는 경우에는 더욱 그렇습니다. 테스트 코드는 위와 같은 경우를 위해 존재합니다.

* 100 번의 테스트를 사람이 아닌 코드가 진행하게 함으로써, 시간을 줄이며 확신을 얻기 위해
* 리팩토링을 자유롭게 하기 위해
* 명시적으로 요구사항을 표시하기 위해

## 테스트 코드가 주는 이점

1. 코드의 예상되는 동작을 문서화하는 효과
2. 코드의 예상되는 동작을 검증하는 효과
3. 코드의 예상되는 동작을 안전하게 변경하는 효과

## 항상 테스트 코드를 작성해야 할까요?

테스트 코드를 작성하는 이유는 시간을 절약하기 위해서입니다. 테스트 코드를 작성하는 데 드는 시간이 직접 테스트하거나 유지보수 시간을 절약하는 데에 비해 이득이 되어야 합니다. 이 판단은 개발자 개개인이 해야 합니다. 초기에는 작성하는 데 더 많은 시간이 들 수 있지만, 익숙해지면 효과를 누릴 수 있습니다. 따라서 간단한 유틸리티 함수부터 작성해 보는 것을 권장합니다.

## 테스트 코드 종류

테스트 코드는 크게 세 가지 종류로 구분할 수 있습니다:

1. 단위 테스트: 함수, 클래스 등 개별 모듈이 의도한 대로 정확히 작동하는지 검증하는 테스트
2. 통합 테스트: 단위 테스트가 끝난 모듈을 조합하여 전체 시스템이 의도한 대로 정확히 작동하는지 검증하는 테스트
3. E2E (End-to-End) 테스트: 사용자의 관점에서 시스템이 의도한 대로 정확히 작동하는지 검증하는 테스트

위에서 아래로 갈수록, 작성하는데 환경에 대한 변수가 많기 때문에 디버깅이 어려워집니다. 따라서 탄탄한 단위 테스트를 우선 고려하는 것이 좋습니다.

## 테스트 코드 작성 프레임워크

JavaScript에서 인기 있는 두 가지 테스팅 라이브러리는 다음과 같습니다:

1. Jest: 주로 단위 테스트에 사용됩니다.
2. Cypress: 주로 E2E 테스트에 사용됩니다.

이 문서에서는 Jest를 사용하여 단위 테스트를 어떻게 수행하는지 소개하겠습니다.
