정보처리기사 실기 - 애플리케이션 테스트 관리
애플리케이션 테스트
- 애플리케이션 테스트
- 애플리케이션 결함을 찾아내는 일련의 행위 및 절차
- 고객의 요구사항을 만족시키는지 확인(Validation)
- 정확히 기능을 수행하는지 검증(Verification)
- 애플리케이션 테스트 기본 원리
- 완벽한 테스트 불가능
- 파레토 법칙: 결함 집중, 전체 20%에 해당하는 코드에서 전체 결함 80%
- 테스팅은 정황에 의존적
- 오류-부재의 궤변: 결함이 없더라도 요구사항을 만족하지 못하면 품질이 높다고 할 수 없음
- 개발 초기에 테스팅 시작, 점진적 확대
- 살충제 패러독스: 같은 종류의 테스트는 다른 종류의 결함을 발견할 수 없음
애플리케이션 테스트 분류
- 실행 여부에 따른 분류
- 정적 테스트: 프로그램을 실행하지 않고 명세서와 소스 코드 대상으로 분석
- 종류: 워크스루, 인스펙션, 코드검사 등
- 워크스루(검토회의): 전문가들이 모여 검토, 오류 조기 검출 목적, 문서화
- 인스펙션(동료검토): 워크스루보다 발전시킨 회의, 산출물 품질 평가, 개선 방안 등
- 동적 테스트 : 프로그램을 실행하여 테스트 수행
- 종류: 화이트박스 테스트, 블랙박스 테스트 등
- 테스트 기반(Test Bases)에 따른 분류
- 명세 기반 테스트: 사용자 요구사항에 대한 명세를 테스트 케이스로 만들어 확인
- 구조 기반 테스트: 내부의 논리 흐름에 따라 테스트 케이스 작성
- 종류: 구문 기반, 결정 기반, 조건 기반 등
- 경험 기반 테스트: 유사 소프트웨어 기술 등에 대한 테스터의 경험 기반
- 종류: 에러 추정, 체크리스트, 탐색적 테스팅 등
- 시각에 따른 분류
- 검증(Verification) 테스트: 개발자의 시각에서 명세서와 비교하여 테스트
- 확인(Validation) 테스트: 사용자의 시각에서 요구사항과 비교하여 테스트
- 목적에 따른 분류
- 회복(Recovery): 실패에서 올바르게 복구되는지 확인
- 안전(Security): 불법적인 침입으로부터 시스템을 보호하는지 확인
- 강도(Stress): 과부하 시에도 소프트웨어가 정상 작동하는지 확인
- 성능(Performance): 실시간 성능이나 전체적인 효율성 테스트
- 성능 측정 지표(처응경자): 처리량, 응답시간, 경과시간(Turnaround Time), 자원사용률
- 구조(Structure): 내부 논리적 경로, 소스 코드의 복잡도 등을 평가
- 회귀(Regression): 테스트로 인해 변경된 코드에서 새로운 오류가 없는지 확인
- 병행(Parallel): 변경된 소프트웨어와 기존 소프트웨어에서 동일한 입력으로 결과 비교
애플리케이션 테스트 기법
- 화이트박스 테스트
- 원시 코드의 모든 논리적인 경로를 테스트하는 방식, 구조 기반, 내부 동작 검사
- 원시 코드(모듈)의 모든 문장을 한 번 이상 실행함
- 종류
- 기초 경로 검사(Base Path Testing)
- 제어 구조 검사(Control Structure Testing)
- 조건 검사(Condition Testing): 모듈 내 논리적 조건 테스트
- 루프 검사(Loop Testing): 반복(Loop) 구조를 중점적으로 테스트
- 데이터 흐름 검사(Data Flow Testing): 변수의 정의와 사용 위치를 중점적으로 테스트
- 품질 기준(검증 기준, 커버리지)
- 문장/구문 검증 기준(Statement Coverage): 모든 구문이 한 번이상 수행
- 분기/결정/선택 검증 기준(Branch Coverage): 모든 조건문이 한 번이상 수행
- 조건 검증 기준(Condition Coverage): 모든 조건문에 대한 조건이 T/F 한 번 이상 수행
- 조건/결정 검증 기준(Condition/Decision Coverage): 결정 + 조건
- 변경 조건/결정 커버리지
- 다중 조건 커버리지
- 블랙박스 테스트
- 특정 기능이 작동되는 것을 입증하는 테스트, 명세 기반 기능 테스트
- 종류
- 동치 분할 검사(Equivalence Partitioning Testing): 균등하게 테스트 케이스 설정
- 경계값 분석(Boundary Value Analysis): 입력 조건의 경계값 선정
- 원인-효과 그래프(Cause-Effect Graphing Testing): 효용성이 높은 테스트 케이스
- 오류 예측(Error Guessing)
- 비교(Comparison Testing)
애플리케이션 테스트 개발 단계
- 단위(Unit): 모듈 단위나 컴포넌트에 초점, 구조 기반 테스트
- 통합(Intergation): 모듈 사이의 인터페이스, 통합된 컴포넌트 간의 상호 작용
- 시스템(System): 개발된 소프트웨어가 시스템에서 정확히 수행되는지
- 인수(Acceptation): 사용자 요구사항 충족 여부
- 알파 테스트: 사용자가 개발자 앞에서 테스트
- 베타 테스트: 선정된 사용자가 여러 명의 사용자 앞에서 테스트
통합 테스트
- 하향식 통합 테스트
- 상위 모듈에서 하위 모듈로 통합하는 테스트
- 주요 제어 모듈의 종속 모듈은 스텁(Stub) 사용
- 회귀 테스트 실시
- 상향식 통합 테스트
- 하위 모듈에서 상위 모듈로 통합하는 테스트
- 더미 모듈인 드라이버(Driver) 사용
테스트 케이스/시나리오/오라클
- 테스트 케이스
- 소프트웨어가 사용자 요구사항을 준수했는지 확인하기 위해 설계된 테스트 항목 명세서
- 테스트 시나리오
- 테스트 케이스를 적용하는 순서에 따라 구체적인 절차, 사전 조건, 입력 데이터 등 명세
- 테스트 오라클
- 테스트 결과가 올바른지 판단하기 위해 사전에 정의된 참값을 대입하여 비교
- 종류(참샘휴일)
- 참(True) 오라클: 모든 테스트 케이스의 입력 값에 대한 결과 제공
- 샘플링(Sampling) 오라클: 특정 케이스에 대한 결과 제공
- 추정(Heuristic) 오라클: 특정 케이스에 대한 결과 제공 후, 나머지 추정
- 일관성 검사(Consistent) 오라클: 변경사항이 있을 때 수행 전후 결과가 동일한지 확인
테스트 자동화 도구
- 테스트 절차를 스크립트 형태로 구현하는 자동화 도구
- 종류
- 정적 분석 도구
- 프로그램을 실행하지 않고 소스 코드에 대한 코드 표준, 스타일, 결함 등 내부 구조와 동작을 분석하는 도구
- 테스트 실행 도구
- 스크립트 언어를 사용하여 테스트 실행하는 도구
- 데이터 주도, 키워드 주도 방식 등
- 성능 테스트 도구
- 애플리케이션의 처리량, 응답 시간, 경과 시간, 자원 사용률 등을 인위적으로 적용하여 테스트 수행
- 부하(Load) 테스트: 일정 시간 동안
- 스트레스(Stress) 테스트: 과부하 상태
- 테스트 통제 도구
- 테스트 계획 및 관리, 수행, 결함 관리 등을 수행하는 도구
- 형상 관리, 결함 관리 도구 등
- 결함 관리 도구: Mantis, Trac, Redmine, Bugzilla 등
- 테스트 하네스 도구
- 테스트 실행 환경을 시뮬레이션하여 테스트하는 도구
- 테스트 하네스: 환경의 일부분, 테스트 지원을 위한 코드와 데이터
- 구성 요소: 드라이버, 스텁, 슈트, 케이스, 스크립트, 목 오브젝트
애플리케이션 성능 개선
- 리팩토링의 목적(유유생품)
- 유지보수성 향상
- 유연한 시스템
- 생산성 향상
- 품질 향상
- Clean Code
- 작성 원칙: 가독성, 단순성, 의존성 배제, 중복성 최소화, 추상화
- Bad Code
- 소스 코드 최적화 유형
- 클래스 분할 배치: 응집도 높게, 크기 작게
- 느슨한 결합
- 소스 코드 품질 분석 도구
- 정적 분석 도구: 실행하지 않고 코드 분석
- pmd, cppcheck, checkstyle 등
- 동적 분석 도구: 실행하여 메모리 누수, 스레드 결함 등을 분석