단위 테스트는 애플리케이션의 가장 작은 단위(보통 메서드나 클래스)를 개별적으로 테스트하는 방법입니다. 외부 의존성(DB, 외부 서비스 등)을 사용하지 않고, 주로 **모킹(Mock)**을 통해 의존성을 대체하여 테스트를 진행합니다.
말 그대로 단위 테스트이기 때문에, 해당 범주에 들지 않는 다른 기능들에 대해서는 알 수 없습니다.
하지만 빠르고, 독립적으로 테스트를 해볼 수 있습니다.
통합 테스트는 애플리케이션의 여러 모듈이나 컴포넌트가 함께 작동하는지, 그리고 외부 시스템(데이터베이스, API 등)과의 통합이 올바르게 이루어지는지를 확인하는 테스트입니다. 실제 환경과 유사하게 외부 자원을 포함한 전체 시스템을 테스트합니다.
외부 시스템과의 상호작용, 데이터 흐름, 통합 기능 등을 실제 환경과 유사한 상황에서 테스트할 수 있습니다. 하지만 이를 위해 데이터베이스, API, 파일 시스템 등 외부 자원을 설정하고 관리해야 합니다. 그리고 문제가 발생했을 때, 문제 발생 범위가 해당 시스템 전체이기 때문에, 단위 테스트보다 버그의 원인을 찾기 어렵습니다.
저는 아직 통합 테스트는 경험이 없습니다.
테스트는 중요하다고 생각합니다. 다만 프로젝트의 시점과 방향성에 따라서 중요도는 다를 수 있다고 생각합니다. 예를 들어서, 당장 구현이 급한 프로젝트의 경우에는, 우선 기능이 나온 뒤에 테스트까지 하면 좋은 것이고, 아니면 구현이라도 빨리 하는 것이 우선 순위가 높다고 생각합니다.
하지만 프로젝트가 거대하고, 거대해서 새로운 기능을 만들거나 유지 보수 하기에 까다로워진 경우에는, 좀 더 신중하고 안정적으로 꼼꼼한 테스트를 거쳐서 유지 보수 해나가는 것이 더욱 중요하다고 생각합니다.
개인적으로 좋은 테스트 코드란, 목적이 명확해야 된다고 생각합니다. 특정 상황에서 문제가 발생하지 않는지 테스트 해서 방지하는 것이 목적이지, 목적이 없이 그냥 테스트할 수 있는 테스트를 전부 하는 것은, 인력+시간 낭비가 될 수 있다고 생각합니다.
given : 특정 상황과 테스트에 사용되는 값을 세팅하는 부분
when : 실제 테스트할 메서드를 호출하고 결과를 가져오는 부분
then : when에서 나온 결과 값을 검증하는 부분
자동화라는 키워드가 필요!!
예전에 했던 코드도 다시 테스트해볼 수 있다는 점!
병합할때마다 자동으로 테스트를 할 수 있다는 점!!
============================================
단위 테스트(Unit Test)와 통합 테스트(Integration Test)는 소프트웨어 테스트에서 서로 다른 단계에서 수행되며, 각각의 목적과 특징이 있습니다. 두 테스트의 차이점과 장단점을 구체적으로 설명해 줄게요.
1. 단위 테스트 (Unit Test)
개념
- 단위 테스트는 애플리케이션의 가장 작은 단위(보통 메서드나 클래스)를 개별적으로 테스트하는 방법입니다. 외부 의존성(DB, 외부 서비스 등)을 사용하지 않고, 주로 **모킹(Mock)**을 통해 의존성을 대체하여 테스트를 진행합니다.
특징
- 작은 범위: 코드의 작은 단위(메서드나 클래스)를 대상으로 테스트.
- 독립성: 테스트할 대상 외의 다른 모듈이나 시스템과 독립적으로 테스트.
- 빠른 실행: 외부 자원을 사용하지 않기 때문에 빠르게 실행됨.
장점
- 빠른 피드백: 단위 테스트는 빠르게 실행되므로, 코드 변경 후 즉각적으로 피드백을 받을 수 있습니다.
- 버그 조기 발견: 코드의 작은 부분에서 발생할 수 있는 버그를 초기에 발견할 수 있습니다.
- 디버깅이 쉬움: 작은 단위에서 문제가 발생하면 그 위치를 쉽게 추적할 수 있습니다.
- 코드 리팩토링에 유리: 기존 코드에 대한 테스트가 있기 때문에, 리팩토링 후에도 기존 기능이 정상적으로 작동하는지 빠르게 확인할 수 있습니다.
단점
- 한정된 테스트 범위: 단위 테스트는 개별 메서드나 클래스만 테스트하므로, 실제로 여러 컴포넌트가 어떻게 함께 작동하는지는 알 수 없습니다.
- 외부 시스템과의 통합 테스트 부족: 데이터베이스, API 등 외부 의존성과의 상호작용을 테스트하지 않기 때문에, 시스템 전체의 동작을 보장할 수 없습니다.
2. 통합 테스트 (Integration Test)
개념
- 통합 테스트는 애플리케이션의 여러 모듈이나 컴포넌트가 함께 작동하는지, 그리고 외부 시스템(데이터베이스, API 등)과의 통합이 올바르게 이루어지는지를 확인하는 테스트입니다. 실제 환경과 유사하게 외부 자원을 포함한 전체 시스템을 테스트합니다.
특징
- 넓은 범위: 애플리케이션의 여러 모듈이 함께 작동하는 것을 테스트.
- 외부 의존성 포함: 데이터베이스, 파일 시스템, API 등과의 실제 통합을 테스트.
- 실제 환경 시뮬레이션: 실제 운영 환경과 유사한 상황에서 시스템을 테스트.
장점
- 실제 환경 검증: 외부 시스템과의 상호작용, 데이터 흐름, 통합 기능 등을 실제 환경과 유사한 상황에서 테스트할 수 있습니다.
- 전체 시스템의 안정성 검증: 단위 테스트에서 놓칠 수 있는 모듈 간 상호작용 문제나 통합 오류를 발견할 수 있습니다.
- 실제 시나리오 테스트: 사용자가 애플리케이션을 사용하는 흐름을 시뮬레이션하여, 전체 프로세스가 잘 작동하는지 확인할 수 있습니다.
단점
- 느린 실행 시간: 외부 자원을 사용하고, 시스템 전체를 테스트하기 때문에 실행 속도가 느립니다.
- 복잡한 설정: 통합 테스트는 실제 환경을 시뮬레이션하기 위해 데이터베이스, API, 파일 시스템 등 외부 자원을 설정하고 관리해야 합니다.
- 디버깅이 어려움: 문제가 발생했을 때, 단위 테스트보다 버그의 원인을 찾기 어렵습니다. 시스템 전체에서 문제가 발생할 수 있는 위치가 많기 때문입니다.
정리: 차이점 비교
항목 단위 테스트 (Unit Test) 통합 테스트 (Integration Test)
| 목적 | 개별 메서드나 클래스 테스트 | 여러 모듈 간 통합 및 외부 시스템과의 상호작용 테스트 |
| 범위 | 작은 코드 단위 | 전체 시스템 또는 주요 모듈 |
| 의존성 | 모킹(Mock)으로 대체 | 실제 외부 시스템과 통합 |
| 속도 | 매우 빠름 | 비교적 느림 |
| 디버깅 | 쉬움 | 어려움 |
| 설정 | 간단함 | 복잡함 |
추천 활용 방법
- 단위 테스트: 코드 작성 시, 메서드나 클래스의 로직을 검증하기 위해 사용. 빠른 피드백을 통해 리팩토링이나 기능 추가 시 안정성을 확인할 수 있음.
- 통합 테스트: 시스템이 통합된 환경에서 제대로 동작하는지 확인하기 위해 주기적으로 사용. 특히 외부 시스템과의 연동이나 실제 데이터베이스 작업이 필요한 경우 통합 테스트가 필수적임.
두 테스트를 적절히 조합하여 사용하면, 코드의 안정성을 높이고, 운영 환경에서 발생할 수 있는 다양한 문제를 사전에 방지할 수 있습니다냥!