> For the complete documentation index, see [llms.txt](https://taewoongs-organization.gitbook.io/jtwjs-dev-wiki/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://taewoongs-organization.gitbook.io/jtwjs-dev-wiki/dev_note/testing/undefined-4.md).

# 통합 테스트

## 통합 테스트

> 단위 테스트와는 달리 여러 개의 모듈 또는 컴포넌트가 함께 작동하는지, 서로 잘 통합되는지를 검증

* **단위 테스트의 요구사항** 중 하나라도 충족하지 못하는 테스트는 통합 테스트 범주에 속한다.
* 즉, 단위 테스트가 아닌 모든 테스트는 통합 테스트에 해당한다.

{% hint style="info" %}
**단위 테스트의 세 가지 요구사항**

* 소프트웨어의 가장 작은 단위(모듈,클래스,함수)의 개별적인 동작 단위를 검증해야 한다.
* 빠르게 수행되어 결과를 즉시 제공할 수 있어야 한다.
* 각각의 단위 테스트는 독립적으로 실행되고 다른 테스트에 영향을 끼치지 않아야 한다.
  {% endhint %}

### 장점

* 통합 테스트는 여러 모듈의 상호작용을 통해 코드를 더 많이 거치므로 회귀 방지가 단위 테스트보다 우수하다.
* 유저 시나리오에 가까운 상황을 재현하여 시스템을 검증 할 수 있다.

{% hint style="info" %}
단위 테스트로 가능한 많은 비즈니스 시나리오의 예외 상황을 확인하고, 통합 테스트는 시나리오의 성공적인 흐름과 단위 테스트가 다루지 못한 예외 상황을 다룬다.
{% endhint %}

### 빠른 실패 (Fast Fail)

> 버그를 빨리 나타나게 하는 것을 **`빠른 실패 원칙`**&#xC774;라 하며, 통합 테스트에서 할 수 있는 대안이다.

예기치 않은 오류가 발생하자마자 현재 연산을 중단시키는 것으로 애플리케이션의 안정성을 높힐 수 있다.

* **피드백 루프 단축**: 버그를 빨리 발견할수록 더 쉽게 해결 가능
* **지속성 상태 보호**: 버그는 앱의 상태를 손상시키는데, 손상된 상태가 DB로 침투하면 고치기 훨씬 어려워지므로 빠르게 실패하면 손상이 확산되는것을 방지할 수 있다.

{% hint style="info" %}
어떤 예외 상황에 잘못 실행돼 전체 에플리케이션이 즉시 실패한다면 해당 예외 상황은 테스트할 필요가 없다.
{% endhint %}

### 외부 의존성

> 프로세스 외부 의존성은 **`관리 의존성`**&#xACFC; **`비관리 의존성`**&#xC73C;로 나뉜다.

#### 관리 의존성 (구현 세부사항)

* 애플리케이션을 통해서만 접근할 수 있는 프로세스 외부 의존성
* 관리 의존성과의 상호작용은 프로세스 외부에서 관찰할 수 없다.&#x20;
* Ex:) Database

#### 비관리 의존성 (식별할 수 있는 동작)

* 다른 애플리케이션이 접근할 수 있는 프로세스 외부 의존성
* 비관리 의존성과의 상호 작용은 외부에서 관찰할 수 있다.
* Ex) SMTP

{% hint style="info" %}
관리 의존성은 실제 인스턴스를 사용하고, 비관리 의존성은 목으로 대체하라.
{% endhint %}
