통합 테스트 및 테스트 전략

진경천·2024년 11월 26일

통합 테스트란?

  • 정의: 여러 모듈이나 요소를 결합하여 전체 시스템의 동작을 검증하는 테스트 기법
  • 목적: 개별 모듈 간 상호작용과 인터페이스의 정확성 확인
  • 범위: 단위 테스트 보다 넓고, End-To-End 테스트 보다 좁은 범위

통합 테스트 VS 단위 테스트

항목 통합 테스트 단위 테스트
테스트 대상 여러 모듈의 조합, 전체 시스템의 일부 개별 모듈이나 매서드
테스트 환경 실제와 유사한 환경, 실제 의존성 사용 격리된 환경, 의존성 최소화
테스트 목적 컴포넌트 간 상호작용, 전체 기능 검증 개별 기능의 정확성

통합 테스트의 목적

모듈 간 상호작용 검증

  • 정의
    • 여러 모듈이 함께 작동할 때의 동작을 확인한다.
  • 검증 대상
    • 데이터 전달의 정확성
    • 모듈간 호출 순서
    • 예외 처리 및 오류 전파
  • 중요성
    • 개별 모듈의 정상 작동이 전체 시스템의 정상 작동을 보장하지 않음
    • 모듈 간 데이터 흐름 및 의존성 검증 필요

인터페이스 오류 발견

  • 정의
    • 모듈 간 연결 지점에서 발생할 수 있는 문제 식별
  • 주요 인터페이스 유형
    • API 호출
    • 데이터 베이스 연동
    • 외부 서비스 통신
  • 발견 가능한 오류
    • 데이터 형식 불일치
    • 파라미터 전달 오류
    • 통신 프로토콜 오류
  • 이점
    • 초기 단계에서 인터페이스 오류 발견 및 수정 가능

시스템 전체 기능 확인

  • 정의
    • End-To-End 관점에서 시스템의 모든 기능이 정상 작동하는지 검증
  • 검증 범위
    • 사용자 시나리오 기반 테스트
    • 비즈니 로직의 정확성
    • 서능 및 안정성
  • 이점
    • 실제 사용 환경과 유사한 조건에서 테스트 수행
    • 예상치 못한 시스템 동작 발견 가능
    • 전체적인 UX 검증

비 점진적 전략(Big Bang 접근법)

모든 모듈을 한 번에 통합하여 테스트하는 방식으로 빠른 통합이 가능하다.

  • 간단한 시스템에 적합
  • 전체 시스템 돚악을 빠르게 확인 가능
  • 별도의 스텁이나 드라이버 불필요
  • 오류 발견 및 수정이 어려움
  • 대규모 시스템에 부적합

점진적 전략

모듈을 단계적으로 통합하며 테스트하는 방식

  • 오류 발견 및 수정 용이

  • 체계적인 통합 가능

  • 종류

    • 하향식(Top-Down) 접근법
    • 상향식(Bottom-Up) 접근법
    • 혼합(Hybrid) 접근법

하향식(Top-Down) 접근법

최상위 모듈부터 시작하여 하위 모듈로 점진적으로 통합하는 방식으로 상위 모듈 테스트 시 하위 모듈을 스텁(Stub)으로 대체한다.

프로세스

  1. 최상위 모듈 테스트
  2. 직접 연결된 하위모듈을 스텁으로 대체
  3. depth or breadth 우선 순위에 따라 다음 레벨 통합
  4. 스텁을 실제 모듈로 점진적 교체
  5. 각 단계마다 회귀 테스트 수행

위 5단계를 모든 모듈이 통합될 때까지 반복한다.

상향식(Bottom-Up) 접근법

최하위 모듈부터 시작하여 상위 모듈로 점진적으로 통합하는 방식으로 하위 모듈 테스트 시 상위 모듈을 드라이버로 대체한다.

프로세스

  1. 최하위 모듈 테스트
  2. 드라이버를 사용해 하위 모듈 그룹 테스트
  3. 테스트 된 모듈 그룹을 다음 레벨로 통합
  4. 드라이버를 실제 상위 모듈로 점진적 교체
  5. 각 통합 단계마다 회귀 테스트 수행

위 5단계를 모든 모듈이 통합될 때까지 반복한다.

결합도 기반 통합 테스트

모듈 간 결합도를 기준으로 테스트 케이스를 설계하고 실행하는 방법으로 모듈 간 상호작용과 데이터 흐름의 정확성을 검증한다.

결합도 종류 및 강도

강도 결합도 종류 내용
약함 자료 결합도 (Data Coupling) 모듈 간의 인터페이스로 전달되는 파라미터(데이터)를 통해서만 상호 작용이 이루어지는 경우. 결합도가 가장 낮고 가장 좋은 형태이다.
스탬프 결합도 (Stamp Coupling) 모듈 간의 인터페이스로 배열이나 객체, 자료 구조 등이 전달되는 경우.
제어 결합도 (Control Coupling) 어떤 모듈이 다른 모듈 내부의 논리적인 흐름을 제어하는 제어 요소를 전달하는 경우.
외부 결합도 (External Coupling) 어떤 모듈이 외부에 있는 다른 모듈의 데이터를 참조하는 경우 (데이터, 통신 프로토콜 등).
공통 결합도 (Common Coupling) 여러 개의 모듈이 하나의 공통 데이터 영역(전역 변수 참조 및 갱신)을 사용하는 경우.
강함 내용 결합도 (Content Coupling) 어떤 모듈 내부에 있는 변수나 기능을 다른 모듈에서 사용하는 경우. 결합도가 가장 높고 가장 좋지 않은 형태이다.

