조건 커버리지로 복합 논리식의 테스트 공백 줄이기

조건 커버리지의 원자 조건 분해 방식과 쇼트서킷 대응, 분기 커버리지·MC/DC와의 차이, 테스트 설계 방법을 정리한다.

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

복합 조건식에서 확인해야 할 평가 경로

Condition Coverage는 하나의 결정식(decision/predicate)을 구성하는 원자 조건(atomic Boolean expression)이 최소 한 번씩 True와 False로 평가되도록 테스트를 구성하는 기준이다. 분기나 결정 결과만 확인할 때 남을 수 있는 논리 공백을 줄이는 데 쓰이며, 금융·안전·정책 엔진처럼 규칙 기반 로직이 많은 영역에서 특히 유용하다.

문장 커버리지(Statement), 분기/결정 커버리지(Branch/Decision), 조건 커버리지(Condition), 변경 조건/결정 커버리지(MC/DC)는 결함 검출력 측면에서 순차적으로 강해지는 경향이 있다. 다만 조건 커버리지는 원자 조건의 값 변화를 확인할 뿐, 결정 결과의 모든 분기가 수행됐다는 보장은 하지 않는다.

단락 평가(Short-circuit)가 있는 식은 결과 해석에 주의해야 한다. 예를 들어 (A || B)에서 A=True이면 B는 평가되지 않을 수 있다. 조건에 부작용(side effect)이 포함됐다면 그 영향도 별도로 통제해야 한다.

테스트 대상으로 삼을 조건을 분해하는 방법

복합 논리식은 AND, OR, NOT을 기준으로 나누고, 비교식(>, ==, in), 널 검사, 플래그, 가드 조건을 원자 조건으로 식별한다. 각 조건이 True와 False를 최소 한 번씩 갖도록 테스트 세트를 만든다.

조건 사이의 제약이 충돌하면 모든 조합을 만들 수 없을 수 있다. 이 경우 충족할 수 없는 조합을 판별하고 대안 조합을 찾아야 한다. 쇼트서킷 때문에 평가되지 않는 하위 조건은 입력 조정이나 모킹으로 경로를 유도한다. 함수 호출형 조건의 상태 변화나 예외 발생을 격리할 때는 스텁과 스파이를 적용할 수 있다.

언어와 테스트 러너마다 Condition 또는 Branch 측정 지원 범위가 다르므로 옵션을 먼저 확인해야 한다. 일부 도구는 분기 커버리지만 제공한다. Mutation Testing을 함께 사용하면 조건 검증이 실제 결함 변형을 잡는지 확인할 수 있다.

MC/DC는 각 조건의 변화가 결정 결과에 독립적으로 영향을 준다는 점까지 증명하도록 추가 제약을 둔다. 조건 커버리지는 MC/DC보다 비용은 낮지만 결함 검출력도 상대적으로 낮다.

정책과 입력 검증 로직에 적용할 때

KYC/AML, 보험 언더라이팅, 접근제어(ABAC/RBAC) 정책처럼 복합 규칙이 많은 정책 엔진은 조건 커버리지 적용 대상이 된다. 룰 변경 뒤 회귀 테스트를 수행할 때 정책 일관성을 확인하는 기준으로도 쓸 수 있다.

API 파라미터 검증, Feature Flag 조합, 실시간 필터링 로직에서는 경계 조건을 찾는 데 도움이 된다. 항공·의료 등의 안전 또는 임베디드 도메인에서는 MC/DC를 도입하기 전 품질 바닥선을 확보하는 단계로 적용할 수 있다. 레거시 코드에서는 조건식별 커버리지 공백을 통해 분해와 단순화의 우선순위를 정할 수 있다.

조건별 평가 상태를 테스트로 연결하기

입력은 대상 함수 또는 모듈의 소스 코드, 요구사항 명세, 실행 환경 제약사항이다. 결정식을 추출해 원자 조건 목록과 가능한 조합을 만들고, 모순되는 제약을 제외한 뒤 테스트 세트를 선택한다. 이후 쇼트서킷과 부작용을 고려한 테스트 더블 전략을 세워 구현하고, 커버리지 결과를 바탕으로 미충족 조건과 결함을 반복 분석한다.

산출물은 조건별 T/F 충족 맵, 테스트 케이스 집합, 미충족 사유와 추적 메모로 구성된다.

처리: 결정식 추출처리: 진리표 작성처리: 제약 적용처리: 테스트 선택처리: 쇼트서킷/부작용 대응처리: 구현·실행조건: 미충족 존재조건: 전부 충족처리: 데이터/제약 재설계예외: 제약 불만족 지속입력: 코드/명세/제약 수집원자 조건 목록화가능 조합 생성불가능 조합 제거최소 테스트 세트 도출모킹/스텁 전략 수립커버리지 측정진단: 미평가 조건/분기 식별출력: 조건별 T/F 충족출력: 미충족 사유 기록

