옐그's 코딩라이프

[TOPCIT][01] IX. 소프트웨어 테스팅과 리팩토링 (에센스 정리 요약) 본문

TOPCIT

[TOPCIT][01] IX. 소프트웨어 테스팅과 리팩토링 (에센스 정리 요약)

옐그멍이 2023. 2. 23. 18:24

학습 목표

1. 테스팅에 대한 개념을 설명하고 테스트 케이스 설계 방법을 비교할 수 있다.

2. 테스트 레벨(유형)과 목적을 설명할 수 있다.

3. 소프트웨어 리팩토링에 대한 개념과 주요 리팩토링 활동을 설명할 수 있다.

 

핵심 키워드

- 테스팅 프로세스, 테스팅 유형

- 명세기반 기법, 구조기반 기법, 경험기반 기법

- 화이트박스 테스팅, 블랙박스 테스팅

- 소프트웨어 코드스멜과 리팩토링

 

01 테스팅 개념 및 프로세스

테스팅 개념

- 어플리케이션 또는 시스템의 동작과 성능, 안정성이 사용자나 고객이 요구하는 수준을 만족하는지 확인이나 검증하기 위해 결함을 발견하는 방법

 

테스팅의 일반적인 원리

1. 결함의 존재성을 밝히는 행동

2. 완벽한 테스팅은 불가능

3. 테스팅은 개발 초기에 시작

4. 살충제 패러독스 (동일한 살충제를 계속 뿌리면 벌레들도 내성이 생기고 살충제는 더 이상 효과를 발휘하지 못 함)

5. 테스팅은 정황에 의존적

6. 오류-부재의 궤변 (개발된 시스템이 사용자의 필요와 기대에 부응하지 못한 채 쓸모가 없다면 결함을 찾고 수정하는 과정은 의미 없음)

 

테스팅 프로세스

프로세스 주요활동
테스트 계획과 통제 - 테스트 목적/목표 설정 및 대상 연구
- 테스트 전력개발 및 리스크 분석
- 전략수립 및 테스트 완료 조건
테스트 분석과 설계 - 테스트 베이시스 검토
- 테스트 상황/요구사항/데이터 식별
- 테스트 기법 할당
- 테스트 용이성 평가
- 테스트 환경 구축
테스트 구현과 실행 - 테스트 케이스 명세화 : 우선순위 선정, 데이터 생성, 프로시저 작성
- 선행 테스팅
- 테스팅 실행 및 결과 기록
- 기대결과와 비교
완료 조건의 평가와 리포팅 - 완료조건의 달성 여부 확인
- 최초테스트 보고서 작성
테스트 마감 활동 - 산출물 확인, 테스트웨어 보관
- 테스트 프로세스 평가

 

테스팅의 설계

- 테스트 설계는 테스트 케이스를 도출하고 수행하여 테스트 대상이 어느 수준까지 테스팅이 되었는지 보장하기 위해 사용됨

 

테스트 케이스의 구성항목

구성항목 내용
테스트케이스 ID 테스트케이스를 식별하기 위한 번호나 식별자
테스트케이스명 테스트 내용을 간단 명료하게 표현한 설명
사전조건 테스트 수행에 필요한 구동환경이나 테스트 데이터 등 사전 조건에 대한 정보
테스트 수행절차 구체적인 테스트 수행 단계로 최대 7단계 이내로 작성
기대결과 테스트 수행 후 의도한 대로 동작했는지 판단하는 근거
결과(합격/불합격) 테스트 케이스의 수행 결과
추적성 테스트 케이스와 관련된 요구사항 및 적용된 기법 등에 대한 정보
중요도 시간적 제약이 있을 경우 테스트 대상을 선별하기 위한 기준
비고 테스트 케이스 작성 의도 및 목적 등에 대한 관련 내용 기술

 

테스트 케이스 설계 기법

