경계값 분석 (Boundary Value Analysis, BVA)

경계값 분석은 입력 또는 출력 범위의 경계 근처에서 결함이 발생할 가능성이 높다는 경험적 관찰에 기반한 테스트 기법.
프로그래머들이 흔히 “off-by-one” 오류를 범하거나 경계 조건을 잘못 처리하는 경향이 있기 때문에, 이러한 경계값을 집중적으로 테스트하는 것이 효과적이다.

예를 들어, 어떤 시스템이 1에서 100 사이의 숫자만 받아들인다고 가정해보자.
이때 0, 1, 2와 99, 100, 101 같은 경계값들을 테스트하는 것이 중요하다.
왜냐하면 이러한 값들에서 시스템이 올바르게 작동하지 않을 가능성이 높기 때문이다.

경계값 분석의 주요 원칙

경계값 분석에는 다음과 같은 핵심 원칙들이 있다:

  1. 최소값과 최대값 테스트:
    유효 범위의 최소값과 최대값을 반드시 테스트한다.
    예를 들어, 1-100 범위라면 1과 100을 테스트한다.

  2. 경계 근처의 값 테스트:
    경계값 바로 안쪽과 바깥쪽의 값을 테스트한다.
    1-100 범위의 경우:

    • 최소값 경계: 0, 1, 2
    • 최대값 경계: 99, 100, 101

대표적인 경계값 상황들

날짜와 시간:

  • 윤년/평년 전환 (2월 28일, 29일)
  • 월말/월초 전환 (31일, 1일)
  • 자정 전후 (23:59:59, 00:00:00)

수치 데이터:

  • 정수 자료형의 최대/최소값
  • 부동소수점 정밀도 한계
  • 배열의 첫 번째/마지막 요소

문자열 처리:

  • 빈 문자열
  • 최대 길이 문자열
  • 특수문자가 포함된 경계

실제 적용 예시

학생 성적 처리 시스템을 예로 들어보자다:

점수 범위: 0-100점
등급 기준:

  • A: 90-100
  • B: 80-89
  • C: 70-79
  • D: 60-69
  • F: 0-59

이 시스템의 경계값 테스트 케이스는 다음과 같이 설계할 수 있다:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
테스트 케이스 세트:

1. 최저 경계
- 입력값: -1 (유효하지 않은 값)
- 입력값: 0 (최소 유효값)
- 입력값: 1 (최소값 바로 위)

2. 등급 경계
- 입력값: 59, 60, 61 (F/D 경계)
- 입력값: 69, 70, 71 (D/C 경계)
- 입력값: 79, 80, 81 (C/B 경계)
- 입력값: 89, 90, 91 (B/A 경계)

3. 최고 경계
- 입력값: 99 (최대값 바로 아래)
- 입력값: 100 (최대 유효값)
- 입력값: 101 (유효하지 않은 값)

효과적인 경계값 분석을 위한 지침

  1. 테스트 범위 결정:
    입력값뿐만 아니라 출력값의 경계도 고려한.
    예를 들어, 화면에 표시되는 데이터의 크기나 형식에 대한 경계값도 테스트한다.

  2. 데이터 타입 고려:
    각 데이터 타입별로 특별히 고려해야 할 경계값들이 있다:

    • 정수형: 최대/최소값, 부호 전환점
    • 실수형: 정밀도 한계, 반올림/올림/내림 경계
    • 문자열: 길이 제한, 인코딩 경계
  3. 복합 경계값:
    여러 조건이 결합된 경우, 각 조건의 경계값들을 조합하여 테스트한다.
    예를 들어:

    • 날짜와 시간이 결합된 경우
    • 다중 범위 조건이 있는 경우
    • 여러 입력 필드가 서로 연관된 경우

주요 특징

  • 모든 테스트 레벨, 테스트 형태, 테스트 분류에 적용 가능하다.
  • 결함 발견율이 높고 적용하기 쉬운 장점이 있어 가장 많이 사용되는 테스트 기법 중 하나이다.
  • 경계값을 명시한 자세한 명세서가 있을 경우 적용하기가 수월하다.