Python 예제로 보는 조건과 분기의 차이

환경은 Python 3.11+, pytest 7.x, coverage.py 7.x를 전제로 한다. 아래 코드는 조건 커버리지 달성 사례와 그 한계를 보여 준다.

대상 코드 app/auth.py:

def can_access(is_admin: bool, age: int, verified: bool) -> bool:
    # 결정식: is_admin or (age >= 18 and verified)
    return is_admin or (age >= 18 and verified)

다음 테스트는 조건 커버리지를 충족하는 형태지만, 전체 결정이 False가 되는 분기는 포함하지 않는다.

# tests/test_auth_condition_only.py
from app.auth import can_access

def test_admin_true():
    # is_admin=True (T), age, verified는 쇼트서킷 영향으로 미평가 가능
    assert can_access(True, 0, False) is True

def test_non_admin_verified_adult():
    # is_admin=False (F), age>=18 (T), verified=True (T)
    assert can_access(False, 20, True) is True

is_admin(T/F), (age>=18)(T), verified(T)는 모두 최소 한 번 True를 경험한다. 그러나 전체 결정이 False가 되는 테스트가 없으므로 False 분기는 미커버 상태로 남을 수 있다.

분기까지 보완하려면 다음과 같이 False 결과를 만드는 테스트를 추가한다.

# tests/test_auth_branch_plus_condition.py
from app.auth import can_access

def test_admin_true():
    assert can_access(True, 0, False) is True  # is_admin=T

def test_verified_adult():
    assert can_access(False, 20, True) is True  # age>=18=T, verified=T

def test_underage_or_unverified():
    assert can_access(False, 16, True) is False  # age>=18=F

실행은 다음과 같다.

pip install pytest coverage
coverage run -m pytest -q
coverage report  # 도구에 따라 Branch/Condition 옵션 지원 여부 상이

커버리지 기준별 운영 특성

기준 성능(테스트 실행시간) 확장성(대규모 적용) 일관성(측정 결정성) 안정성(회귀 결함 검출) 운영 편의(도구/도입)
문장(Statement) 매우 높음 매우 높음 높음 낮음 매우 높음
분기/결정(Branch) 높음 높음 높음 중간 높음
조건(Condition) 중간 중간~높음 중간 중간~높음 중간
MC/DC 낮음 중간 중간 높음 낮음

조건 커버리지는 테스트 실행시간과 도입 난이도에서 중간 수준이다. 결함 검출력은 분기 커버리지보다 우수하지만 MC/DC에는 미치지 못한다.

유지보수 비용과 검증 강도의 균형

원자 조건에 의미 있는 이름을 붙이고, 디모르간 변환이나 조기 반환으로 조건식을 단순화하면 테스트 의도를 읽기 쉬워진다. 쇼트서킷 경로를 실제로 평가시키는 입력을 설계하고 필요한 테스트 더블을 둔다. Mutation Testing은 >= → >처럼 조건을 무력화하는 결함에 대한 검출력을 확인하는 데 사용할 수 있다.

커버리지 임계값은 모든 모듈에 동일하게 적용하기보다 위험도에 따라 차등화할 수 있다. 반면 테스트 수가 늘면 유지보수 비용도 증가하므로 중복 테스트를 정리해야 한다. 부작용이 있는 조건을 과도하게 모킹하면 통합 신뢰도가 낮아질 수 있어 단위 테스트와 통합 테스트의 균형이 필요하다. Condition 측정을 지원하지 않는 언어와 도구에서는 Branch를 대체 지표로 사용하고 보완 리포팅을 구성한다.

복합 조건 결함 검출률은 1025%p 개선 가능하며 조직·도메인별 편차가 존재한다. 분기 커버리지만 적용할 때보다 테스트 케이스 수는 1.21.8배 증가할 수 있고, 회귀 결함 재현율은 향상되는 경향이 있다. 명세와 구현의 논리 불일치를 더 일찍 발견하고 코드 리뷰 품질을 높이며, 규칙 변경의 영향 범위를 드러내 릴리스 리스크를 낮추는 효과도 기대할 수 있다.

위험도가 높은 모듈부터 조건 커버리지를 적용하고, 쇼트서킷과 부작용을 통제한 뒤 Mutation Testing 및 선택적 MC/DC로 검증 수준을 확장하는 방식이 적합하다.

조건 커버리지소프트웨어 테스트분기 커버리지MC/DC논리식 테스트