테스트 설계의 기초|경계값 분석·동등 분할을 알기 쉽게 해설【QA 엔지니어용】

테스트 자동화

테스트 설계의 기초인 「경계값 분석」과 「동등 분할」은 QA 엔지니어가 가장 먼저 습득해야 할 기법입니다. 이 두 가지를 활용하면 테스트 케이스 수를 최소화하면서 버그가 숨어 있기 쉬운 곳을 효율적으로 검출할 수 있습니다.

경계값 분석·동등 분할을 올바르게 사용하면 「모든 패턴을 테스트하고 싶다」는 충동을 억제하면서 버그가 가장 발생하기 쉬운 곳에 집중하여 테스트할 수 있게 됩니다.

📌 이런 분께 추천합니다

  • 테스트 설계의 기초를 체계적으로 배우고 싶은 QA 엔지니어·개발자
  • 「어디까지 테스트하면 충분한가」로 고민하고 있는 분
  • 테스트 케이스가 너무 많아 관리가 어려워진 분
  • 자동 테스트 설계에 경계값·동등 분할을 활용하고 싶은 분

✅ 이 글을 읽으면 얻을 수 있는 것

  • 동등 분할·경계값 분석의 개념과 사용법을 알 수 있다
  • 테스트 케이스를 줄이면서 품질을 유지하는 설계를 할 수 있게 된다
  • 실무에서 자주 나오는 폼 유효성 검증에의 적용 방법을 알 수 있다

👤 이 글을 쓴 사람

QA 엔지니어·테스트 자동화 엔지니어로서 15년 이상의 실무 경험을 가진 Yoshi가 집필. 경계값 분석·동등 분할은 실제 프로젝트에서 매일 사용하는 기본 기법이며 자동 테스트 설계에도 직결되는 지식입니다. 구현 코드는 GitHub에 공개 중입니다: github.com/YOSHITSUGU728/automated-testing-portfolio

📌 결론

  • 동등 분할:같은 동작을 하는 데이터를 그룹화하여 대표값 1개로 테스트한다
  • 경계값 분석:그룹의 경계(끝)의 값을 중점적으로 테스트한다
  • 이 두 가지를 조합하면 적은 테스트 케이스로 높은 버그 검출률을 실현할 수 있다

「모든 패턴을 테스트해야 한다」고 생각하면 테스트 케이스는 끝없이 늘어납니다. 하지만 현실에는 시간도 리소스도 한정되어 있습니다. 테스트 설계 기법을 사용하면 다음과 같은 문제를 해결할 수 있습니다.

  • 테스트 케이스가 방대해져 관리할 수 없게 된다
  • 무엇을 테스트하면 충분한지 알 수 없다
  • 버그가 발생하기 쉬운 곳을 놓쳐버린다

이 글에서는 QA 현장에서 가장 많이 사용되는 두 가지 기본 기법「동등 분할」과「경계값 분석」을 구체적인 예시와 함께 알기 쉽게 해설합니다.

테스트 설계 기법이란?왜 필요한가

테스트 설계 기법이란 「어떤 값을 테스트하면 적은 테스트 수로 버그를 효율적으로 찾을 수 있는가」를 체계화한 접근법입니다.

예를 들어 나이 입력 필드(유효 범위:1〜120세)를 테스트하는 경우 1부터 120까지 전부 시도하면 확실하지만 현실적이지 않습니다. 테스트 설계 기법을 사용하면 같은 신뢰성을 유지하면서 테스트 수를 대폭 줄일 수 있습니다.

테스트 설계 없이 발생하는 문제:

  • 테스트 케이스 수가 무한히 늘어난다
  • 무엇을 테스트했는지·하지 않았는지가 모호해진다
  • 버그가 발생하기 쉬운 「경계」를 놓친다
  • 시간 초과로 중요한 테스트를 실행할 수 없게 된다
  • 사람에 따라 테스트 내용이 제각각이 된다
비교 항목설계 기법 없음설계 기법 있음
테스트 케이스 수방대·관리 곤란최소한·정리된 상태
버그 검출 효율누락이 많다중요 부분을 망라할 수 있다
팀에서의 공유개인 의존·제각각재현성이 있어 공유하기 쉽다
자동화와의 궁합테스트 수가 많아 무거워진다parametrize와 조합하기 쉽다

① 동등 분할(Equivalence Partitioning)

동등 분할이란 「같은 동작을 할 것으로 기대되는 데이터를 그룹(동등 클래스)으로 나누고 각 그룹에서 대표값을 1개만 테스트하는」 기법입니다.

그룹 내의 어떤 값도 같은 결과가 된다고 가정하므로 그룹 전체를 1개의 값으로 대표할 수 있습니다.

구체적인 예:나이 입력 필드(유효 범위:1〜120세)

동등 클래스값의 범위대표값(예)기대 결과
✅ 유효 클래스1 〜 12050정상적으로 수신
❌ 무효 클래스①0 이하-1 또는 0에러 메시지 표시
❌ 무효 클래스②121 이상121 또는 200에러 메시지 표시
❌ 무효 클래스③숫자 이외“abc” 또는 빈 문자열에러 메시지 표시
💡 포인트:1〜120 사이의 값은 모두 「같은 동작」을 할 것입니다. 50으로 테스트하여 통과하면 10이나 80도 통과한다고 생각하는 것이 동등 분할의 사고방식입니다. 대표값은 범위의 중앙 부근을 선택하는 것이 일반적입니다.

