비버깅으로 잔존 결함을 추정하는 방법

비버깅과 오류 씨딩을 이용해 테스트의 결함 검출률을 측정하고 잔존 오류를 추정하는 품질 관리 기법을 정리한다.

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

테스트가 잡지 못한 결함을 추정하는 방식

비버깅(Bebugging)은 코드나 환경에 의도적인 오류를 심고, 테스트가 이를 얼마나 찾아내는지로 실제 잔존 오류량을 통계적으로 추정하는 신뢰성 엔지니어링 기법이다. 오류 씨딩(Error Seeding)이라고도 한다.

이 기법의 관심사는 장애를 일부러 만들어 시스템의 회복력을 확인하는 데 있지 않다. 카오스 엔지니어링 관점의 장애 유발(Fault Injection)과 달리, 비버깅은 결함 검출률을 이용해 테스트의 효과성과 릴리스 시점의 품질을 판단하는 데 초점을 둔다.

추정이 성립하려면 인위적으로 넣은 오류와 실제 오류가 테스트에서 비슷하게 발견된다는 동질성 가정이 필요하다. 두 집단의 탐지 분포와 난이도가 근사해야 하므로, 시드 설계의 대표성이 결과를 좌우한다.

시드 설계부터 릴리스 판단까지

시드는 실제 결함 분포를 고려해 유형, 심각도, 삽입 위치를 정해야 한다. 단순히 오류를 많이 넣는다고 대표성이 확보되지는 않는다. 각 시드에는 ID를 부여하고 유형·모듈·심각도·삽입 시각 같은 메타데이터를 남겨 추적 가능하게 관리한다.

주입은 릴리스 브랜치와 분리된 브랜치, 피처 플래그 또는 샌드박스 환경에서 수행한다. 자동화 스크립트로 재현성과 원복 절차를 마련하고, 코드 리뷰와 승인 절차도 함께 둔다.

테스트 단계에서는 비맹(blind) 또는 맹(blind) 전략을 선택한다. 커버리지, 결함 검출 리드타임, 테스트 강도를 함께 측정하고, 로그에서 시드 오류와 실제 결함을 구분해 수집한다. 테스트 종료 기준과 표본 크기 기준은 실행 전에 정한다.

충분함불충분함아니오입력: 시드 계획, 테스트케이스, 로그 스키마오류 설계오류 주입: 브랜치 격리, 태깅테스트 실행: 커버리지 측정,로그 수집잔존 오류 계산: 지표 산출표본 크기가 충분한가?판단: 릴리스 또는 보류테스트 보강: 케이스 추가중단 기준을 충족했는가?종료반복 실행

산출물은 결함 검출률, 잔존 오류 추정치, 품질 게이트 결과, 개선 액션으로 이어진다. 이 결과를 바탕으로 릴리스, 리테스트, 테스트 전략 보정 중 하나를 선택한다.

검출률로 잔존 결함 계산하기

비버깅에서 사용하는 계산식은 다음과 같다.

  • fault detection rate = discovered seeded faults / seeded faults
  • real faults = seeded faults × (discovered real faults / discovered seeded faults)
  • remaining faults = real faults − discovered real faults

예를 들어 seeded faults = 100, discovered seeded faults = 80, discovered real faults = 120인 경우를 보자.

  • fault detection rate = 80 / 100 = 0.8
  • real faults = 100 × (120 / 80) = 150
  • remaining faults = 150 − 120 = 30

현재 테스트 강도 기준으로는 잔존 결함이 약 30건으로 추정된다.

간단한 계산은 다음 코드로 구현할 수 있다.

def bebugging_estimate(seed_total: int, seed_found: int, real_found: int):
    if seed_total <= 0 or seed_found <= 0:
        raise ValueError("seed_total과 seed_found는 0보다 커야 함")
    fdr = seed_found / seed_total
    real_total = seed_total * (real_found / seed_found)
    remaining = real_total - real_found
    return {"fault_detection_rate": fdr, "real_faults": real_total, "remaining_faults": remaining}

