결정 테이블 테스트로 복잡한 비즈니스 규칙 검증하기

결정 테이블 테스트의 조건·행동 모델링, 규칙 축약, 충돌·누락 검증과 추적성 관리 방법을 정리한다.

2026-08-14 · 최초 발행 2025-12-17

규칙이 늘어날수록 테스트는 조합을 놓치기 쉽다

대출 승인, 요금 할인, 보험 심사, 접근 제어처럼 조건이 얽힌 로직은 개별 조건만 확인해서는 충분하지 않다. 조건의 조합에 따라 행동이 달라지고, 같은 입력에 상반된 결과가 정의되거나 특정 조합이 아예 빠질 수 있다.

결정 테이블 테스트(Decision Table Testing)는 조건과 행동의 유효한 조합을 표로 정리한 뒤, 각 규칙을 테스트 케이스로 전개하는 설계 기법이다. 조건의 도메인과 상호 제약을 함께 기록하므로 복잡한 비즈니스 규칙을 검증하기에 맞는다. 목표는 모든 유효 조합을 포함하는 완전성, 충돌과 중복이 없는 일관성, 그리고 요구사항·규칙·테스트 케이스를 잇는 추적성이다.

결정 테이블은 조건 집합, 행동 집합, 규칙 컬럼으로 구성한다. 규칙 하나는 조건 값의 조합과 그때 기대하는 행동을 1:1로 연결한다.

조건을 정의하고 규칙을 줄이는 방식

조건은 이진 값일 수도 있고 여러 값을 갖는 도메인일 수도 있다. 모델을 만들 때는 상호배타 관계, 의존성, 범위 제약을 명시해야 한다. 행동 역시 하나만 발생할 수도, 여러 행동이 함께 발생할 수도 있으므로 실행 우선순위와 상호배제 정책을 정한다.

규칙 전개는 조건의 데카르트 곱에서 시작한다. 이때 실제로 성립하지 않는 조합은 제약으로 제외한다. 이후 같은 행동을 내는 규칙에서 특정 조건이 결과에 영향을 주지 않는다면 무관값(-) 또는 와일드카드로 병합할 수 있다. 이 축약은 테스트 수가 불필요하게 커지는 문제를 줄인다.

완성된 테이블에서는 두 가지를 확인한다.

  • 동일 조건에 서로 충돌하는 행동이 정의되지 않았는지 확인한다. 충돌은 우선순위를 정하거나 선결조건을 추가해 해소한다.
  • 유효 조건 조합 중 행동이 정의되지 않은 영역이 없는지 확인한다. 행(조건) 커버리지, 규칙 커버리지, 결정/행동 커버리지 지표를 사용할 수 있다.

요구사항이 바뀌면 전체 테스트를 다시 설계하기보다 영향을 받는 규칙을 갱신할 수 있다. 규칙 ID, 출처 요구사항, 테스트 케이스를 연결해 두면 양방향 추적성도 확보된다.

테이블에서 테스트 케이스까지 이어지는 흐름

입력은 요구사항, 비즈니스 규칙, 조건 도메인과 제약, 테스트 기준이다. 조건과 행동을 식별한 뒤 비유효 조합을 선언하고, 규칙을 전개·축약한다. 충돌과 누락을 점검한 다음 테스트 케이스와 우선순위를 산출한다. 결과물은 축약된 결정 테이블, 테스트 케이스 목록, 커버리지 리포트, 추적성 매트릭스다.

아니오아니오시작요구사항/규칙 수집조건/행동 식별도메인/제약 정의결정 테이블 초기화조합 전개(데카르트 곱)무관값('-') 축약 수행충돌/중복 존재 여부우선순위 정의 또는 선결조건추가완전성/커버리지 검사누락 규칙 존재 여부테스트 케이스 산출 우선순위부여추적성매핑(요구사항↔규칙↔TC)커버리지 리포트 생성종료

규칙 중심 도메인에서의 활용

금융의 대출·카드 승인 로직에서는 신용등급, 연체 여부, 소득 구간, 부채비율을 조건으로 두고 승인·거절·재검토와 한도·금리 산정을 행동으로 둘 수 있다. 규제 준수 규칙과 내부 한도 정책도 같은 테이블에서 병합해 관리할 수 있다.

통신·플랫폼의 요금제 과금과 프로모션에는 가입 기간, 사용량 구간, 프로모션 코드, 결제 수단이 조건이 된다. 할인율, 무료 혜택 적용 여부, 과금 라인아이템 생성이 결과로 연결된다.

보험 언더라이팅과 청구 심사에서는 연령대, 위험군, 가입 이력, 사고 빈도, 코드 조합을 기준으로 인수·부담보·거절과 추가 심사 트리거, 보험료 계수를 결정한다.

접근 제어와 정책 엔진도 대표적인 적용 대상이다. 역할, 리소스, 액션, 시간대, 리스크 점수에 따라 허용·차단·다단계 인증 요구와 감사 로그 수준을 규칙으로 정의할 수 있다.