동등 분할의 요령

동등 클래스를 찾으려면 사양서의 조건에 주목합니다.

사양의 조건유효 클래스무효 클래스
1〜120의 정수1〜120의 정수0 이하 / 121 이상 / 소수 / 문자열
비밀번호 8〜20자8〜20자의 문자열7자 이하 / 21자 이상 / 빈 문자열
이메일 주소 형식xxx@xxx.xxx 형식@ 없음 / 도메인 없음 / 빈 문자열

② 경계값 분석(Boundary Value Analysis)

경계값 분석이란 「동등 클래스의 경계(끝)의 값을 중점적으로 테스트하는」 기법입니다. 버그는 경계 부근에서 가장 많이 발생한다는 것이 통계적으로 알려져 있으며 동등 분할과 조합하면 매우 높은 효과를 발휘합니다. 경계 부근에서는 조건 분기(>=·<= 등)의 실수가 발생하기 쉽고 개발자가 예상하지 못한 값이 들어오기 쉽기 때문입니다.

왜 경계에서 버그가 발생하기 쉬운가?

개발자가 자주 저지르는 실수의 전형적인 예입니다.

자주 있는 실수잘못된 코드 예올바른 코드 예
Off-by-one 에러if age > 1 and age < 120if age >= 1 and age <= 120
부등호 방향 실수if length < 8(8자에서 에러)if length <= 8(8자는 OK)

경계값 선택 방법(3점법)

경계값 분석에서는 각 경계에 대해 「경계의 1개 앞」「경계값 자체」「경계의 1개 뒤」의 3점을 테스트합니다.

경계경계값 -1경계값경계값 +1
하한(1)0 ❌ 무효1 ✅ 유효2 ✅ 유효
상한(120)119 ✅ 유효120 ✅ 유효121 ❌ 무효
💡 2점법과 3점법:엄밀히는 「경계값」「경계값 +1」의 2점만으로도 유효합니다(2점법). 3점법은 「경계값 -1」을 추가하면 망라성이 더욱 높아집니다. 테스트에 할애할 수 있는 시간에 따라 사용 구분하세요.

③ 동등 분할 × 경계값 분석의 조합

실무에서는 두 가지 기법을 조합하여 사용합니다. 동등 분할로 그룹을 정리하고 경계값 분석으로 각 그룹의 끝을 중점 테스트하는 것이 기본 패턴입니다.

실제 예:비밀번호 문자 수 유효성 검증(8〜20자)

테스트 케이스분류기대 결과
TC-017자하한 경계값 -1(무효)❌ 에러
TC-028자하한 경계값(유효)✅ 정상
TC-039자하한 경계값 +1(유효)✅ 정상
TC-0414자유효 클래스 대표값(동등 분할)✅ 정상
TC-0519자상한 경계값 -1(유효)✅ 정상
TC-0620자상한 경계값(유효)✅ 정상
TC-0721자상한 경계값 +1(무효)❌ 에러
TC-080자(빈 문자열)무효 클래스 대표값(동등 분할)❌ 에러

이 8건의 테스트 케이스로 비밀번호 유효성 검증의 거의 모든 중요한 패턴을 망라할 수 있습니다. 무분별하게 늘리는 것보다 이 8건을 확실히 실행하는 편이 품질이 더 높아집니다.

④ 자동 테스트(pytest parametrize)에의 응용

동등 분할·경계값 분석으로 설계한 테스트 케이스는 pytest의 @pytest.mark.parametrize와 궁합이 최상입니다. 표로 정리한 값을 그대로 파라미터로 전달할 수 있습니다.

import pytest

def validate_password_length(password: str) -> bool:
    """비밀번호가 8〜20자인지 검증한다"""
    return 8 <= len(password) <= 20

# 동등 분할 × 경계값 분석을 그대로 파라미터화
@pytest.mark.parametrize("password, expected", [
    # 경계값(하한)
    ("a" * 7,  False),  # TC-01: 7자 → 무효
    ("a" * 8,  True),   # TC-02: 8자 → 유효(하한 경계값)
    ("a" * 9,  True),   # TC-03: 9자 → 유효

    # 유효 클래스 대표값(동등 분할)
    ("a" * 14, True),   # TC-04: 14자 → 유효

    # 경계값(상한)
    ("a" * 19, True),   # TC-05: 19자 → 유효
    ("a" * 20, True),   # TC-06: 20자 → 유효(상한 경계값)
    ("a" * 21, False),  # TC-07: 21자 → 무효

    # 무효 클래스 대표값(동등 분할)
    ("",       False),  # TC-08: 빈 문자열 → 무효
])
def test_password_validation(password, expected):
    assert validate_password_length(password) == expected