Ref. 객체의 결합도 & 응집도 의미와 단계 💯 총정리[Inpa Dev 👨‍💻:티스토리]

결합도 기반 커버리지 기준

  1. 모든 결합 호출 커버리지
    • 모든 모듈 간 호출이 최소 한 번 실행되었는지 확인
  2. 모든 결합 데이터 항목 커버리지
    • 모듈 간 전달되는 모든 데이터 항목이 테스트되었는지 확인
  3. 모든 결합 조건 커버리지
    • 모듈 호출 시 발생할 수 있는 모든 조건이 테스트되었는지 확인
  4. 결합 경로 커버리지
    • 모듈 간 모든 가능한 데이터 흐름 경로가 테스트되었는지 확인

결합 경로

한 모듈에서 다른 모듈로 데이터가 전달되는 실행 경로

  • 단순 결합 경로: 두 모듈 간 직접적인 데이터 전달
  • 복합 결합 경로: 여러 모듈을 거쳐 데이터가 전달됨
  • 순환 결합 경로: 데이터가 원래 모듈로 돌아오는 경로
  • 조건부 결합 경로: 특정 조건에 따라 데이터 전달 경로가 변경됨

결합도 기반 테스트 전략

  1. 높은 결합도 우선 테스트
    • 내용 결합도, 공통 결합도 등 높은 결합도를 가진 모듈 간 상호작용 집중 테스트
  2. 복잡한 결합 경로 식별 및 테스트
    • 여러 모듈을 거치는 복잡한 데이터 흐름 경로에 대한 중점적 테스트
  3. 경계값 및 예외 상황 테스트
    • 모듈 간 데이터 전달 시 경계값과 예외 상황에 대한 처리 검증
  4. 결합도 감소를 위한 리팩토링 제안
    • 테스트 결과를 바탕으로 높은 결합도 감소를 위한 개선 방안 제시

통합 테스트 적용 시 고려사항

  1. 모듈 의존성 분석
  2. 테스트 우선순위 결정
  3. 스캐폴딩 코드 관리

모듈 의존성 분석

  • 정의
    • 시스템 내 모듈 간 관계와 상호작용 파악
  • 목적
    • 테스트 순서 결정
    • 잠재적 문제 영역 식별
    • 효율적인 테스트 계획 수립
  • 분석 방법
    • 의존성 그래프 작성
    • 순환 의존성 식별
    • 결합도 수준 평가
    • 인터페이스 복잡도 분석
  • 도구 활용
    • 정적 코드 분석 도구
    • UML 다이어그램

테스트 우선 순위 결정

  • 중요성
    • 제한된 시간과 자원의 효율적 활용
  • 우선순위 결정 기준
    • 비즈니스 중요도 > 리스크 수준 > 복잡도 > 변경 빈도 > 의존성 정도
  • 우선순위 결정 방법
    • 리스크 기반 접근법
    • 가중치 부여 방식
    • 전문가 판단

스캐폴딩 코드 관리

  • 정의
    • 테스트를 위해 임시로 사용되는 보조 코드 (스텁, 드라이버 등)
  • 목적
    • 아직 개발되지 않은 모듈의 기능 시뮬레이션
  • 주요 관리 포인트
    • 버전 관리
    • 문서화
    • 유지 보수
    • 제거 계획
  • 스캐폴딩 코드 작성 원칙
    • 단순성 유지
    • 실제 코드와 구분되는 명명 규칙 사용
    • 명확한 주석 처리
    • 최소한의 기능만 구현

ex)

public class PaymentStub implements PaymentGateway {
	@Override
    public boolean processPayment(double amount) {
    	// 항상 성공적인 결제 처리로 가정
    	System.out.println("stub: " + amount + "결제 처리됨");
        return true;
    }
}

통합 테스트 적용 프로세스

  1. 모듈 의존성 분석수행
  2. 분석 결과를 바탕으로 테스트 우선순위 결정
  3. 테스트 계획 수립
  4. 필요한 스캐폴딩 코드 설계 및 구현 우선순위에 따라 단계적으로 통합 테스트 실행
  5. 테스트 결과 분석 및 문제 해결
  6. 스캐폴딩 코드 관리 및 점진적 제거
  7. 프로세스 반복 및 개선

통합 테스트 장점

  • 시스템 전체 동작 검증: 개별 모듈의 정상 작동이 전체 시스템의 정상 작동을 보장하지 않음
  • 인터페이스 오류 조기 발견: 모듈 간 데이터 전달 및 통신 문제 식별
  • 실제 환경과 유사한 테스트: 프로덕션 환경에 가까운 조건에서 테스트 수행
  • 회귀 테스트 용이성: 시스템 변경 후 전체 기능의 정상 작동 확인 가능
  • 성능 및 확장성 검증: 여러 모듈이 결합된 상태에서의 성능 평가 가능
  • 문서화 및 명세 역할: 테스트 케이스가 시스템 동작의 명세 역할 수행

통합 테스트 단점

  • 테스트 환경 구축의 복잡성: 여러 모듈을 결합한 테스트 환경 설정에 시간과 비용 소요
  • 오류 원인 파악의 어려움: 여러 모듈이 관여하여 정확한 오류 위치 특정이 어려울수 있음
  • 테스트 실행 시간 증가: 단위 테스트에 비해 실행 시간이 길어짐
  • 의존성 관리의 어려움: 외부 시스템이나 리소스에 대한 의존성 처리 필요
  • 높은 유지보수 비용: 시스템 변경 시 관련 통합 테스트의 수정이 필요
  • 테스트 커버리지 확보의 어려움: 모든 가능한 시나리오를 커버하기 어려움
profile
어중이떠중이

0개의 댓글