print(bebugging_estimate(100, 80, 120))
# {'fault_detection_rate': 0.8, 'real_faults': 150.0, 'remaining_faults': 30.0}

품질 게이트에 적용하는 장면

대규모 웹·모바일 릴리스에서는 스프린트 말에 시드 50~100건을 삽입하고, 회귀 테스트와 탐색 테스트를 함께 수행할 수 있다. 잔존 결함 추정치는 릴리스 GO/NO-GO 판단에 쓰이며, 테스트 파이프라인의 자동 수집·산출 대시보드와 연결할 수 있다.

임베디드·자동차 ECU의 비안전 영역에서는 SIL/HIL 환경에 시드를 넣고 입력 센서 노이즈나 타이밍 결함을 포함할 수 있다. 이 과정은 소프트 리얼타임 동작 검증과 잔존 결함 추정에 사용된다.

데이터 파이프라인과 ETL에서는 의도적인 스키마 드리프트나 Null 주입을 시드로 삼아 검출률 기반의 데이터 품질 게이트를 구성할 수 있다.

수치가 보여주는 테스트 품질

결함 검출률(FDR)을 수치화하면 테스트의 효과성을 가시화할 수 있다. 잔존 결함 추정치 역시 릴리스 리스크를 판단하는 근거가 된다. 예를 들어 FDR 0.8에서 잔존 30건으로 추정된 상태라면, 리테스트 후 10건 이하로 축소하는 방향의 판단이 가능하다.

결함 밀도 추세를 관리하면 MTBF와 가용성 개선에도 연결된다. 테스트 설계 보정과 팀 역량의 캘리브레이션을 촉진하고, 품질 게이트의 객관성과 이해관계자의 신뢰를 높이는 효과도 있다.

운영에서 통제해야 할 위험

시드는 전용 브랜치나 플래그로 격리하고, CI에서 삽입과 제거를 자동화한다. 시드 레지스트리에는 유형·위치·심각도를 기록하며, 로그 스키마도 표준화한다. 실제 결함 분포에 맞춘 시드 믹스를 설계하고 모듈·심각도별 층화 표본 추출을 적용하는 것이 대표성 확보에 도움이 된다.

승인 워크플로, 코드 리뷰, 원복 검증, 보안·컴플라이언스 체크리스트는 운영 거버넌스에 포함한다. 시드가 남아 릴리스 브랜치를 오염시킬 수 있으므로 강제 원복과 검증 게이트가 필요하다.

동질성 가정이 깨지면 추정치는 왜곡될 수 있다. 시드와 실제 결함의 검출 특성이 다를 때를 고려해 보정계수와 검증 실험이 필요하다. 시드 설계·주입·원복 자동화에는 초기 투자가 들지만, 장기적으로는 테스트 효율 개선 효과를 기대할 수 있다.

장애 유발과 변이 테스트 사이의 위치

기법 목적 적용 레벨 성능/확장성 일관성 안정성/리스크 운영 편의
비버깅(Bebugging) 잔존 결함 추정, 테스트 효과 측정 코드/테스트 프로세스 중~높음(표준화 시) 중(오염 리스크)
장애 유발(Fault Injection) 내고장성/회복탄력 검증 인프라/런타임 높음 중~높음(프로덕션 영향)
변이 테스트(Mutation Testing) 테스트 강도 평가 코드(소스 변이) 낮음~중 높음 낮음 낮음(비용 높음)

비버깅은 테스트가 실제 결함을 어느 정도 검출하는지 계량화하고, 잔존 결함 추정치를 릴리스 판단에 연결하는 기법이다. 시드의 대표성과 동질성 가정을 검증하고 환경 오염을 통제할 수 있다면, 신뢰성 성장 관리를 위한 반복 가능한 품질 게이트로 사용할 수 있다.

비버깅오류 씨딩소프트웨어 테스트품질 관리신뢰성