💡 실무 팁:테스트 설계 표(테스트 케이스 목록)를 먼저 작성하고 그것을 그대로 코드에 반영하는 흐름이 실무 베스트 프랙티스입니다. 「왜 이 값을 테스트하고 있는가」가 코드 코멘트에서 알 수 있도록 해 두면 나중에 유지보수할 때도 헤매지 않습니다.

⑤ 테스트 설계에서 자주 있는 실패 패턴

동등 분할·경계값 분석을 배워도 실무에서는 다음과 같은 실패를 하기 쉽습니다. 미리 파악해 두면 설계 정확도가 크게 향상됩니다.

① 경계값만 테스트하고 동등 클래스를 만들지 않는다

경계값(1·2·119·120·121 등)만을 테스트하고 끝내버리는 케이스입니다. 동등 클래스가 없으면 「숫자 이외의 입력(문자열·빈 문자열 등)」의 무효 클래스가 누락됩니다. 반드시 동등 분할로 클래스를 정리한 후 경계값을 선택하는 순서를 지키세요.

② 유효 클래스를 테스트하지 않고 비정상계만 확인한다

「에러가 나지 않는 것」만 확인하고 「정상적으로 동작하는 것」을 테스트하지 않는 패턴입니다. 유효 클래스의 대표값 테스트(정상계)를 생략하면 정상적인 입력으로 올바른 처리가 이루어지고 있는지를 확인할 수 없습니다. 정상계·비정상계 양쪽이 필수입니다.

③ 사양서의 조건을 보지 않고 「감각적으로」 테스트 케이스를 만든다

「대충 5·10·100을 시도해 보자」는 감각적인 테스트는 설계 기법의 정반대입니다. 동등 클래스는 반드시 사양서의 조건(「1〜120」「8〜20자」등)에서 도출합니다. 사양이 모호한 경우에는 먼저 사양을 명확히 하는 것이 선결 과제입니다.

④ 경계값을 1개만 테스트한다

「상한은 120이니까 120만 테스트하면 된다」고 생각하기 쉽지만 경계값 분석의 요점은 「경계의 전후」를 포함한 여러 점을 확인하는 것입니다. 120만의 테스트로는 「121이 올바르게 에러가 되는가」「119가 올바르게 통과되는가」를 검증할 수 없습니다. 최소한 경계값과 그 외측 1점의 2점을 테스트하세요.

FAQ

Q. 동등 분할과 경계값 분석 중 어느 것을 먼저 해야 하나요?

반드시 동등 분할을 먼저 합니다. 먼저 그룹(동등 클래스)을 특정하고 각 그룹의 경계를 경계값 분석으로 테스트하는 것이 올바른 순서입니다. 경계값은 그룹이 없으면 정의할 수 없으므로 동등 분할이 토대가 됩니다.

Q. 유효 클래스 테스트도 필요한가요?무효 클래스만으로는 안 되나요?

양쪽 모두 필요합니다. 유효 클래스 테스트(정상계)는 「올바른 입력으로 올바르게 동작하는 것」을 확인합니다. 무효 클래스 테스트(비정상계)는 「잘못된 입력을 적절히 거부할 수 있는 것」을 확인합니다. 어느 한쪽만으로는 품질을 보증할 수 없습니다.

Q. 경계값은 반드시 「-1 / 경계값 / +1」의 3점을 테스트해야 하나요?

시간에 여유가 있으면 3점법이 이상적이지만 최소한 「경계값 자체」와 「그 외측 1개」의 2점은 반드시 테스트하세요. 실무에서는 우선도가 높은 테스트부터 3점법을 적용하고 우선도가 낮은 것은 2점법으로 간략화하는 경우도 많습니다.

Q. 이 기법들은 수동 테스트뿐만 아니라 자동 테스트에도 사용할 수 있나요?

오히려 자동 테스트와 매우 궁합이 좋은 기법입니다. pytest의 @pytest.mark.parametrize를 사용하면 동등 분할·경계값 분석으로 설계한 테스트 케이스 목록을 그대로 파라미터로 전달할 수 있습니다. 설계와 구현이 직결되므로 테스트의 의도가 코드에서 읽어낼 수 있는 상태가 됩니다.

📋 이 글의 정리

  • 동등 분할:같은 동작을 하는 값을 그룹화하여 대표값 1개로 테스트하면 케이스 수를 줄일 수 있다
  • 경계값 분석:그룹의 끝(경계)의 값을 중점 테스트하여 Off-by-one 에러 등을 효율적으로 발견할 수 있다
  • 조합이 기본:동등 분할로 그룹을 정의하고 경계값 분석으로 각 경계를 3점 테스트하는 것이 실무의 표준 패턴
  • pytest와의 궁합◎@pytest.mark.parametrize를 사용하면 설계한 테스트 케이스 표를 그대로 코드로 변환할 수 있다

「모든 패턴을 테스트해야 한다」는 압박에서 해방되는 것이 테스트 설계 기법을 배우는 최대 장점입니다. 동등 분할과 경계값 분석을 사용하면 적은 테스트 케이스로 높은 신뢰성을 실현할 수 있습니다. 먼저 가까운 폼 유효성 검증에 적용해 보세요.

제목과 URL을 복사했습니다