# 1.Tdd

## TDD란

테스트 주도 개발(Test Driven Development, TDD)은 1990년대 후반에 개발된 "익스트림 프로그래밍(대표적인 애자일 프로그래밍 개발방법론 중 하나)" 또는 XP라는 프로그래밍 개발방법론의 실천 방안 중 하나이다. 개발이 이루어진 다음 그것이 계획대로 잘 완성되었는지 테스트 케이스를 작성하고 테스트하는 타 방식과는 달리, 테스트 케이스를 먼저 작성한 다음 테스트 케이스에 맞추어 실제 개발 단계로 이행하는 개발방법론을 말한다. 묵시적으로 잠재된 상황을 가정하지 않고 테스트 케이스만을 완벽하게 수행하는 것을 목표로 하기 때문에 매우 빠르게 목표를 완료할 수 있다. 한편, TDD 자체가 하나의 테스트가 완전하지 않다는 것을 가정하고 있기 때문에 1차 테스트를 완료한 다음에 새로운 테스트 케이스를 확장해서 작성하고 그것을 통과하기 위한 개발에 들어가는 과정을 끊임없이 반복하여 큰 규모의 프로젝트를 완성해가는 것이다.

TDD 프로세스에는 일반적으로 세 가지 주요 단계가 포함된다.

1. 실패한 테스트 작성: 개발자는 코드의 요구 사항에 따라 실패하도록 설계된 테스트를 작성한다. 이 테스트는 수행할 것으로 예상되는 코드의 "사양" 역할을 한다.
2. 테스트를 통과하는 데 필요한 최소한의 코드 작성: 개발자는 테스트 요구 사항을 충족하는 코드를 작성한다. 여기서 목표는 완벽한 코드를 작성하는 것이 아니라 테스트를 통과하는 데 필요한 최소한의 코드를 작성하는 것이다.
3. 코드 리팩터링: 테스트가 통과되면 개발자는 코드를 리팩터링하여 더 읽기 쉽고 효율적이며 유지 관리할 수 있도록 만든다. 이 단계를 통해 코드의 품질이 우수하고 나중에 쉽게 수정할 수 있다.

TDD는 소프트웨어 개발에 여러 이점을 제공한다. 첫째, 코드가 테스트에 지정된 요구 사항을 충족하는지 확인한다. 둘째, 개발 프로세스 초기에 버그와 문제를 포착하여 더 쉽고 저렴하게 수정할 수 있다. 셋째, 개발자가 코드베이스의 전반적인 품질과 유지 관리 가능성을 향상시킬 수 있는 더 모듈화되고 재사용 가능한 코드를 작성하도록 권장한다.

이러한 이점에도 불구하고 TDD는 실제로 구현하기 어려울 수 있다. 개발에 대한 사고 방식과 접근 방식의 상당한 변화가 필요하며 코드의 요구 사항을 정확하게 반영하는 우수한 테스트를 작성하기 어려울 수 있다. 그러나 애자일 개발 및 지속적인 개선에 전념하는 팀의 경우 TDD는 소프트웨어 개발의 품질과 효율성을 개선하는 강력한 도구가 될 수 있다.

## Jest

Jest는 Facebook에서 개발한 인기 있는 JavaScript 테스트 프레임워크이다. 2014년에 처음 출시되었으며 이후 JavaScript 생태계에서 가장 널리 사용되는 테스트 도구 중 하나가 되었다.

Jest는 설정 및 구성의 복잡성과 다른 개발 도구와의 통합 부족과 같은 기존 테스트 프레임워크의 일부 단점을 해결하기 위해 만들어졌고 JavaScript 개발자에게 간단하고 통합된 테스트 경험을 제공하는 것을 목표로 한다.

Jest의 주요 기능 중 하나는 TDD(테스트 기반 개발 - Test Driven Development) 및 BDD(행동 기반 개발 - Behavior Driven Development)에 중점을 둔 것이다. Jest를 사용하면 개발자는 비기술적 이해 관계자가 쉽게 이해할 수 있는 사람이 읽을 수 있는 형식으로 테스트를 작성할 수 있다. 이렇게 하면 요구 사항과 코드의 예상 동작을 더 쉽게 전달할 수 있다.

Jest에는 React, Angular 및 Vue.js와 같은 널리 사용되는 JavaScript 기술에 대한 내장 지원도 포함되어 있다. 스냅샷 테스트, 목킹 및 코드 커버리지 분석을 포함하여 이러한 기술의 테스트를 단순화하는 다양한 유틸리티 및 매처를 제공한다.

Jest는 Jasmine 테스트 프레임워크 위에 구축되어 테스트 및 어설션을 정의하기 위한 구문을 제공한다. 그러나 Jest는 개선된 오류 보고, 병렬 테스트 실행 및 automatic mocking과 같은 추가 기능으로 Jasmine을 확장한다.

Jest는 테스트 동작 및 출력을 사용자 정의할 수 있는 옵션과 함께 고도로 구성 가능하도록 설계되었다. npm, Yarn 및 Grunt를 포함한 다양한 테스트 러너 및 태스크 러너와 함께 사용할 수 있다.

Jest는 오픈 소스 소프트웨어이며 Facebook 및 광범위한 JavaScript 커뮤니티에서 적극적으로 유지 관리한다. 크고 활동적인 사용자 커뮤니티와 추가 기능 및 다른 도구와의 통합을 추가하는 광범위한 플러그인 및 확장 기능이 있다.

## Describe-Context-It 패턴

