원인-결과 그래프로 설계하는 논리 기반 테스트
원인-결과 그래프로 복잡한 비즈니스 규칙을 논리식과 의사결정 테이블로 변환해 테스트 케이스를 설계하는 방법을 다룬다.
2026-08-14 · 최초 발행 2025-12-22
복잡한 비즈니스 규칙은 조건을 나열하는 방식만으로 검증하기 어렵다. 원인-결과 그래프(Cause-Effect Graphing)는 입력 조건과 시스템 반응을 논리적으로 연결해, 필요한 테스트 조합을 선별하는 데 쓰는 기법이다. 금융·통신·보험·공공 분야의 규칙 엔진, 접근제어, 요금·정책 산정처럼 조건 조합이 많은 영역에 잘 맞는다.
조건과 반응의 논리 관계를 모델링하는 방법
원인-결과 그래프는 입력 조건인 원인(Cause)과 출력 또는 시스템 행위인 결과(Effect)를 AND, OR, NOT 같은 논리 연산과 제약 규칙으로 연결해 표현한다. 완성한 그래프는 의사결정 테이블로 옮기고, 이를 바탕으로 최소 테스트 세트를 도출한다.
이 기법의 목적은 논리적 일관성을 확보하고, 조합 폭발을 줄이며, 요구사항과 테스트 사이의 추적성을 높이는 데 있다. 의사결정 테이블, Boolean Algebra, MC/DC(Multiple Condition/Decision Coverage), 상태 전이 테스트와도 상호보완적으로 사용할 수 있다.
원인은 참과 거짓으로 환원 가능한 입력 변수로 정의한다. 예를 들어 “계정 유효”, “2FA 등록”이 원인이 될 수 있다. 결과는 “로그인 허용”, “추가 인증 요구”처럼 사용자가 확인할 수 있는 시스템 반응이나 내부 상태 변화로 잡는다.
논리 관계에는 AND, OR, NOT, XOR뿐 아니라 조건부 함의(Requires), 상호 배타(Exclusive), 단 하나만(One-and-only-one) 같은 제약도 포함된다. 이런 제약을 모델에 반영하면 성립하지 않는 조합을 제거하고 유효한 조합에 테스트를 집중할 수 있다.
그래프의 경로나 논리식은 의사결정 테이블의 규칙 컬럼으로 변환한다. 각 컬럼에는 원인 값의 패턴과 기대 결과가 들어가며, 이후 중복 컬럼을 합치고 마스킹 또는 충돌 규칙을 해소해 테스트 대상을 줄인다.
커버리지 기준은 결과 커버리지, 원인-결과 링크 커버리지, MC/DC 기반 최소 세트 등에서 선택할 수 있다. 고위험 경로에는 리스크 기반 가중치를 적용해 우선순위를 둘 수 있다. 원인·결과·규칙에 식별자를 부여하면 요구사항과 테스트를 양방향으로 추적할 수 있고, 규칙 변경 시 영향 범위를 분석하거나 회귀 테스트를 고르는 데도 유리하다.
요구사항에서 테스트 케이스까지 이어지는 흐름
입력으로는 요구사항 명세, 비즈니스 규칙, 도메인 제약을 수집하고 용어 사전·값 범주·경계 조건을 확정한다.
처리는 원인과 결과 후보를 추출해 이진화하는 데서 시작한다. 이어 Requires, Exclusive, OAO 등의 제약을 정의하고 논리 그래프를 작성한다. 그래프의 모순과 중복을 검토한 뒤 의사결정 테이블로 변환해 중복을 제거한다. 커버리지 기준에 따라 최소 테스트 세트를 산출하고, 리뷰와 리스크 기반 보완을 거친다.
최종 산출물은 테스트 조건 목록, 최종 테스트 케이스, 추적 매트릭스, 무효 조합 리스트다.
인증 정책을 논리식으로 분해하기
웹 또는 모바일 로그인 정책에서는 다음 조건을 원인으로 둘 수 있다.
- C1: 계정 유효
- C2: 비밀번호 유효
- C3: 신뢰 IP
- C4: 2FA 등록
- C5: 2FA 코드 제공
여기서 Requires(C5 → C4) 제약을 적용한다. 또한 “신뢰 IP”와 “추가 인증 요구” 효과는 동시에 발생할 수 없도록 Exclusive 제약을 둔다.
결과는 다음과 같이 정의할 수 있다.
- E1: 로그인 허용
- E2: 추가 인증 요구
- E3: 접근 거부
논리식은 다음과 같다.
- E1 = C1 ∧ C2 ∧ (C3 ∨ (C4 ∧ C5))
- E2 = C1 ∧ C2 ∧ ¬C3 ∧ C4 ∧ ¬C5
- E3 = ¬C1 ∨ ¬C2
이를 바탕으로 최소 테스트 세트를 구성하면 다음과 같다.
- TC1: T,T,T,F,F → E1
- TC2: T,T,F,T,T → E1
- TC3: T,T,F,T,F → E2
- TC4: F,,,, → E3
- TC5: T,F,,,* → E3
*는 결과에 영향을 주지 않는 무관 값을 뜻하며, 제약을 위반하는 조합은 제외한다.
보험 규칙처럼 결합 조건이 많은 경우
보험 언더라이팅 규칙에서는 연령 구간, 흡연 여부, 직군 위험도, 과거 청구 이력 여부, 건강검진 결과 적합 여부를 원인으로 둘 수 있다. 결과는 자동 인수, 추가 서류 요청, 인수 거절로 나뉜다.
이런 모델은 규칙 엔진 변경 시 영향 범위를 명확히 하는 데 도움이 된다. 5원인을 이진화하면 32조합이지만, 제약을 적용하면 12~16조합 수준으로 결합 폭발을 억제할 수 있다.
다른 테스트 기법과 함께 선택하기
| 기법 | 성능/커버리지 | 복잡성 처리 | 일관성 | 안정성(변경 내성) | 운영 편의 |
|---|---|---|---|---|---|
| 원인-결과 그래프 | 논리 경로 커버리지 우수 | 다수 제약·XOR 처리 강점 | 높은 추적성 | 규칙 변경에 강함 | 초기 학습 필요 |
| 의사결정 테이블 | 명확한 규칙 표현 | 중간(조합 폭발 위험) | 높음 | 변경 시 표 재작성 부담 | 작성 난이도 중 |
| 경계값 분석 | 수치 경계 검증 특화 | 낮음(논리 조합 미흡) | 중간 | 범위 변경에 강함 | 매우 용이 |
| 상태 전이 테스트 | 순서/이력 처리 강점 | 중간~높음 | 높음 | 상태 추가에 민감 | 도구 의존성 있음 |
규칙과 조건 조합이 본체인 과제에는 원인-결과 그래프를 우선 적용한다. 수치 범위가 핵심이면 경계값 분석을 보완하고, 이력이나 순서가 결과에 영향을 주면 상태 전이 테스트를 병행한다.
모델을 유지하는 과정에서 생기는 비용
원인과 결과는 명확하게 참·거짓으로 환원하고, 다치(多値) 값은 분해하는 편이 좋다. Requires, Exclusive, OAO 같은 제약을 먼저 정의하면 조합을 초기에 줄일 수 있다. C1..Cn, E1..Em 식별자를 요구사항 ID와 연결하고, 결과·링크·MC/DC 중 어떤 커버리지 기준을 사용할지 프로젝트 리스크에 맞춰 합의한다.
비즈니스·개발·QA 3자가 함께 검토하는 루프도 필요하다. 이 과정에서 모호성을 해소할 체크리스트를 운영할 수 있다.
대신 초기 모델링 비용이 늘고 도메인 전문가의 시간이 필요하다. 규칙이 자주 바뀌면 그래프와 테이블을 함께 유지해야 하며, 순차적이거나 시간 의존적인 로직은 상태 전이 모델을 병행해야 한다.
Python으로 제약 조합을 걸러내기
전제: Python 3.10+, 표준 라이브러리만 사용
from itertools import product
# 원인: C1 계정유효, C2 비밀번호유효, C3 신뢰IP, C4 2FA등록, C5 2FA코드제공
def effects(c1, c2, c3, c4, c5):
# 제약: C5 -> C4 (C5 True이면 C4 True이어야 함)
if c5 and not c4:
return None # 무효 조합
e1 = c1 and c2 and (c3 or (c4 and c5))
e2 = c1 and c2 and (not c3) and c4 and (not c5)
e3 = (not c1) or (not c2)
return (e1, e2, e3)
def generate_tests():
tests = []
for c1, c2, c3, c4, c5 in product([False, True], repeat=5):
eff = effects(c1, c2, c3, c4, c5)
if eff is None:
continue
e1, e2, e3 = eff
if any((e1, e2, e3)):
tests.append(((c1, c2, c3, c4, c5), (e1, e2, e3)))
return tests
all_tests = generate_tests()
# 간단 최소화 휴리스틱: 서로 다른 효과 패턴을 최소 1건씩 대표 선정
selected = {}
for inp, eff in all_tests:
selected.setdefault(eff, inp)
print("선정 테스트 수:", len(selected))
for eff, inp in selected.items():
print("입력:", inp, "=> 효과:", eff)
제약을 코드로 먼저 표현하면 무효 조합을 제거할 수 있다. MC/DC 최적화에는 추가 알고리즘이 필요하지만, 효과 패턴마다 대표 테스트를 선정하는 방식으로 1차 축소를 수행할 수 있다.
제약과 중복 제거를 기준으로 테스트 케이스 수는 3060% 감소하고, MC/DC 또는 결과 커버리지를 도입하면 논리 결함 탐지율은 1.53.0배 향상될 수 있다. 추적 매트릭스 기반 영향 분석은 리뷰 시간을 20~40% 단축한다. 요구사항의 모호성·충돌을 미리 식별하고, 테스트 설계 결정의 투명성과 재현성을 높이며, 회귀 테스트 선정의 근거를 확보하는 효과도 있다.