TDD
TDD란?
작성해야하는 프로그램에 대한 테스트를 먼저 작성하고 이 테스트를 통과할 수 있도록 실제 프로그램의 코드를 작성한다. 여기서 만드는 테스트도 그 자체로 하나의 프로그램이며 프로그램의 요구사항을 반영할 수 있게 만든다.
TDD Cycle
Red
→ 인터페이스(설계)와 스펙에 집중하여, 실패하는 테스트 코드를 작성Green
→ 올바른 방법이 아니어도 재빨리 테스트를 통과시킨다.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
zero config
Jest 대부분의 JavaScript 프로젝트에서 설정없이 바로 사용할 수 있는 것을 목표로한다.
snapshots
snapshots
큰 객체를 쉽게 추적하는 테스트를 만들어 낼 수 있다. 스냅샷은 테스트와 함께 또는 내장된 인라인이 라이브로 적용됩니다.
isolated(격리)
isolated(격리)
테스트는 성능을 극대화하기 위해 자체 프로세스에서 실행하여 병렬화됩니다.
좋은 API 제공
좋은 API 제공
it
to expect
와 같이 Jest는 전체 툴킷을 한 곳에 모았습니다.
Last updated