DCI(Describe-Context-It) 패턴은 Jasmine, Mocha 및 Jest와 같은 행동 기반 개발(BDD) 프레임워크에서 사용되는 일반적인 패턴이고 테스트를 명확한 구조로 구성하여 테스트를 더 읽기 쉽고 표현력 있게 만들도록 설계되었다.

| 키워드      | 설명                                                                                   |
| -------- | ------------------------------------------------------------------------------------ |
| Describe | 관련 테스트 그룹을 정의하는 데 사용된다. 일반적으로 테스트 중인 기능에 대한 간략한 설명과 필요한 설정 또는 구성이 포함되어 있다.           |
| Context  | 그룹 내에서 특정 테스트 사례를 정의하는 데 사용된다. 일반적으로 테스트 사례에 대한 설명과 해당 특정 사례에 필요한 추가 설정 또는 구성이 포함된다. |
| It       | 특정 테스트 어설션을 정의하는 데 사용된다. 여기에는 일반적으로 예상되는 동작에 대한 설명과 실제 테스트 코드가 포함된다.                 |

```js

const context = describe;

describe('sum function', () => {
  context('when given two positive numbers', () => {
    it('returns the correct sum', () => {
      expect(sum(2, 3)).toEqual(5);
    });
  });

  context('when given a negative and a positive number', () => {
    it('returns the correct sum', () => {
      expect(sum(-2, 3)).toEqual(1);
    });
  });

  context('when given two negative numbers', () => {
    it('returns the correct sum', () => {
      expect(sum(-2, -3)).toEqual(-5);
    });
  });
});
```

## 단위테스트란

단위 테스트는 소프트웨어 응용 프로그램의 개별 단위 또는 구성 요소를 나머지 시스템과 분리하여 테스트하는 소프트웨어 테스트 기술이다. 단위 테스트의 목표는 각 코드 단위가 예상대로 작동하는지 확인하고 개발 프로세스 초기에 결함이나 버그를 발견하는 것이다.

단위 테스트에서 단위는 단일 함수, 메서드 또는 클래스와 같은 응용 프로그램의 테스트 가능한 가장 작은 부분을 나타낸다. 각 단위는 예상되는 출력 또는 동작을 생성하는지 확인하기 위해 다양한 입력 값 및 테스트 사례를 사용하여 개별적으로 테스트된다.

단위 테스트 프로세스에는 일반적으로 다음 단계가 포함된다.

1. 테스트할 단위 식별: 단위 테스트의 첫 번째 단계는 테스트해야 하는 개별 코드 단위를 식별하는 것이다. 여기에는 함수, 메서드, 클래스 또는 응용 프로그램의 기타 구성 요소가 포함될 수 있다.
2. 테스트 사례 만들기: 각 단위에 대해 올바르게 작동하는지 확인하기 위해 하나 이상의 테스트 사례가 생성된다. 테스트 케이스에는 유효한 입력 값과 유효하지 않은 입력 값은 물론 예기치 않은 동작을 유발할 수 있는 엣지 케이스가 모두 포함되어야 한다.
3. 테스트 실행: 테스트 사례가 생성되면 단위 테스트 프레임워크를 사용하여 실행된다. 이 프레임워크는 테스트 프로세스를 자동화하는 방법을 제공하여 개발자가 많은 수의 테스트를 쉽고 빠르게 실행하고 실패 또는 문제를 식별할 수 있도록 한다.
4. 결과 분석: 테스트가 실행된 후 결과를 분석하여 실패 또는 결함을 식별한다. 테스트가 실패하면 개발자는 테스트에서 제공한 정보를 사용하여 문제를 디버깅하고 수정할 수 있다.

단위 테스트는 결함을 조기에 발견하고 개별 코드 단위가 올바르게 작동하는지 확인하는 데 도움이 되므로 소프트웨어 개발 프로세스의 중요한 부분이다. 각 단위를 격리하고 격리된 상태에서 테스트함으로써 개발자는 코드의 신뢰성과 안정성에 대한 확신을 얻을 수 있으며 새로운 버그나 문제가 발생하지 않는다는 확신을 가지고 변경할 수 있다.

인기 있는 JavaScript용 단위 테스트 프레임워크로는 Jest, Mocha 및 Jasmine이 있다. 이러한 프레임워크는 단위 테스트 프로세스를 단순화하고 개발자가 테스트를 더 쉽게 작성하고 실행할 수 있도록 다양한 기능과 도구를 제공한다.

### 단위테스트를 진행해 보면서 느낀점

5주차 과제를 진행하면서 단위테스트를 기능단위에 맞춰서 이렇게 작성해 본 적은 처음이었다. 처음에는 `무엇을 테스트 해야하고 어떻게 테스트를 작성해 나갈까?` 하는 생각이 먼저 들었고, 차근차근 작성해보면서 익숙해지는 과정이 필요하다고 생각이 들었다. 과제를 끝마칠즘에는 `단위테스트를 어디까지 해야 맞는걸까?`라는 생각이 들면서 과제를 마무리 했던 것 같다.

테스트를 진행하면서 내가 만든 기능에 대해서 안정성 생기고 컴포넌트에 대한 보호막이 생긴 것 같은 기분이 들어서 좋았으나, 역할과 책임의 관점에서 테스트를 작성하는 것뿐 아니라 컴포넌트를 만드는 부분에도 신경을 많이 써야겠다는 생각이 들었다.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://jin-11.gitbook.io/jin-devnote/week5/tdd.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
