제목: 결함 심기 기법의 적용 사례(A Fault Seeding Experience)
저자: Fabio Grigorjev 외 2인, 아르헨티나
문서유형: 컨퍼런스 페이퍼(총 14페이지), 2005년
에러 심기 기법이 시스템 소프트웨어 테스트 단계 후의 잔존 에러 양을 예측하는데 유효한 방법인지를 평가하기 위해 실무에서 적용한 경험을 기술한 자료
에러 심기(Fault Seeding)
- 통제된 실험 환경 하에서 테스트 대상물에 에러를 삽입하는 기법. 하드웨어 개발 분야에서는 오래 전부터 결함 조건을 삽입하여 시스템 동작을 테스트 하는 개념이 사용되어 왔음
- 우리가 통제할 수 있는 알려진 에러를 심어서 해당 에러가 테스트 프로세스에 의해 발견되는 비율을 측정한다면, 이 비율이 아직 발견되지 않은 실제 에러의 수를 예측하는데 사용될 수 있다는 가정에 의존함(아래 수식 참고)
- 이 기법이 적절하게 사용된다면 “어디에 테스팅이 집중되어야 하는지”, “얼마나 많은 테스팅이 수행되어야 하는지”, “실제 에러가 어떻게 분포되었는지” 등에 대한 통찰력을 줄 수 있음
- 하지만 결함을 삽입하는게 말처럼 간단한 일이 아님. 사용가능한 결함 타입 분류표가 있어야 하고, 결함의 확률 분포에 대한 지식이 있어야 하며, 결함 위치가 어떻게 그 가시성(visibility)에 영향을 미치는지에 대한 종합적인 이해가 있어야 함. 또한 이 기법이 유효하기 위해서는 심어진 결함이 심각도와 발생 가능성 측면에서 실제 결함과 동일하거나 또는 대표성을 가져야 함
S: 심어진 결함 수
N: 코드에 잠복해 있는 실제 결함 수(예측을 통해 알아내고자 하는 수)
s: 심어진 결함 중에서 테스팅을 통해 발견된 수
n: 실제 결함 중에서 테스팅을 통해 발견된 수
에러 가능성이 높은 모듈 발견(Error Prone Module Detection)
- 가장 에러 발생 가능성이 높은 모듈에 인위적인 에러가 심어지는게 일반적이므로 그러한 모듈이 테스트 활동 초부터 식별될 필요가 있음
- 이 페이퍼는 Chidamber와 Kemerer가
제안한 아래의 6가지 객체 지향 메트릭을 사용하여 결함 심기를 위한 후보 모듈(클래스)을 식별함
- 클래스 당 가중 메쏘드(Weighted Methods per Class: WMC)
- 상속 트리 깊이(Depth of Inheritance Tree: DIT)
- 자녀 클래스 수(Number of Children: NOC)
- 오브젝트 클래스 간 결합도(Coupling Between Objects Classes: CBO)
- 클래스에 대한 반응(Response for a Class: RFC)
- 메쏘드 응집성 결여도(Lack of Cohesion on Methods: LCOM) - 위 메트릭 자체가 에러 가능성이 높은 클래스를 정확하게 가르키는 것은 아니지만 어떤 클래스가 더 복잡한지(따라서 에러가 모여 있을 가능성이 높은지)에 대한 단서를 제공한다. 또한 메쏘들의 길이(length of methods)에 대한 메트릭도 일부 함께 사용하여 코드에서 에러 가능성이 높은 영역을 식별한다.
결함 분포(Fault Distribution)
- 결함이 심어질 후보 모듈이 식별되고 나면 다음 단계는 심어야 할 결함 스위트를 생성하는데 있음
- 여기서 주요 이슈는 심어지는 결함이 실제 발생 결함(코드에 있는 통상적인 에러)을 대표해야 하는데, 이를 판단할 수 있는 보편적으로 받아들여지는 모델이 없다는 점이다. 인위적인 결함이 실제 결함의 대표성을 띄지 못하는 경우 에러 심기로부터 얻은 결과가 무엇이든 간에 부정확하거나 왜곡되었을 수 있음
- 이 논문은 이러한 “대표성”을 공식적으로 정의하는 방법 대신에 더 실용적인 접근법을 사용함. 즉, 애플리케이션에 에러를 분배하기 위하여 사전정의된 에러 모델들을 채택하고, 실험을 통해 에러의 성격과 해당 에러가 발생 가능한 상황을 이해함으로써 실제 결함을 최대한 가깝게 추정해 냄
Sommerville의 연구에 따르면 에러가 생기기 쉬운 특정 유형의 프로그램 구조와 프로그래밍 기법이 존재한다. 예를 들면 아래와 같은 것들이 있다.
- 부동 소수점 수(Floating point numbers) 간의 비교가 그 표현 방법으로 인해 부정확
- 포인터(Pointers)
- 동적 메모리 할당
- 병행성(Parallelism)
- 재귀(Recursion)
- 인터럽션(Interruptions)
- 프로그램의 동일한 엔터티를 가리키는데 여러 다른 이름이 사용됨
많은 연구자가 에러를 타입에 따라 분류하려는 시도를 하였으며, 일례로 Boris Beizer는 여러 연구로부터 나온 데이터를 종합하여 아래와 같은 목록을 제시함
[에러 타입 분류]
NASA의 연구에서는 아래와 같이 클래스에 따라 에러를 분류함
[클래스에 따른 에러 분포]
에러 심기의 규모(Seeding Size)
- 에러를 배분할 때 해결해야 할 또 다른 이슈는 심어야 할 에러의 수를 정하는 것인데, 이것도 쉬운 문제가 아니면 논란의 여지가 많음
- 현실 프로젝트에서 정확하고 완전한 에러 데이터가 제공되는 경우가 일반적으로 드물다. 또한 사용되는 프로그래밍 언어, 프로그래머의 숙련도, 시스템 크기, 소프트웨어 도메인 등에 에러가 크게 의존하므로, 절대적인 에러 배분 모델을 도출하기가 불가능함
- 조직이 각자 에러에 대한 경험을 축적해야 하며, 대개 한 조직의 경험을 다른 조직에 적용하기 어려움
사례 연구
- 결함 심기 실험을 수행하기 위해서 통제된 개발 환경에서 실행되며 높은 성숙도의 소프트웨어 개발 프로세스(CMM 레벨3)를 사용하는 두 개의 소규모 프로젝트를 선별함
- 숙력된 작업자(Expert Human Seeder)가 에러를 심는 방법을 사용. 즉, 선택된 두 프로젝트의 타겟 언어인 C++에 높은 스킬을 가진 전문가 그룹에서 에러를 심을 작업자들을 선별함
- 휴먼 씨더(seeder)는 아래와 같은 결함 심각도의 정규 분포에 따라 결함을 심게 됨
[IEEE의 결함 심각도 정의]
휴먼 씨더가 심게 될 결함 수가 소스 코드의 라인 수(SLOC)에 기반하여 아래와 같이 결정됨
|
프로젝트 1 |
프로젝트 2 |
코드 라인 수(SLOC) |
364 |
592 |
심어진 결함 수 |
총 12개 |
총 20개 |
인위적인 에러를 심기 위한 증요 모듈을 식별하기 위해 아래 절차를 따름
1. 두 프로젝트의 팀 구성원들에게 자신들의 소스 코드를 분석하고 위에서 언급한 객체 지향 메트릭(WMC, DIT, NOC, CBO, RFC, LCOM)을 측정하도록 요청함
2. Basili가 정의한 계수를 사용하여 클래스가 에러를 포함하고 있을 확률을 계산함
3. 파레토 분포에 따라 높은 확률을 가진 20%를 핵심 모듈(critical modules)로 식별함. 즉, 이것들이 결함이 심어지게 될 후보가 됨
핵심 모듈을 식별한 후에는 휴먼 씨더가 앞서 언급된 결함 분포에 따라 에러를 인위적으로 흉내내기 위하여 코드를 변경함
에러 심기가 끝난 후에는 두 프로젝트의 테스트 그룹이 각자의 테스트 계획에 따른 시스템 테스팅을 수행하기 시작하였으며, 그 결과 아래 실험 결과가 나옴
[에러 심기 실험의 결과]
결론
- 결함 심기는 통제된 환경에서 사용된다면 생산성과 품질을 향상시킬 수 있는 유효한 Verification & Validation(V&V) 방법의 하나이며, 다른 V&V 방법들과 함께 사용되는 것이 바람직함
- 결함 심기 기법의 구현에 드는 비용과 노력을 고려했을 때, 프로세스 성숙도가 높은 조직(과거 데이터와 메트릭이 관리되고 활용되는 조직)에 적용되어야 함. 과거 데이터가 수집되지 않는 조직에서는 사용하기 어려움
'테스트케이스설계기법별 > 경험 or 결함 기반' 카테고리의 다른 글
영상자료 - 뮤테이션 테스팅 입문 강의 (0) | 2021.10.20 |
---|---|
문서요약 - 환경적 버그 발견을 위한 뮤테이션 테스팅 확장 by Spafford (0) | 2020.06.15 |
뮤테이션 테스팅 개념 정리 (0) | 2020.06.08 |
에러 추측 기법 (0) | 2020.06.01 |
에러 심기 기법(Error Seeding) 정리 (0) | 2020.05.18 |