구분 기법 설명  
명세기반기법 동등 분할
(Equivalence Partitioning)
동등하게 분할된 영역에서 대표값으로 수행하도록 테스트 케이스를 설계하는 기법
경계값 분석
(Boundary Value Analysis)
동등 분할의 경계 부분에 해당되는 입력값에서 결함이 발견될 확률이 높기 때문에 경계값까지 포함하여 테스트 케이스를 설계하는 기법
페어와이즈 조합 테스팅
(Pairwise Testing)
테스트에 필요한 각 값들이 다른 값들과 최소한 한번씩은 조합을 이루게 테이블을 만들고, 그에 따라 테스트를 수행하도록 설계하는 기법
결정테이블 테스팅
(Decision Table Testing)
테스트 케이스가 결정 테이블에 표시된 입력값과 자극(원인)의 조합을 테스트하도록 설계하는 기법
상태전이 테스팅
(State Transition Testing)
상태 전이도(State Transition Diagram)를 기반으로 이벤트, 액션, 활동, 상태, 상태전이 사이의 관계를 설계하는 기법
유스케이스 테스팅
(Use Case Testing)
시스템이 유스케이스로 모델링 되어있을 때, 유스케이스에서 테스트 케이스를 도출하는 기법
구조기반기법 제어흐름 테스팅
(Control Flow Testing)
컴포넌트나 시스템을 통해 실행될 때 모든 가능한 이벤트 흐름(경로)구조를 테스트할 수 있게 설계하는 기법
커버리지 테스팅
(Coverage Testing)
시스템 또는 소프트웨어의 구조가 테스트 스위트에 의해 테스트된 정도인 커버리지를 달성하기 위해 테스트 케이스를 설계하는 기법
최소비교 테스팅
(Elementary Comparison Testing)
변형 조건/결정 개념을 사용하여 입력값의 조합을 테스트하도록 테스트 케이스를 도출하는 테스트 설계 기법
경험기반기법 탐색적 테스팅
(Exploratory Testing)
테스터가 테스트를 수행하면서 테스트 설계를 능동적으로 제어하고, 새롭고 보다 나은 테스트를 설계하기 위해 테스트를 수행하는 동안 얻은 정보를 활용하는 비공식적인 테스트를 설계하는 기법
분류 트리 기법
(Classification Tree Method)
분류 트리로 표현된 테스트 케이스를 입력 및 출력 도메인의 대표값을 조합하여 수행하도록 설계하는 기법

 

02 테스팅 유형 및 기법

테스팅 유형

테스트 유형 목적 수행주체  환경
인수 테스트 요구사항과의 일치성 확인 사용자 사용자 환경
시스템 테스트 실제 환경과 유사한 환경에서 전체적 기능/비기능적 테스트 확인 테스트 조직 실제 사용자 환경과 유사한 환경
통합 테스트 단위 모듈 간의 인터페이스에서 결함 발견 개발 조직 또는 테스트 조직 개발 환경 또는 테스트 환경
단위 테스트 단위 모듈 내의 결함 발견 개발 조직 개발 환경

 

테스팅 기법의 종류

- 화이트박스 테스팅

- 블랙박스 테스팅

 

화이트박스 테스팅

- 구조적 또는 코드기반 테스트

- 단위 테스팅에서 주로 사용됨

- 테스트가 가능한 소프트웨어 내에서 결함을 찾고 해당 기능을 검증하는 것

- 통합 테스팅 시에도 구조적 접근법을 사용하여 적용될 수 있음

 

화이트박스 테스트 기법

구분 내용
구조적 기법 프로그램의 논리적인 복잡도를 축정하여 평가함
루프 테스트 프로그램의 루프 구조에 제한하여 실시하는 방법

 

블랙박스 테스팅

- 기능 또는 명세기반 테스트

- 주로 시스템 테스팅에서 사용되고 기능 및 비기능 요구사항을 모두 검증

- 요구사항 명세대로 소프트웨어가 작동하는지에 초점이 맞추어진 테스팅

 

블랙박스 테스트 기법

구분 내용
동등 분할 기법 - 다양한 입력 조건의 테스트 사례들을 선정하여 테스트
ex) 1~100 범위에서 x < 0, 0, x, 100, x > 100으로 구분하여 테스트
경계값 분석 기법 - 경계값을 기준으로 결과의 정확성을 테스트
ex) 1~100 범위에서 x=0, x=100, x=-1, x=200 등으로 테스트
원인/결과 그래프 기법 - 입력값이 출력값에 미치는 영향을 그래프로 표현하여 오류검출
오류 예측 기법 - 간과할 수 있는 오류들을 감각과 경험으로 검출하는 기법
ex) 입력값 없이 확인하거나 텍스트 입력란에 숫자 입력

 