경계값 분석의 종류

  1. Boundary Value Analysis: 입력 범위의 경계값과 그 주변 값을 중점적으로 테스트하는 기법.
    특징:
    - 입력 도메인의 최소값, 최대값, 그리고 그 주변 값을 테스트한다.
    - 유효한 입력 범위 내의 값들만 테스트한다.
    - 많은 오류가 경계값 근처에서 발생한다는 경험에 기반한다.
    예시1: 연령 입력 필드(유효 범위: 18-65세)에 대한 테스트 케이스.

    • 테스트 케이스:
      • 17세 (최소값 미만)
      • 18세 (최소값)
      • 19세 (최소값 초과)
      • 64세 (최대값 미만)
      • 65세 (최대값)
      • 66세 (최대값 초과)
  2. Robustness Testing: 유효하지 않은 입력값과 예상치 못한 상황에 대한 시스템의 대응을 테스트하는 기법.
    특징:
    - 유효한 입력 범위를 벗어난 값들도 테스트한다.
    - 시스템의 안정성과 오류 처리 능력을 평가한다.
    예시: 연령 입력 필드(유효 범위: 18-65세)에 대한 테스트 케이스.

    • 테스트 케이스:
      • -1세 (음수 값)
      • 0세 (최소값보다 작은 유효하지 않은 값)
      • 100세 (최대값보다 큰 유효하지 않은 값)
      • “ABC” (문자열 입력)
  3. Worst-Case Testing: 시스템이 처리할 수 있는 극단적인 상황을 테스트하는 기법.
    특징:
    - 여러 입력 변수의 극단적인 값 조합을 사용한다.
    - 시스템의 한계를 테스트한다.
    예시1: 사용자 등록 시스템에서의 Worst-Case Testing.

    • 테스트 케이스:
      • 이름: 최대 허용 길이의 문자열
      • 나이: 시스템이 허용하는 최대 나이 (예: 120세)
      • 이메일: 최대 길이의 유효한 이메일 주소
      • 비밀번호: 최대 허용 길이의 복잡한 문자열
  4. Robust worst-case Testing: Worst-Case Testing과 Robustness Testing을 결합한 기법.
    특징:
    - 극단적인 유효값과 유효하지 않은 값을 모두 테스트한다.
    - 가장 포괄적인 경계값 테스팅 방법이다.
    예시1: 사용자 등록 시스템에서의 Robust worst-case Testing.

    • 테스트 케이스:
      • 이름: 빈 문자열 또는 특수 문자만으로 구성된 최대 길이 문자열
      • 나이: -1, 0, 최대 허용 나이보다 큰 값 (예: 150세)
      • 이메일: 유효하지 않은 최대 길이 문자열
      • 비밀번호: 빈 문자열 또는 시스템 제한을 초과하는 길이의 문자열

장점

  • 결함 발견 효율성이 높다
  • 테스트 케이스 수를 체계적으로 줄일 수 있다
  • 구현 오류를 효과적으로 찾아낼 수 있다

한계

  • 모든 가능한 결함을 찾아내지는 못한다
  • 복잡한 로직의 경우 경계값 정의가 어려울 수 있다
  • 여러 변수가 결합된 경우 테스트 케이스가 급증할 수 있다

자동화 및 도구 활용

경계값 분석을 자동화하기 위한 방법들:

  1. 테스트 데이터 생성기:

    • 정의된 범위에 대한 경계값을 자동으로 생성
    • 다양한 데이터 타입에 대한 경계값 생성 지원
    • 랜덤 테스트와의 결합 가능
  2. 테스트 프레임워크:

    • 경계값 테스트를 위한 특별한 어노테이션이나 기능 제공
    • 테스트 결과의 자동 검증
    • 테스트 커버리지 측정

참고 및 출처