본문 바로가기
정보처리기사

[ 정보처리기사 ] 화이트박스 테스트 - 구조적 커버리지

by YBin's 2025. 7. 1.
구조적 커버리지 완벽 가이드
구조적 커버리지 개요

구조적 커버리지는 화이트박스 테스트 방법 중 대다수를 차지하는 내용이죠! 소프트웨어의 품질을 보장하기 위해서는 다양한 테스트 방법을 활용해야 하며, 그 중에서도 구조적 커버리지는 코드의 실행 경로를 분석하여 결함을 조기에 발견할 수 있도록 도와줍니다. 사실 구구절절한 이야기를 붙였지만, 제가 이해가 안되서 정리하는 내용입니다...

1구문 커버리지 (= 문장 커버리지, 문장 검증 기준)

구문 커버리지 같은 경우에는 모든 문장을 한 번씩 체크하는 커버리지입니다. 이 방법은 코드의 모든 실행문이 최소 한 번 실행되는지를 확인하여, 코드의 기본적인 실행 경로를 보장합니다. 예를 들어, 아래의 코드에서 모든 문장이 실행되었는지를 확인하는 것이 구문 커버리지의 핵심입니다.

테스트 강도:
def example(x): a = x + 1 # 구문 1 if x > 0: b = x * 2 # 구문 2 else: b = x * -1 # 구문 3 return b # 구문 4 # 테스트: example(5) # 실행된 구문: 1, 2, 4 (구문 3은 실행 안됨)

2결정 커버리지 (= 분기 검증 기준)

결정 커버리지는 모든 분기점(조건문)에서 참과 거짓 경로를 모두 테스트하는 방법입니다. 이 커버리지를 통해 프로그램의 모든 조건문이 제대로 작동하는지를 확인할 수 있습니다. 예를 들어, if 문에서 true와 false 경로를 모두 테스트하여, 코드의 신뢰성을 높이는 것이죠.

테스트 강도:
def login(user, pwd): if user == "admin" and pwd == "123": # 결정점 return True return False # 결정 커버리지: # 테스트 1: 전체 조건이 True가 되는 경우 # 테스트 2: 전체 조건이 False가 되는 경우

3조건 커버리지

조건 커버리지는 복합 조건에서 각 개별 조건이 참과 거짓을 모두 가져보는지를 확인하는 방법입니다. 이 커버리지를 통해 각 조건이 독립적으로 작동하는지를 검증할 수 있습니다. 예를 들어, A && B 조건에서 A와 B 각각이 true와 false를 모두 가지는지를 체크하는 것입니다!

테스트 강도:
def check(a, b): if a > 0 and b > 0: # 조건1: a>0, 조건2: b>0 return "both positive" return "not both positive" # 조건 커버리지: # a > 0: True, False 각각 테스트 # b > 0: True, False 각각 테스트

4결정/조건 커버리지

결정/조건 커버리지는 결정 커버리지와 조건 커버리지를 동시에 만족하는 방법입니다. 그냥 간단하게 조건문이 True 혹은 False인 경우로 나누고, 각각의 경우에 따라 조건 검증 기준의 입력 데이터를 구분하도록 테스트하는 것 입니다.

테스트 강도:
def validate(x, y): if x > 5 or y < 10: # 결정점이면서 두 개의 조건 return "valid" return "invalid" # 필요한 테스트: # 1. 전체 결정이 True/False 모두 발생 # 2. x > 5가 True/False 모두 발생 # 3. y < 10이 True/False 모두 발생

5변형 결정/조건 커버리지(MC/DC)

조건/결정 커버리지를 향상시킨 놈 입니다. 개별 조건식이 다른 개별 조건식에 영향을 받지 않고, 전체 조건식의 결과에 독립적으로 영향을 주도록 설계한 것 이죠.

테스트 강도:
def access_control(admin, logged_in, premium): if admin or (logged_in and premium): # 복합 조건 return "access granted" return "access denied" # MCDC: 각 조건이 결과를 바꾸는 경우를 찾아 테스트 # admin이 결과를 바꾸는 경우 # logged_in이 결과를 바꾸는 경우 # premium이 결과를 바꾸는 경우

6다중 조건 커버리지

다중 조건 커버리지는 모든 조건의 가능한 조합을 모두 테스트하는 방법입니다.

테스트 강도:
def complex_check(a, b, c): if a and b and c: # 3개 조건 return "all true" return "not all true" # 다중 조건 커버리지: 2³ = 8가지 모든 조합 # (T,T,T), (T,T,F), (T,F,T), (T,F,F) # (F,T,T), (F,T,F), (F,F,T), (F,F,F)

헷갈릴 수 있는 부분!

엥? 조건 커버리지랑 다중 조건 커버리지의 차이가 머죵?

- 조건 커버리지는 한놈씩만 타겟팅 한다면, 다중 조건 커버리지는 전체 적으로 봅니다! 코드로 보시는게 편하실 거에요

def access_check(is_admin, is_logged_in, has_permission): if is_admin and is_logged_in and has_permission: return "접근 허용" return "접근 거부"

이렇게 3개의 참/거짓을 기준으로 작동하는 조건문이 있다고 가정하겠습니다.

조건 커버리지는 각각이 T/F인 경우만 생각하면 되고, 다중 조건 커버리지는 모든 조합을 생각해야해요.

🎯 조건 커버리지

개별 타겟팅 (최소 3개 테스트)

# 테스트 케이스 (최소 3개로도 가능) test1 = access_check(True, False, False) # is_admin=T test2 = access_check(False, True, False) # is_logged_in=T test3 = access_check(False, False, True) # has_permission=T # 결과: 각 조건이 모두 T/F를 경험함 # is_admin: True(test1), False(test2,test3) ✓ # is_logged_in: True(test2), False(test1,test3) ✓ # has_permission: True(test3), False(test1,test2) ✓

이렇게 조건 커버리지는 극단적으로 3개의 테스트 케이스만으로 검증할 수 있습니다. 왜 와이? 3개의 요소가 모두 True, False인 경우를 검증했기 때문이죠!

🎯 다중 조건 커버리지

전체적 접근 (8개 테스트 필수)

# 테스트 케이스 (반드시 8개 모두 필요) test1 = access_check(True, True, True) # TTT → "접근 허용" test2 = access_check(True, True, False) # TTF → "접근 거부" test3 = access_check(True, False, True) # TFT → "접근 거부" test4 = access_check(True, False, False) # TFF → "접근 거부" test5 = access_check(False, True, True) # FTT → "접근 거부" test6 = access_check(False, True, False) # FTF → "접근 거부" test7 = access_check(False, False, True) # FFT → "접근 거부" test8 = access_check(False, False, False) # FFF → "접근 거부"

이렇게, 2^3의 결과 갯수를 가져야만 합니다..!!