03 리팩토링

리팩토링 개념

- 외부에서 보는 프로그램 동작은 변경하지 않고 프로그램 내부 구조를 개선하는 것

- 소프트웨어의 외부적 기능은 수정하지 않고 내부적 구조 및 관계를 단순화하여 소프트웨어의 유지 보수성을 향상시켜 품질을 높이는 활동

 

리팩토링 수행하는 이유

- 오류발견과 디버깅을 용이하게 함

- 소프트웨어 요구사항 변경에 효과적 대응 가능

- 복잡한 코드의 단순화 및 소스코드의 가독성 향상

- 프로그램 생산성 및 품질 향상

 

리팩토링 시점

- 일반적으로 코드에 새로운 기능을 추가하는 시간이 비효율적일 때 추가가 쉽지 않은 형태의 디자인 변경, 버그를 수정해야 할 때, 코드 검토를 할 때 주로 수행

 

리팩토링 수행 절차

대상 선정 유지보수, Inspection, XP 방법론 적용
조직 구성 멘토 역할의 선임자와 복합 구성
수행 통제 변경 관리, 형상관리 수행, CCB 통제
수행 기법 디자인 패턴, AOP 수행
테스트 단위/통합 테스트, 회귀 테스트
결과 정리 문서화, 현행화, 운용 시스템 적용

 

코드스멜(Code Smell) 개념

- 읽기 어렵거나 중복된 로직을 가진 프로그램처럼 개발자가 이해하거나 유지보수하기 어려워 리팩토링의 대상이 되는 코드

 

코드스멜의 종류

- 중복된 코드

- 너무 긴 메소드

- 방대한 클래스

- 과다한 매개변수

- 두 가지 이유로 수정되는 클래스

- 여러 클래스를 동시에 수정

- 데이터 뭉치

- 기본 타입 집착

- 스위치 문

- 게으른 클래스

- 의심스러운 일반화

- 클래스 인터페이스 불일치

- 불완전한 라이브러리 클래스

- 평행상속

- 주석

 

대표적인 리팩토링 기법

리팩토링 기법 설명  
메소드 정리 Extract Method 그룹으로 함께 묶을 수 있는 코드 조작이 있을 때 코드의 목적이 잘 드러나도록 메소드 이름을 지어 별도의 메소드로 뽑아내는 작업
Replace Parameter with Method 객체가 메소드를 호출한 다음, 결과를 다른 메소드에 매개변수로 넘기고 있으면 수신자가 그 메소드를 호출하도록 하는 작업
객체 간 기능 이동 Extract Class 두 개의 클래스가 해야할 일을 하나의 클래스가 하고 있는 경우 새로운 클래스를 만들어 관련있는 필드와 메소드를 예전 클래스에서 이전
Extract Subclass 어떤 클래스가 일부 인스턴스에 의해서만 사용되는 기능을 가지고 있다면 인스턴스만 사용하는 기능을 담당하는 서브클래스를 만드는 작업
Extract Interface 여러 클라이언트가 한 클래스의 인터페이스의 동일한 부분집합을 사용하고 있다면 부분집합을 인터페이스로 뽑아내는 방법
이름 Rename Method 타입이 내장되어 있는 이름은 타입에 연관되지 않으면서 의도를 잘 전달할 수 있는 이름으로 변경
추측성 일반화 Inline Method 메소드의 본문이 메소드 이름만큼 명확하다면 해당 본문을 메소드를 호출하는 호출자 안으로 옮기고 메소드를 삭제
Collapse Hierarchy 수퍼클래스와 서브클래스가 별로 다르지 않다면 하나로 통합하는 방법
중복 Replace Magic Number with Symbolic Constant 특별한 의미를 갖는 숫자 리터럴이 있을 경우 상수를 만들어 의미가 잘 드러나도록 이름을 짓고 숫자를 상수로 대체하는 방법
Pull Up Field 두 서브 클래스가 동일한 필드를 가지고 있다면 그 필드를 수퍼 클래스로 옮기는 작업
Pull Up Method 동일한 일을 하는 메소드를 여러 서브클래스에서 가지고 있다면 해당 메소드를 수퍼클래스로 옮기는 작업

 

728x90