# 테스트 기본중의 기본

## 테스트 기본

* 적어도 설계 단계에서 **클래스 다이어그램**과 **시퀸스 다이어그램**은 꼭 작성하자
  * **클래스 다이어그램**: 객체지향 설계에서 **클래스 간의 관계와 구조**를 시각적으로 표현한 다이어그램. 클래스의 속성, 메서드, 상속 등을 나타냄
  * **시퀀스 다이어그램**: 시스템 내 **객체 간 상호작용 순서**를 시간 흐름에 따라 표현한 다이어그램. 메시지 교환 과정과 실행 순서를 보여줌
  * 하나의 거대한 코드를 방지할 수 있고, 리팩토링 효과도 시각화 가능해짐
* 테스트 라이프 사이클(단위 테스트 -> 통합 테스트 -> 시스템 테스트)의 각 단계에서 적절한 방법을 수행해야함
  * **적절한 테스트 방법**: 경계값 테스트, 조합 테스트, 상태 전이 테스트
  * **경계값 테스트:** 입력값의 경계나 한계점에서 발생할 수 있는 오류등을 체크 (최대/최소값, 경계 바로 안팎의 값)
  * **조합 테스트:** 서로 다른 입력값의 조합에 따라 발생할 수 있는 오류등을 체크
  * **상태 전이 테스트:** 시스템이 어떤 상태에서 다른 상태로 전이될 때 올바르게 작동되는지 체크 (상태와 전이 조건 기반으로 진행)

{% hint style="warning" %}
단위 테스트에서 경곗값 테스트 개념이 포함되어 있지 않은 경우 단지, 함수를 호출해서 커버리지 비율을 높이는 것일뿐 도움이 되지 않는다.
{% endhint %}

### 경곗값 테스트

> 경곗값 테스트만 확실히 수행해도 80% 이상의 버그를 잡을 수 있다.

* 문자 그대로 '**경계를 테스트하는 방법**'
* 일반적으로 요구사항 사양의 경계에서 버그가 발생한다.
  * 테스터도 집요하게 경계가 되는 값을 입력해 버그를 발견하려고 한다!
* 프로그램에서 경계라 불리는 위치에서는 항상 버그가 숨어있다.

#### `>` 와 `>=`의 잘못된 사용 (닫힘 관계 버그)

* 개발자가 `>=`로 입력해야 하는 곳에 `>`라고 잘못 입력한 경우

```typescript
if (a > 1) {
  // 출력 처리
} else {
  // 에러 처리
}
```

#### 잘못 입력한 숫자, 요구사항 사양 오해 등

* 개발자가 1이라 입력하는 대신 잘못해서 2로 입력한 경우

```typescript
if (a >= 2) {
  // 출력 처리
} else {
  // 에러 처리
}
```

#### 경계가 없음

* 개발자가 조건문을 작성하는 것을 잊어버린 경우 (else)

```typescript
if (a >= 2) {
  // 출력 처리
}
// else 까머금
```

#### 여분의 경계

* 불필요한 경계를 개발자가 작성한 경우

```typescript
if (a > 2 %% a < 10) {
  // 출력 처리 
} else {
  // 에러 처리
}
```

### 상태 전이 테스트

> '**상태**'를 모델화해서 테스트를 수행하는 방법

* '상태 전이'란 크게 **상태**와 **전이**로 나누어 표현됨
* 어떤 상태에서 다른 상태로 이동하기 위해서는 전이가 발생함
* Ex: 애플리케이션이 기동하는 상태를 상태 A, 기동하지 않는 상태를 B라 정의, 상태 A에서 상태 B로 바뀌려면 애플리케이션이 종료 상태를 거쳐야함
* 상태 전이 테스트에서는 함수(또는 클래스) 레벨에서 단위 테스트가 끝난 뒤, 해당 함수가 다른 함수에서 호출되는지 등을 확인&#x20;
* 상태 전이 테스트에서는 일반적으로 **상태 전이 매트릭스**를 사용함

#### 상태 전이 매트릭스

| 이벤트/상태    | 시스템   | 입력 대기                         | 대화 상자 열기                      |
| --------- | ----- | ----------------------------- | ----------------------------- |
| 기동        | 입력 대기 | N/A(두 번째 인스턴스가 기동하지 않는 것을 확인) | N/A(두 번째 인스턴스가 기동하지 않는 것을 확인) |
| 메뉴 명령어    | N/A   | 파일 대화 상자 열기                   | N/A                           |
| 입력        | N/A   | 입력 대기                         | N/A                           |
| 대화 상자 닫기  | N/A   | N/A                           | 입력 대기                         |
| 애플리케이션 종료 | N/A   | 시스템                           | N/A(종료하지 않는 것을 확인)            |

{% hint style="info" %}
개발자라면 이와 같은 내용을 **올바른 문장으로 만들고 테스터에게 전달하는 행동**이 **매우 중요**하다.
{% endhint %}

* 그렇지 않다면 스스로 테스트를 수행해야 한다.
* 만약 이 중 한가지라도 부족하면 시장의 버그로 연결된다.
