Mutation Analysis
Mutation Analysis(돌연변이 분석)는 프로그램의 소스 코드나 바이트 코드에 의도적으로 변형(돌연변이)을 가하고 테스트를 실행하여, 테스트가 얼마나 효과적인지 평가하는 기법이다.
- 목적
- 테스트가 올바르게 작성되었는지 확인
- 테스트가 소프트웨어 요구사항을 충분히 반영하고 있는지 검증
- 개요
- Mutation Operators(변이 연산자)를 선택하여 원본 코드에 적용
- 코드의 일부를 변형하여 Mutant(돌연변이 코드) 생성
- 테스트 실행 후, 변경된 코드가 감지되면 Mutant는 "killed(사멸)" 되었다고 판단
- 감지되지 않으면 해당 테스트가 충분히 강력하지 않다는 의미
- Weak and Strong Mutation Testing
- Mutation Operators (변이 연산자)
- 문장 삭제 (Statement Deletion)
- Boolean 값 변경 (true ↔ false)
- 산술 연산자 변경 (+ → *, - → / 등)
- 비교 연산자 변경 (> ↔ >=, == ↔ != 등)
- 변수 치환 (동일한 스코프 내에서 변수 변경)
- 객체 지향 언어나 병렬 프로그래밍에서는 특화된 연산자(Class-Level Mutation Operators)가 존재한다.
- Equivalent Mutants (등가 변이체)
- 테스트가 절대 감지할 수 없는 mutant를 **Equivalent Mutant(등가 변이체)**라고 한다.
- 이들을 자동으로 판별하는 것은 매우 어려우며, mutation testing의 실용성을 저해하는 요소 중 하나다.
Automated Testing
Automated Testing(자동화 테스트)은 특정 도구를 사용하여 테스트 실행을 자동화하고, 실제 결과와 기대 결과를 비교하는 과정을 의미한다.
- 자동화 테스트의 계층 구조 (Test Automation Pyramid)
- UI Testing (UI 테스트)
- 사용자 인터페이스에서 실행되는 테스트
- 사용자의 실제 입력과 반응을 검증
- 실행 속도가 느리고 유지보수가 어렵다는 단점
- API Testing (API 테스트)
- API 레벨에서 데이터 교환 및 비즈니스 로직을 테스트
- UI 변화와 무관하게 안정적인 테스트 수행 가능
- Unit Level Testing (단위 테스트)
- 개별 모듈이나 함수 수준에서 테스트
- 실행 속도가 빠르고 버그를 조기에 발견 가능
- 자동화 가능한 테스트 유형
- Test Generation (테스트 생성)
- 테스트 케이스, 입력 데이터, 예상 결과, Pass/Fail 판별 자동 생성
- Test Execution (테스트 실행)
- 새로운 코드 변경이 있을 때 자동으로 테스트 실행 (Regression Testing)
- Test Reporting (테스트 보고)
- 결과를 자동으로 문서화하여 분석 가능
- Debugging Support (디버깅 지원)
- 오류 발생 시 원인 분석을 돕는 기능
- Test Generation (테스트 생성)
- Recorded Scripts (기록된 스크립트)
- 캡처 & 재생 도구(Capture & Replay Tool)를 활용하여 자동화된 테스트 스크립트를 생성
- 사용자의 동작(키보드 입력, 마우스 클릭 등)을 기록하여 반복 실행 가능
- 장점: 빠른 설정 가능, 회귀 테스트(Regression Testing)에 유용
- 단점: 시스템 변경 시 유지보수 어려움
- 캡처 & 재생 도구(Capture & Replay Tool)를 활용하여 자동화된 테스트 스크립트를 생성
- Engineered Scripts (설계된 스크립트)
- 기록된 테스트보다 추상화된 형태
- 변수와 공통 함수 활용 → 유지보수 용이
- 모듈화, 체계적인 테스트 설계 필요
- Data-Driven Testing (데이터 기반 테스트)
- 동일한 테스트 절차를 여러 데이터셋으로 반복 실행
- 입력값과 기대 결과를 외부 데이터 소스(엑셀, 데이터베이스 등)에 저장하여 관리
- Model-Based Testing (모델 기반 테스트)
- UML 상태 머신 등으로 시스템을 모델링
- 모델을 기반으로 자동으로 테스트 케이스를 생성
- 장점: 테스트 케이스를 체계적으로 관리 가능
- 단점: 모델링 기술과 도구에 대한 학습 필요
- 자동화 테스트의 한계 (Limits of Automated Testing)
- 테스트 녹화(Recording)는 매우 취약함
- 환경이 조금만 바뀌어도 쉽게 깨짐
- 예: UI 요소의 위치 변경, 배경 색상 변경 등
- 자동화 테스트는 일반화를 잘 못함 → 작은 변화에도 테스트가 실패
- 예: 다이얼로그 박스의 이름이 변경되면, 이를 참조하는 모든 테스트가 깨짐
- 환경이 조금만 바뀌어도 쉽게 깨짐
- 자동화 테스트는 수동 테스트를 대체할 수 없음
- 수동 테스트는 변화에 유연하게 대응 가능
- 사람이 직접 테스트하면, 예상치 못한 버그를 더 잘 발견
- 자동화 테스트는 효율성은 높지만, 효과성(결과의 질)은 떨어질 수 있음
- 테스트 유지보수 비용이 큼
- 자동화된 테스트가 깨질 경우, 이를 수정하는 데 많은 비용이 듦
- 테스트 개수가 많을수록 유지보수 부담 증가
- 무조건 많은 자동화 테스트가 좋은 것은 아님 ("더 많은 테스트 ≠ 더 나은 품질")
- 테스트 녹화(Recording)는 매우 취약함
-> 자동화 테스트는 강력한 도구지만, 완전한 해결책은 아니다.
-> 수동 테스트와 함께 조화롭게 활용해야 함!
728x90
'Computer Science > Software Engineering' 카테고리의 다른 글
[Software Engineering] Software Maintenance and Evolution (0) | 2025.02.23 |
---|---|
[Software Engineering] Debugging (0) | 2025.02.22 |
[Software Engineering] RBT, TDD, Test Coverage (0) | 2025.02.20 |
[Software Engineering] Testing Techniques (0) | 2025.02.19 |
[Software Engineering] Software Testing (0) | 2025.02.18 |