TDD

TDD란?

작성해야하는 프로그램에 대한 테스트를 먼저 작성하고 이 테스트를 통과할 수 있도록 실제 프로그램의 코드를 작성한다. 여기서 만드는 테스트도 그 자체로 하나의 프로그램이며 프로그램의 요구사항을 반영할 수 있게 만든다.

TDD Cycle

  1. Red → 인터페이스(설계)와 스펙에 집중하여, 실패하는 테스트 코드를 작성

  2. Green → 올바른 방법이 아니어도 재빨리 테스트를 통과시킨다.

  3. Refactor → 리팩터링을 통해 코드를 올바르게 만든다. TDD에서 가장 중요한 부분이지만, 간과될 때가 많다.

작은 단계를 찾고, 코드에서 피드백을 얻는 게 어렵지만 중요하다. 2번이 어렵다면 1번으로 돌아가서 더 작고 쉬운 문제를 정의하고, 3번을 위해 의도를 드러내고 중복을 찾아 제거하는 연습을 해야한다. 이 둘이 익숙하지 않으면 TDD 하는 것이 불가능하고 일반적인 개발 또는 클린 코드를 작성하는 것이 마찬가지로 매우 힘들어진다.

Given-When-Then

테스트 코드를 작성한다고 하였을 때 어떻게 시작해야할지 모르는 경우들이 많습니다. 이러한 경우 템플릿을 사용하는 것이 좋은데 정해진 틀을 본 후 내가 가진 문제를 채워넣는 게 자유롭게 마음껏 쓰라고 하는 것보다 훨씬 쉽고, 더 나은 결과를 낸다.

테스트는 버그를 찾기 위함이고, 올바른 명세를 통해 확인하는 테스트 코드를 작성하면 쉽게 접근할 수 있다.

  • Given - 시나리오 진행에 필요한 값을 설정한다.

  • When - 시나리오를 진행하는데 필요한 조건을 명시한다.

  • Then - 시나리오를 완료했을 때 보장해야 하는 결과를 명시한다.

Example

전자렌지에 40초 돌리면 완성!

우리가 해야할 일은? 무엇인가요?

전자렌지에 40초 돌리는 것

그럼 무슨 일이 벌여지나?

완성!

When: 전자렌지에 40초 돌리면
Then: 요리가 완성된다.

잠깐! 준비 과정이 생략되어 다시 진행해볼까요?

1000W 전자렌지와 닭가슴살을 준비해서 40초 돌리면 완성!

정리해보면,

Given: 1,000W 전자렌지와 닭가슴살을 준비해서
When: 전자렌지에 40초 돌리면
Then: 완성

이후, 1분을 돌리게 되었을 때, 0초를 돌렸을 때, 4분을 돌렸을 때의 생각들을 바로 실행하여 확인하면 된다.

즉, Given - When - Then은 테스트 코드를 먼저 작성하는 작업을 명세를 명확히 하는 작업으로 바꿔준다.

단위(Unit) 테스트

하나의 모듈을 기준으로 독립적으로 진행되는 가장 작은 단위 테스트이다. 여기서의 모듈은 애플리케이션에서 작동하는 하나의 기능 또는 메소드이다.

Ex) 웹 애플리케이션에서 로그인 메소드에 대한 독립적인 테스트가 1개의 단위 테스트가 될 수 있다.

단위 테스트는 애플리케이션을 구성하는 하나의 기능이 올바르게 동작하는지를 독립적으로 테스트하는 것으로, "어떤 기능이 실행되면 어떤 결과가 나온다" 정도로 테스트를 진행한다.

단위 테스트의 필요성

  • 테스팅에 대한 시간과 비용을 절감할 수 있다. (만약 하나의 기능을 만든 상태이고 새로운 추가 기능 요청이 왔을 때 또 똑같은 테스팅을 거칠 필요가 없음)

  • 새로운 기능 추가 시 수시로 빠르게 테스트 가능

  • 리팩토링 시에 안정성을 확보할 수 있다.

  • 코드에 대한 문서가 될 수 있다.

많은 실무에서 TDD를 사용하는데 TDD에서 이야기하는 테스트도 결국 단위 테스트를 의미한다. 우리가 작성한 테스트 코드를 수시로 빠르게 돌리면서 문제를 파악할 수 있다.

Jest

코드가 내가 의도한 대로 정상적으로 잘 동작하는지 확인하는 Test Case를 만드는 JavaScript 테스팅 라이브러리다.

Unit Test를 위해 사용

특징

zero config

Jest 대부분의 JavaScript 프로젝트에서 설정없이 바로 사용할 수 있는 것을 목표로한다.

snapshots

큰 객체를 쉽게 추적하는 테스트를 만들어 낼 수 있다. 스냅샷은 테스트와 함께 또는 내장된 인라인이 라이브로 적용됩니다.

isolated(격리)

테스트는 성능을 극대화하기 위해 자체 프로세스에서 실행하여 병렬화됩니다.

좋은 API 제공

it to expect와 같이 Jest는 전체 툴킷을 한 곳에 모았습니다.

Last updated