# 테스트 커버리지

## 커버리지

> 구현 코드가 얼마나 테스트됐는지 측정 지표

```bash
$ npx jest --coverage
```

* 커버리지 수치가 높다고 반드시 품질이 좋은 것이 아니다
* 반대로 커버리지가 낮다는 것은 테스트가 부족하다는 신호
* 커버리지는 특정 파일에 테스트를 추가해야 하는지 검토하는 계기로 활용된다.

### 리포트 구성

* `Stmts`, `Branch`, `Funcs`, `Lines` 커버리지는 테스트를 실행했을 때 각 요소의 호출 여부를 백분율로 나타냄

<table><thead><tr><th width="95">File</th><th width="124">Stmts</th><th width="123">Branch</th><th width="124">Funcs</th><th width="124">Lines</th><th>Uncovered Line</th></tr></thead><tbody><tr><td>파일명</td><td>구문 커버리지</td><td>분기 커버리지</td><td>함수 커버리지</td><td>라인 커버리지</td><td>커버되지 않은 라인</td></tr></tbody></table>

* **Stmts(구문 커버리지)**: 구현 파일에 있는 모든 구문이 적어도 한 번은 실행됐는지 나타냄
* **Branch(분기 커버리지)**: 구현 파일에 있는 모든 조건 분기가 적어도 한 번은 실행됐는지 나타냄
  * `if`, `case`, `삼항연산자`를 사용한 분기가 측정 대상
  * 커버리지를 정량 지표로 사용할 때 중점적으로 활용하는 핵심 지표
* **Funcs(함수 커버리지)**: 구현 파일에 있는 모든 함수가 적어도 한 번은 호출됐는지 나타냄
  * 프로젝트에서 실제로 사용하지 않지만 `export` 된 함수를 찾음
* **Lines(라인 커버리지)**: 구현 파일에 포함된 모든 라인이 적어도 한번은 통과됐는지 나타냄

{% hint style="info" %}

```typescript
// jest.config.ts
export default { 
  //...
  collectCoverage: true, // 테스트 커맨드 실행시 별도 옵션을 주지 않아도 리포트 생성
  coverageDirectory: "coverage",// 커버리지 리포트를 생성할 디렉터리명
}
```

{% endhint %}

### 커스텀 리포터

* 테스트 실행 결과는 여러 리포트를 통해 확인 가능
* `jest.config.ts` 에 선호하는 리포터를 추가해보자.

```typescript
export default {
  reporters: [
    "default",
    [
      "jest-html-repoerters",
      {
        publicPath: "__reports__",
        filename: "jest.html",
      }
    ]
  ]
}
```

* `jest-html-reporters`: 테스트 실행 결과를 그래프 형태로 보여줌
  * 시간이 많이 걸리는 테스트를 찾거나 정렬 기능이 있어 편리
  * 실패한 테스트에는 목록의 `Action` 에 `[info]` 버튼이 생김 -> 해당 테스트의 상세 정보 표시됨
* 그 외 `jest-html-reporters` , 깃허브에는 테스트가 실패한 부분에 코멘트를 남기는 등 다양한 리포터 존재
* [커뮤니티](https://github.com/jest-community/awesome-jest/blob/main/README.md#reporters)