다른 테스트 기법과 함께 보는 선택 기준

기법 성능(생성 효율) 확장성(규칙 증가 대응) 일관성(충돌 검출) 안정성(변경 내성) 운영 편의(추적성)
결정 테이블
상태 전이 테스트
경계값/동등 분할
페어와이즈(조합 축약)

결정 테이블은 규칙 충돌과 누락을 찾고 추적성을 유지하는 데 강하다. 반면 조건이 늘어날수록 초기 모델링 비용이 커질 수 있다. 조합 수를 관리해야 하는 경우 페어와이즈를 함께 적용해 테스트 수를 최적화할 수 있다.

Python으로 규칙을 전개하고 축약하는 예시

전제는 Python 3.10+와 표준 라이브러리다. 아래 예시는 조건 도메인과 제약을 입력받아 규칙을 전개하고, 무관값(-) 축약을 거쳐 테스트 케이스를 도출한다.

from itertools import product

# 1) 조건 도메인 정의
domains = {
    "credit_grade": ["A", "B", "C"],   # 신용등급
    "delinquent":   [True, False],     # 연체 여부
    "dti":          ["LOW", "HIGH"],   # 부채비율 구간
}

# 2) 비유효 조합 제약(람다로 정의)
def invalid(combo):
    # 예: 연체 True 이면서 등급 C 는 Always 거절 → 테스트는 가능하나 승인 규칙과 충돌 금지
    # 제약은 '테이블 전개에서 제외할 조합'만 명시
    return False  # 이번 예시는 모든 조합 허용

# 3) 행동 결정 로직(단순화)
def decide(rule):
    c, d, t = rule["credit_grade"], rule["delinquent"], rule["dti"]
    if d:  # 연체
        return "REJECT"
    if c == "A" and t == "LOW":
        return "APPROVE"
    if c == "B" and t == "LOW":
        return "REVIEW"
    return "REJECT"

# 4) 규칙 전개
keys = list(domains.keys())
all_rules = []
for values in product(*domains.values()):
    rule = dict(zip(keys, values))
    if not invalid(rule):
        rule["action"] = decide(rule)
        all_rules.append(rule)

# 5) 단순 축약: 행동이 동일하고 특정 조건이 전체 도메인을 포괄하면 '-' 처리
def try_merge(rules, key):
    merged = []
    used = set()
    for i, r1 in enumerate(rules):
        if i in used:
            continue
        merged_rule = r1.copy()
        for j, r2 in enumerate(rules[i+1:], start=i+1):
            if j in used:
                continue
            # key 값만 다르고 나머지와 action 동일하면 병합
            if all(k == key or r1[k] == r2[k] for k in keys) and r1["action"] == r2["action"]:
                merged_rule[key] = "-"
                used.add(j)
        merged.append(merged_rule)
        used.add(i)
    return merged

rules = all_rules
for k in keys:
    rules = try_merge(rules, k)

# 6) 출력
for r in rules:
    print({k: r[k] for k in keys} | {"action": r["action"]})

출력에서 특정 조건 컬럼이 -로 표시되면 해당 조건 값과 무관하게 같은 행동이 발생한다는 뜻이다. 실제 프로젝트에서는 DMN, Excel 또는 DSL과 연계해 규칙을 관리할 수 있다.

운영 과정에서 지킬 기준

조건 도메인은 정규화하고 상호배타·포함 관계를 밝혀 둔다. 다치 조건은 의미 있는 버킷으로 사전에 군집화하며, 불가능한 조합은 제약으로 배제한다. 무관값(-)은 축약 규칙으로 관리한다.

규칙 ID와 출처 요구사항, 근거 문서 링크를 연결하면 변경된 규칙만 회귀 테스트할 수 있다. 커버리지 기준으로는 규칙 커버리지 100%, 조건-행동 결정 커버리지 90% 이상을 목표로 둘 수 있다.

운영에서는 Git 기반 버전 관리와 병렬 리뷰를 적용하고, DMN·BDD(Gherkin)와 연결해 실행 가능한 명세로 다룰 수 있다. 조건 규모가 큰 경우 페어와이즈를 혼합해 테스트 수를 30~60% 절감한다.

무관값과 축약을 적용하면 테스트 케이스 수를 3060% 줄일 수 있고, 규칙 충돌·누락을 조기에 발견해 결함 발견율 1025% 향상을 기대할 수 있다. 변경 영향 범위를 좁히면 회귀 테스트 리드타임도 20~40% 단축된다. 규칙을 표로 공유하는 방식은 비즈니스·QA·개발 조직의 공통 언어를 만들고, 컴플라이언스 준수와 감사 지원을 위한 증거 자료로도 활용된다.

결정 테이블 테스트테스트 설계비즈니스 규칙규칙 검증소프트웨어 품질