단위 테스트 (Unit Test)
정의
단위 테스트는 소프트웨어의 가장 작은 단위(클래스, 함수, 메서드 등)를 개별적으로 테스트하여, 이들이 예상대로 동작하는지 확인하는 테스트입니다.
특징
• 테스트 범위: 각 개별 함수, 메서드, 또는 클래스와 같은 작은 코드 조각을 테스트합니다.
• 목적: 코드의 각 단위가 올바르게 동작하는지 확인하여, 버그를 초기에 발견하고 수정하기 위함입니다.
• 독립성: 단위 테스트는 외부 종속성(예: 데이터베이스, 파일 시스템, 네트워크 등)을 가정하지 않고 독립적으로 실행됩니다. 외부 종속성을 모의 객체(Mock)나 스텁(Stub)으로 대체하여 테스트를 수행할 수 있습니다.
• 빠른 실행: 단위 테스트는 빠르게 실행되며, 대개 전체 테스트의 실행 속도가 빠릅니다.
• 테스트 도구: JUnit, NUnit, pytest, MSTest와 같은 단위 테스트 프레임워크를 사용합니다.
• 작성 시점: 개발자가 코드를 작성하면서 또는 코드 작성 직후에 작성하고 실행합니다.
• 예시:
예를 들어, 수학적인 연산을 수행하는 add(int a, int b) 함수를 테스트한다고 할 때, 다양한 입력에 대해 예상되는 결과를 확인합니다.
@Test
public void testAdd() {
assertEquals(5, MathUtils.add(2, 3)); // 2 + 3 = 5
assertEquals(0, MathUtils.add(-1, 1)); // -1 + 1 = 0
}
장점
• 빠르게 실행할 수 있고, 코드의 개별적인 부분에서 발생할 수 있는 버그를 쉽게 찾아낼 수 있습니다.
• 코드의 유지보수성을 높이고 리팩토링을 할 때 안정성을 보장합니다.
통합 테스트 (Integration Test)
정의
통합 테스트는 여러 모듈이나 구성 요소를 결합하여, 이들이 함께 올바르게 동작하는지 확인하는 테스트입니다.
특징
• 테스트 범위: 단위 테스트가 끝난 이후, 여러 단위(모듈, 서비스, 서브시스템 등)가 결합된 부분을 테스트합니다.
• 목적: 모듈 간의 인터페이스와 상호작용을 검증하여, 각 모듈이 예상대로 협력하는지 확인하고, 모듈 간 통합에서 발생할 수 있는 문제를 발견하는 것이 목적입니다.
• 종속성: 실제 데이터베이스, 파일 시스템, 네트워크 등 외부 자원과의 상호작용을 테스트할 수 있습니다. 이를 통해 모듈 간의 상호작용을 실제 환경과 유사하게 검증할 수 있습니다.
• 실행 속도: 외부 자원과의 상호작용이 포함되므로 단위 테스트보다 실행 속도가 느린 편입니다.
• 테스트 도구: JUnit과 같은 단위 테스트 도구뿐만 아니라, TestNG, Spring Test, Mockito, REST-assured와 같은 프레임워크 및 라이브러리를 사용할 수 있습니다.
• 작성 시점: 보통 여러 모듈이 개발된 이후 또는 단위 테스트가 완료된 후에 작성합니다.
• 예시:
예를 들어, 사용자 등록 기능을 테스트한다고 할 때, 사용자 입력을 처리하고, 데이터베이스에 저장하고, 이메일 알림을 보내는 각 모듈이 결합되어 올바르게 동작하는지 테스트합니다.
@Test
public void testUserRegistration() {
// 사용자 서비스 및 이메일 서비스가 함께 동작하는지 확인
userService.registerUser("testUser", "password", "email@example.com");
assertTrue(emailService.wasEmailSent("email@example.com"));
}
장점
• 모듈 간의 상호작용을 검증하여, 통합 시 발생할 수 있는 오류를 발견합니다.
• 실제 환경과 유사한 조건에서 테스트할 수 있어 시스템의 전반적인 동작을 검증할 수 있습니다.
단위 테스트와 통합 테스트의 차이점
구분 | 단위 테스트(Unit Test) | 통합 테스트(Integration Test) |
테스트 범위 | 개별 함수, 메서드, 클래스 등 작은 단위 | 여러 모듈 간의 상호작용 및 통합 |
목적 | 개별 코드 조각이 예상대로 동작하는지 확인 | 모듈 간의 통합이 올바르게 수행되는지 확인 |
종속성 | 외부 종속성 없이 독립적으로 수행(Mock, Stub 사용) | 실제 데이터베이스, 네트워크 등 외부 자원과의 상호작용 포함 가능 |
테스트 속도 | 빠름 | 상대적으로 느림 |
실행 시점 | 개발자가 코드를 작성할 때 또는 작성 직후 | 단위 테스트 이후 여러 모듈이 개발된 후 |
도구 | JUnit, NUnit, pytest, MSTest 등 | JUnit, TestNG, Spring Test, REST-assured, Mockito 등 |
장점 | 코드의 개별 동작을 빠르게 검증 가능, 버그를 조기에 발견 | 모듈 간 상호작용 및 통합 문제를 발견, 실제 환경과 유사하게 테스트 |
예시 | 특정 함수가 예상대로 동작하는지 확인 (예: 덧셈 함수 테스트) | 여러 모듈이 결합되어 사용자를 등록하고 이메일을 보내는 과정 테스트 |
요약하면
단위 테스트는 코드의 작은 단위를 독립적으로 검증하여 버그를 조기에 발견하는 데 유리하고, 통합 테스트는 여러 모듈이 통합된 후 모듈 간의 상호작용을 검증하여 전체 시스템의 안정성을 보장합니다. 따라서 소프트웨어 개발에서는 두 가지 테스트를 모두 사용하여 높은 품질의 코드를 유지하는 것이 좋습니다.
'Spring' 카테고리의 다른 글
동시성 제어 (낙관적 락, 비관적 락, 분산 락) (0) | 2024.10.19 |
---|---|
Transactional 관심사의 분리를 통해 로그 기록 남기기 (0) | 2024.10.08 |
Fetch Type:LazyLoading vs EagerLoading (0) | 2024.09.30 |
Error 메시지(enum 활용) (3) | 2024.09.13 |
Service 테스트 코드, controller 테스트 코드 (0) | 2024.09.13 |