- 테스팅이란 어플리케이션 또는 시스템의 동작과 성능, 안정성이 사용자나 고객이 요구하는 수준을 만족하는지 확인이나 검증하기 위해 결함을 발견하는 방법
② 테스팅 원리
원리
설명
결함의 존재성을 밝히는 활동
- 결함을 발견하는 활동이기에 무결성 증명은 거의 불가능함
완벽한 테스팅 불가능
- 모든 경우에 수에 대한 테스팅은 불가능함
개발 초기 테스팅 수행
- 개발 기간 단축, 결함 예방, 비용감소 가능
살충제 패러독스
- 반복적인 동일한 테스트로는 새로은 버그 발견이 불가능함
정황 의존적 테스팅
- 분야에 따라 접근 방법, 우선 순위, 심각도 상이
오류-부재의 궤변
- 사용자의 기대에 부응하지 않는 경우 테스트를 통한 결함 발견, 수정이 무의미함
- 테스트를 통해 결함 예방, 비용감소 등의 긍정적인 영향도 있지만, 테스트를 한다고 해서 모든 프로그램이 완벽하다고 신뢰할 수 는 없다.
나) 테스팅 프로세스
프로세스
주요활동
테스트 계획과 통제
- 테스트 목적/목표 설정 및 대상 연구 - 테스트 전략 개발 및 리스크 분석 - 전략 수립 및 테스트 완료 조건
테스트 분석과 설계
- 테스트 베이시스 검토 - 테스트 상황/요구사항/데이터 식별 -테스트 기법 할당 - 테스트 용이성(Testability) 평가 - 테스트 환경 구축
테스트 구현과 실행
- 테스트 케이스 명세화 : 우선순위 선정, 데이터 생성, 프로시저 작성 - 선행 테스팅 - 테스팅 실행 및 결과 기록 - 기대결과와 비교
완료 조건의 평가와 리포팅
- 완료 조건의 달성 여부 확인 - 최초 테스트 보고서 작성
테스트 마감활동
- 산출물 확인, 테스트웨어 보관 - 테스트 프로세스 평가
*테스트 웨어? 테스트를 계획, 설계, 실행하는 프로세스 동안 생성된 산출물
- 테스팅은 다양한 구성요소를 포함하는 프로세스를 중심으로 조정되고 관리되어야 함
다) 테스트 설계
① 테스트 설계 개요
- 테스트 케이스를 도출/수행하여 테스팅의 진행사항을 보장하기 위해 사용 됨
② 테스트 케이스의 구성
구성항목
내용
테스트케이스 ID
- 테스트케이스를 식별하기 위한 번호나 식별자
테스트케이스명
- 테스트 내용을 간단 명료하게 표현한 설명
사전조건
- 테스트 수행에 필요한 구동환경이나 테스트 데이터 등 사전조건에 대한 정보
테스트 수행절차
- 구체적인 테스트 수행 단계로 최대 7단계 이내로 작성
기대결과
- 테스트 수행 후 의도한 대로 동작 했는지 판단하는 근거
결과(합격/불합격)
- 테스트 케이스의 수행 결과
추적성
- 테스트 케이스와 관련된 요구사항 및 적용된 기법 등에 대한 정보
중요도
- 시간적 제약이 있을 경우 테스트 대상을 선별하기 위한 기준
비고
- 테스트 케이스 작성 의도 및 목적 등에 대한 관련 내용 기술
- 테스트 케이스는 특정 테스트 조건을 확인하기 위해 작성됨
③ 테스트 케이스 설계 기법
구분
기법
설명
명세 기반 기법
동등 분할 (Equivalence Partitioning)
- 동등하게 분할된 영역에서 대표 값으로 수행하도록 테스트 케이스를 설계하는 기법
경계값 분석 (Boundary Value Analysis)
- 경계부분에서 결함이 발견될 확률이 높기 때문에 경계값을 포함하여 테스트 케이스를 설계하는 기법
페어와이즈 조합 테스팅 (Pairwise Testing)
- 테스트에 필요한 각 값들이 다른 값들과 최소 한번씩 조합을 이루게 테이블을 만들고, 그에 따라 테스트를 수행하는 기법
결정 테이블 테스팅 (Decisiion Table Testing)
- 텟트 케이스가 결정 테이블에 표시된 입력값과 원인의 조합을 테스트하도록 설계하는 기법
상태전이 테스팅 (State Transition Testing)
- 상태 전이도를 기반으로 이벤트, 액션, 활동, 상태, 상태전이 사이의 관계를 설계하는 기법
유스케이스 테스팅 (Use Case Testing)
- 시스템이 유스케이스로 모델링 되어있을 때, 유스케이스에서 테스트 케이스를 도출하는 기법
구조 기반 기법
제어흐름 테스팅 (Control Flow Testing)
- 컴포넌트나 시스템을 통해 실행될 때 모든 가능한 이벤트 흐름(경로) 구조를 테스트할 수 있게 설계하는 기법
커버리지 테스팅 (Coverage Testing)
- 시스템 또는 소프트웨어의 구조가 테스트 스위트(Test Suite)에 의해 테스트된 정도인 커버리지를 달성학 위해 테스트 케이스를 설계하는 기법
최소비교 테스팅 (Elementary Comparison Testing)
- 변형 조건/결정(Modified Condition/Decision) 개념을 사용하여 입력 값의 조합을 테스트하도록 테스트 케이스를 도출하는 테스트 설계기법
경험 기반 기법
탐색적 테스팅 (Exploratory Testing)
- 테스터가 테스트를 수행하면서 테스트를 수행하는 동안 얻은 정보를 활용하여 비공식적인 테스트를 설계하는 기법
분류 트리 기법 (Classification Tree Method)
- 분류 트리로 표현된 테스트 케이스를 입력 및 출력 도메인의 대표 값을 조합하여 수행하도록 설계하는 기법
- 테스트 설계 기법은 테스트 베이시스의 참조 기준으로 기법이 분류됨
02. 테스팅 유형 및 기법
가) 테스팅 유형
① 테스트 레벨 유형
- 각 유형 별 테스트에서 테스트 수행의 주체, 목적, 환경 등을 고려하여 테스트를 수행
② 테스트 유형
테스트 유형
목적
수행 주체
환경
인수 테스트
- 요구사항과 일치성 확인
- 사용자
- 사용자 환경
시스템 테스트
- 실제환경과 유사한 환경에서 전체 기능, 비기능적 테스트 확인
- 테스트 조직
- 실제 사용자 환경과 유사한 환경
통합 테스트
- 단위 모듈 간의 인터페이스에서 결함 발견
- 개발 조직 또는 테스트 조직
- 개발 환경 또는 테스트 환경
단위 테스트
- 단위 모듈 내의 결함 발견
- 개발 조직
- 개발 환경
- 테스트 레벨 별로 목적, 수행주체, 환경에 따라 테스트 케이스를 도출하기 위해 참조되는 개발 산출물을 상세하게 정의해야 함
나) 테스팅 기법
- 테스팅 기법은 화이트 박스 테스팅과 블랙박스 테스팅 기법으로 구분됨
① 화이트 박스 테스팅 기법
- (정의) 원시코드를 보고 실행을 변경하면서 검사를 수행하는 기법
종류
설명
기초 경로 검사 (Base Path Testing)
- 코드의 복잡성을 측정하도록 하는 테스트 기법
제어 구조 검사 (Control Structure Testing)
- 논리적 조건, 반복 구조, 데이터 흐름 테스트 - 조건 검사(Condition Testing) : 논리적 조건 테스트 수행 - 반복 검사 (Loop Testing) : 반복 구조에 초점을 맞추어 테스트 수행 - 데이터 흐름 검사(Data Flow Testing) : 변수 정의, 사용 위치 초첨
- 화이트 박스 테스트의 검증 기준은 문장, 분기, 조건, 분기/조건 으로 분류됨
② 블랙 박스 테스팅 기법
- (정의) 사용자의 요구사항 명세에 따라 각 기능이 정상적으로 작동되는지 입증하는 기능 테스트 기법
종류
설명
동치분할 테스트 (동치 클래스 분해) (Equivalence Partitioning Testing)
- 어떤 값이 입력되었을때 예상되는 결과값을 테스트케이스로 잡고 실제로 테스트 했을때 예상되는 결과값이 나오는지 확인하는것
경계값 분석 (Boundry Value Analysis)
- 입력 조건의 중간값 보다 경계값에서 오류발생 확률이 높기 때문에 경계값을 테스트 케이스로 선정하여 검사하는 기법
원인-효과 그래프 검사 (Cause-Effect Graphing Testing)
- 여러 입출력 데이터를 분석해서 영향을 미치는 상황을 체계적으로 분석한 다음 효율성이 높은 테스트 케이스를 선정하는 기법
오류 예측 검사 (Error Guessing)
- 과거의 경험이나 확인자의 감각으로 테스트 수행
비교 검사 (Comparison Testing)
- 동일한 테스트 케이스를 여러 버전의 프로그램에 적용하여 동일한 결과가 출력되는지 비교하는 테스팅 기법
- 요구사항 명세대로 소프트웨어가 동작하는지 초점을 맞춘 테스트 기법
03. 리팩토링
가) 리팩토링 개념
① 리팩토링 개요
- (정의) 소프트웨어의 외부적 기능은 수정하지 않고, 내부 구조, 관계 등을 단순화 하여 유지보수성을 향상시키는 품질 향상 기법
- (목적) 유지보수성 향상, 유연한 시스템, 생산성 향상, 품질 향상
② 리팩토링 수행 절차
대상 선정
유지보수, Inspection, XP 방법론 적용
조직 구성
- 멘토 역할의 선임자와 복합 구성
수행 통제
- 변경 관리, 형상관리 수행, CCB 통제
수행 기법
- 디자인 패턴, AOP 수행
테스트
- 단위/통합 테스트, 회귀 테스트
결과 정리
- 문서화, 현행화, 운용 시스템 적용
- 리팩토링은 소규묘 변경 후 동작 여부를 테스트 하고, 정상 동작하는 경우 다음 리팩토링 단계로 전진하는 방식으로 진행
나) 코드스멜(Code Smell) 개념
① 코드스멜의 정의
- 읽기 어렵거나 중복된 로직을 가진 프로그램처럼 개발자가 이해하거나 유지보수하기 어려워 리팩토링의 대상이 되는 소스코드
② 코드스멜의 종류
종류
설명
중복된 코드
- 기능이나 데이터 코드가 중복 작성
너무 긴 메소드
- 메소드 내부의 과도한 길이
방대한 클래스
- 한 클래스에 너무 많은 속성과 메소드 존재
과다한 매개변수
- 하나의 메소드가 받는 다수의 매개 변수
두가지 이유로 수정되는 클래스
- 한 클래스의 메소드가 2가지 이상의 이유로 수정될 경우, 해당 클래스는 한가지 종류의 책임만을 수행하지 않음
여러 클래슬를 동시에 수정
- 특정 클래스를 수정하면 그때마다 관련된 여러 클래스들 내에서 자잘한 변경 수행 필요
데이터 뭉치
- 합쳐서 다뤄야 할 데이터가 한 클래스에 존재하지 않음
기본 타입 집착
- 클래스를 만들지 않고 int 같은 기본 타입만 사용
스위치 문
- swich 문이나 if 문으로 동작을 나눔
게으른 클래스
- 클래스의 역할 없음
의심스러운 일반화
- 과도한 일반화
클래스 인터페이스 불일치
- 클래스 인터페이스(API) 부적절성
불완전한 라이브러리 클래스
- 기존 라이브러리 클래스 사용의 어려움
평행상속
- 하위 클래스를 만들면 클래스 계층의 다른 곳에도 하위 클래스를 만들어야 함
주석
- 코드의 모자란 부분을 설명하기 위한 너무 자세한 주석
- 코드의 복잡도 및 이해하기 쉽게하기 위한 클린 코드의 필요성 증대
*클린코드(Clean Code) ? 코드를 작성한 의도와 목적이 명확하여 다른 사람이 쉽게 읽을 수 있도록 설계자의 의도를 반영하여 단순하고 직접적으로 작성된 코드
다) 대표적인 리팩토링 기법
리팩토링 기법
설명
메소드 정리
Extract Method
- 그룹으로 함께 묶을 수 있는 코드 조작이 있을 때 코드의 목적이 잘 드러나도록 메소드 이름을 지어 별도의 메소드로 뽑아내는 작업
Replace Parameter with Method
- 객체가 메소드를 호출한 다음, 결과를 다른 메소드에 매개변수로 넘기면 수신자가 그 메소드를 호출하도록 작업
객체 간 기능 이동
Extract Class
- 두개의 클래스가 할 일을 하나의 클래스가 하는 경우 새로운 클래스를 만들어 관련있는 필드와 메소드를 예전 클래스에서 이전
Extract Subclass
- 어떤 클래스가 일부 인스턴스에 의해서만 사용되는 기능을 가지고 있는 경우 인스턴스만 사용하는 기능을 담당하는 서브클래스를 생성
Extract Interface
- 여러 클라이언트가 한 클래스의 인터페이스의 동일한 부분 집합을 사용하고 있는 경우 부분 집합을 인터페이스로 뽑아내는 방법
이름
Rename Method
- 타입이 내장되어 있는 이름은 타입에 연관되지 않으면서 의도를 잘 전달할 수 있는 이름으로 변경
추측성 일반화
Inline Method
- 메소드의 본문이 메소드 이름만큼 명확하다면 해당 본문을 메소드를 호출하는 호출자 안으로 옮기고 메소드를 삭제
Collapse Hierarchy
- 수퍼클래스와 서브클래스가 별로 다르지 않다면 하나로 통합하는 방법
- 리팩토링 시 코드에 대한 과도한 수정이 필요하거나, 적합하지 않은 인터페이스에 대해서는 무리한 리팩토링은 시스템의 불안정성을 유발할 수 있음