Post

[QA]테스트 설계(구조기반 테스트).

[QA]테스트 설계(구조기반 테스트).

테스트 설계 기법

구조기반 테스트

구조기반 테스트는 프로그램 내부를 확인하여 문제를 찾는 방법으로, 프로그램이 정상적으로 작동하는지와 코드가 제대로 실행되는지를 확인하는 데 목적.

1. 구조기반 테스트 개요

항목설명
목적프로그램의 내부 구조를 기준으로 테스트를 진행하여 개발된 코드가 올바르게 작동하는지 검증
사용프로그램 내부의 설계도를 보고 논리적으로 문제가 없는지 확인하는 과정
예시코드의 각 부분이 빠짐없이 실행되는지, 조건에 따라 다른 경로로 진행되는지를 확인

2. 구조기반 테스트 유형

2.1 제어 흐름 기반 테스트

  • 코드의 제어 구조를 기반으로 테스트 설계
  • 모든 실행 경로가 한 번 이상 테스트되도록 보장하는 것이 목표
  • 코드의 논리적 완전성을 검증하는 데 효과적이며, 조건문이 많은 시스템에 유용

(예시) ATM 인출 제한 로직 검증

1
2
3
4
if balance >= withdrawal_amount:
    balance -= withdrawal_amount
else:
    print("Insufficient Funds")
  • 입력값: balance=100, withdrawal_amount=50 → 정상 인출
  • 입력값: balance=30, withdrawal_amount=50 → “Insufficient Funds” 출력

2.2 데이터 흐름 기반 테스트

  • 데이터 중심 시스템에서 결함을 발견하는 데 효과적
  • 변수의 올바른 초기화 여부와 사용 후 예상대로 변경되었는지 확인

(예시) 할인 계산 로직 검증

1
2
3
4
discount = 0
if price > 100:
    discount = price * 0.1
final_price = price - discount
  • 입력값: price=150discount=15, final_price=135 확인

2.3 코드 커버리지

  • 소스코드의 실행된 부분과 실행되지 않은 부분을 측정하는 기준
  • 주요 기준: Line Coverage, Branch Coverage, Path Coverage

2.3.1 Line Coverage (라인 커버리지)

  • 소스 코드의 각 라인이 한 번 이상 실행되었는지 확인하는 기준
  • 코드의 기본 실행 여부를 검증하며, 초기 테스트 단계에서 유용

(예시) 계산기 함수

1
2
3
4
5
def add(a, b):
    return a + b

def subtract(a, b):
    return a - b
  • 입력값: add(3,2) → 출력값: 5 확인
  • 입력값: subtract(3,2) → 출력값: 1 확인

2.3.2 Branch Coverage (분기 커버리지)

  • 조건문이 포함된 코드의 모든 분기 경로를 테스트하는 기준
  • 참과 거짓 두 가지 결과를 모두 테스트하여 논리적 오류를 조기에 발견 가능
  • 복잡한 조건문이 포함된 시스템에서 유용함

(예시) 대출 승인 로직 검증

1
2
3
4
if credit_score > 700:
    approve = True
else:
    approve = False
  • 입력값: credit_score=750approve=True
  • 입력값: credit_score=650approve=False

2.3.3 Path Coverage (경로 커버리지)

  • 소스 코드의 모든 가능한 실행 경로를 검증하는 기준
  • 다중 조건문과 반복문이 포함된 코드에서 모든 조합과 경로를 테스트함
  • 가장 철저한 검증 방식 중 하나로, 복잡한 로직에서 유용하지만 높은 리소스와 시간이 요구됨
  • 결함 발견율이 높음

(예시) 로그인 시스템 검증

1
2
3
4
if username == "admin" and password == "1234":
    print("Login Successful")
else:
    print("Login Failed")
  • 입력값: username="admin", password="1234""Login Successful"
  • 입력값: username="human", password="abcd""Login Failed"
This post is licensed under CC BY 4.0 by the author.