애플리케이션 테스트
애플리케이션 테스트의 기본 원리
파레토 법칙
: 애플리케이션의 20%에 해당하는 코드에서 전체 결함의 80%가 발견된다는 법칙살충제 패러독스
: 동일한 테스트 케이스로 동일한 테스트를 반복하면 더 이상 결함이 발견되지 않는 현상오류-부재의 궤변
: 소프트웨어의 결함을 모두 제거해도 사용자의 요구사항을 만족시키지 못하면 해당 소프트웨어는 품질이 높다고 말할 수 없는 것프로그램 실행 여부에 따른 테스트
설명 | 종류 | |
---|---|---|
정적 테스트 | 스포그램을 실행하지 않고 명세서나 소스 코드를 대상으로 분석하는 테스트, 코딩 표준과 코딩 스타일, 코드 복잡도, 남은 결함 등을 발견하기 위해 사용 | 워크스루, 인스펙션, 코드 검사 등 |
동적 테스트 | 프로그램을 실행하여 오류를 찾는 테스트, 소프트웨어 개발의 모든 단계에서 테스트를 수행 | 블랙박스 테스트, 화이트박스 테스트 |
시각에 따른 테스트
검증 테스트 | 개발자의 시작에서 제품의 생산 과정을 테스트 |
확인 테스트 | 사용자의 시작에서 생산된 제품의 결과를 테스트 |
목적에 따른 테스트
회복 테스트 | 시스템에 여러 가지 결함을 주어 실패하도록 한 후 올바르게 복구되는지를 확인하는 테스트 |
안전 테스트 | 시스템에 설치된 시스템 보호 도구가 불법적인 침입으로부터 시스템을 보호할 수 있는지를 확인하는 테스트 |
강도 테스트 | 시스템에 과도한 정보량이나 빈도 등을 부과하여 과부하 시에도 소프트웨어가 정상적으로 실행되는지를 확인하는 테스트 |
성능 테스트 | 소프트웨어의 실시간 성능이나 전체적인 효율성을 진단하는 테스트 |
구조 테스트 | 소프트웨어 내부의 논리적인 경로, 소스 코드의 복잡도 등을 평가하는 테스트 |
회귀 테스트 | 소프트웨어의 변경 또는 수정된 코드에 새로운 결함이 없음을 확인하는 테스트 |
병행 테스트 | 변경된 소프트웨어와 기존 소프트웨어에 동일한 데이터를 입력하여 결과를 비교하는 테스트 |
화이트박스 테스트
화이트박스 테스트의 종류
기초 경로 검사
: 테스트 케이스 설계자가 절차적 설계의 논리적 복잡성을 측정할 수 있게 해주는 테스트 기법제어 구조 검사
: 조건 검사 | 프로그램 모듈 내에 있는 논리적 조건을 테스트 |
루프 검사 | 프로그램의 반복 구조에 초점을 맞춰 실시 |
데이터 흐름 검사 | 프로그램에서 변수의 정의와 변수 사용의 위치에 초점을 맞춰 실시 |
화이트박스 테스트의 검증 기준
문장 검증 기준 | 소스 코드의 모든 구문이 한 번 이상 수행되도록 테스트 케이스를 설계한다 |
결정 검증 기준 | 소스 코드의 모든 조건문에 대해 조건식의 결과가 True인 경우와 False인 경우가 한 번 이상 수행되도록 테스트 케이스를 설계한다 |
조건 검증 기준 | 소스 코드의 조건문에 포함된 개별 조건식의 결과가 True인 경우와 False인 경우가 한 번 이상 수행되도록 테스트 케이스를 설계한다 |
조건/결정 검증 기준 | 결정 검증 기준과 조건 검증 기준을 모두 만족하는 설계로, 조건문이 True인 경우와 False인 경우에 따라 조건 검증 기준의 입력 데이터를 구분하는 테스트 케이스를 설계한다 |
변경 조건/결정 검증 기준 | 조건/결정 검증 기준을 향상시킨 검증 기준으로, 개별 조건식이 다른 개별 조건식의 영향을 받지 않고 전체 조건식의 결과에 독립적으로 영향을 주도록 테스트 케이스를 설계한다 |
다중 조건 검증 기준 | 소스 코드의 조건문에 포함된 모든 개별 조건식의 모든 조합을 고려하도록 테스트 케이스를 설계한다 |
블랙박스 테스트(기능 테스트)
블랙박스 테스트의 종류
동치 분할 검사(동등 분할 기법, 동치 클래스 분해) | 프로그램의 입력 조건에 타당한 입력 자료와 타당하지 않은 입력 자료의 개수를 균등하게 하여 테스트 케이스를 정하고, 해당 입력 자료에 맞는 결과가 출력되는지 확인하는 기법 |
경계값 분석 | 입력 조건의 중간값보다 경계값에서 오류가 발생될 확률이 높다는 점을 이용하여 입력 조건의 경계값을 테스트 케이스로 선정하여 검사하는 기법 |
원인-효과 그래프 검사 | 입력 데이터 간의 관계와 출력에 영향을 미치는 상황을 체계적으로 분석한 다음 효용성이 높은 테스트 케이스를 선정하여 검사하는 기법 |
오류 예측 검사 | 과거의 경험이나 확인자의 감각으로 테스트하는 기법 |
비교 검사 | 여러 버전의 프로그램에 동일한 테스트 자료를 제공하여 동일한 결과가 출력되는지 테스트하는 기법 |
개발 단계에 따른 애플리케이션 테스트 (단통시인)
단위 테스트
, 통합 테스트
, 시스템 테스트
, 인수 테스트
로 분류되며 이렇게 분류된 것을 테스트 레벨이라고 함V-모델
이라고 표현한다.단위 테스트
통합 테스트
시스템 테스트
인수 테스트
알파 테스트 | 개발자의 장소에서 사용자가 개발자 앞에서 행하는 테스트 기법 |
베타 테스트 | 선정된 최종 사용자가 여러 명의 사용자 앞에서 행하는 테스트 |
하향식 통합 테스트
💡 스텁(Stub)
제어 모듈이 호출하는 타 모듈의 기능을 단순히 수행하는 도구, 일시적으로 필요한 조건만을 가지고 있는 시험용 모듈
상향식 통합 테스트
💡 테스트 드라이버(Test Driver)
테스트 대상의 하위 모듈을 호출하고, 파라미터를 전달하고, 모듈 테스트 수행 후의 결과를 도출하는 도구
회귀 테스트
테스트 오라클
제한된 검증
, 수학적 기법
, 자동화 기능
이 특징테스트 오라클의 종류
참 오라클 | 모든 테스트 케이스의 입력 값에 대해 기대하는 결과를 제공하는 오라클, 발생된 모든 오류를 검출할 수 있음 |
샘플링 오라클 | 특정한 몇몇 테스트 케이스의 입력 값들에 대해서만 기대하는 결과를 제공하는 오라클, 전수 테스트가 불가능한 경우 사용 |
추정 오라클 | 특정 테스트 케이스의 입력 값에 대해 기대하는 결과를 제공하고, 나머지 입력 값들에 대해서는 추정으로 처리하는 오라클 |
일관성 검사 오라클 | 애플리케이션에 변경이 있을 때, 테스트 케이스의 수행 전과 후의 결과 값이 동일한지를 확인하는 오라클 |
테스트 자동화 도구
정적 분석 도구 | 프로그램을 실행하지 않고 분석하는 도구 |
테스트 케이스 생성 도구 | 자료 흐름도, 기능 테스트, 입력 도메인 분석, 랜덤 테스트 |
테스트 실행 도구 | 스크립트 언어를 사용하여 테스트를 실행하는 도구 |
성능 테스트 도구 | 애플리케이션의 처리량, 응답 시간, 경과 시간, 자원 사용률 등을 인위적으로 적용한 가상의 사용자를 만들어 테스트를 수행함으로써 성능의 목표 달성 여부를 확인하는 도구 |
테스트 하네스의 구성 요소
테스트 드라이버 | 테스트 대상의 하위 모듈을 호출하고, 파라미터를 전달하고, 모듈 테스트 수행 후의 결과를 도출하는 도구 |
테스트 스텁 | 제어 모듈이 호출하는 타 모듈의 기능을 단순히 수행하는 도구 |
테스트 슈트 | 테스트 대상 컴포넌트나 모듈, 시스템에 사용되는 테스트 케이스의 집합 |
테스트 케이스 | 사용자의 요구사항을 정확하게 준수했는지 확인하기 위한 입력 값 등으로 만들어진 테스트 항목의 명세서 |
테스크 스크립트 | 자동화된 테스트 실행 절차에 대한 명세서 |
목 오브젝트 | 사전에 사용자의 행위를 조건부로 입력해 두면, 그 상황에 맞는 예정된 행위를 수행하는 객체 |
결함
애플리케이션 성능 측정 지표
처리량 | 일정 시간 내에 애플리케이션이 처리하는 일의 양 |
응답 시간 | 애플리케이션에 요청을 전달한 시간부터 응답이 도착할 때까지 걸린 시간 |
경과 시간 | 애플리케이션에 작업을 의뢰한 시간부터 처리가 완료될 때까지 걸린 시간 |
자원 사용률 | 애플리케이션이 의뢰한 작업을 처리하는 동안의 CPU 사용량, 메모리 사용량, 네트워크 사용량 등 자원 사용률 |
순환 복잡도
화살표 수
- 노드의 수
+ 2 로 계산한다소스 코드 최적화
스파게티 코드 | 코드의 로직이 서로 복잡하게 얽혀 있는 코드 |
외계인 코드 | 아주 오래되거나 참고문서 또는 개발자가 없어 유지보수 작업이 어려운 코드 |
클린 코드 작성 원칙
가독성 | 누구든지 코드를 쉽게 읽을 수 있도록 작성한다 |
단순성 | 코드를 간단하게 작성한다 |
의존성 배제 | 코드가 다른 모듈에 미치는 영향을 최소화한다 |
중복성 최소화 | 코드의 중복을 최소화한다 |
추상화 | 상위 클래스/메소드/함수에서는 간략하게 애플리케이션의 특성을 나타내고, 상세 내용은 하위 클래스/메소드/함수에서 구현한다 |
소스 코드 품질 분석 도구
정적 분석 도구
: 작성한 소스 코드를 실행하지 않고 코딩 표준이나 코딩 스타일, 결함 등을 확인하는 코드 분석 도구동적 분석 도구
: 작성한 소스 코드를 실행하여 코드에 존재하는 메모리 누수, 스레드 결함 등을 분석하는 도구