on
10. 명세 기반 테스트
10. 명세 기반 테스트
1. 요약
Black Box Test
- 내부 논리 구조 참조하지 않고, 명세나 설계 정보 등을 이용해 TC 작성
- 컴포넌트, 통합, 시스템, 인수 테스트 레벨 전 과정에서 사용 가능
- 개발자 보다 프로그램 내부 코드 모르는 사람이 테스트하는 것이 좋음 (도메인 지식이 풍부한 사람)
- eXtreme Programming TDD는 개발자가 TC를 먼저 작성 -> 코드에 없는 부분을 고려해서 괜찮다
장점
1. 명세를 바탕으로 TC 설계하므로 규모가 통합 테스트 이상 단위에도 적용 가능
2. 구현에 관한 지식이 없어도 테스트 수행 가능
3. 명세의 결함을 찾을 수 있고, 코드 구현까지 기다릴 필요 없음
4. 명세에는 있지만 구현되지 않은 기능인 '누락'을 찾을 수 있음
2. 동등 분할
입력이나 출력을 동등 클래스로 나눠 클래스 내의 1개 값만 입력
동등 분할 절차
1. 명세에서 입력, 출력을 식별
2. 입/출력을 동등 클래스로 분할 (도메인 지식이나 경험을 활용)
3. 동등 클래스의 최소한 1개의 대푯값 선정 후 TC에 반영해 테이블 작성
* 동등 클래스는 범위가 겹치면 안됨
동등 클래스 분할 방법
입력 조건 방법 예 범위 1. 범위 내의 값
2. 범위의 하한보다 낮은 값
3. 범위의 상한보다 높은 값 나이가 20~40이 조건이면
1. 20~40내의 나이
2. 20 미만의 나이
3. 40 초과의 나이 값 1. 해당하는 값
2. 해당하지 않는 값 값이 10이어야 하는 경우
1. 10
2. 10이 아닌 값 집합의 원소 1. 집합에 해당하는 원소
2. 집합에 해당하지 않는 원소 집합이 과일 이라면
1. 사과
2. 인간 존재 유무 1. 있는 경우
2. 없는 경우 설문 조사에서 이름이 꼭 필요한 경우
1. 이름을 입력한 경우
2. 이름을 비워 놓은 경우
ex 1) 명세
나이 10세 이상 "입장 불가", 나이 10~15세면 "보호자 동반 입장", 나이 15세 초과 "입장 가능", 80세 이상 "보호자 동반 입장 가능", 0세이하이거나 정수가 아니면 "Invalid input", 100세 넘는 경우 "Too old" 메시지 출력
유효 분할 유효하지 않은 분할 입력 0 < 나이 <= 100 나이 <= 0
100 < 나이
나이 = 문자열
나이 = 실수 출력 "입장 불가" : (0 < 나이 <= 10)
"보호자 동반 입장" : (10 < 나이 <= 15), (80 < 나이 <= 100)
"입장 가능" : (15 < 나이 <= 80)
"Invalid input" : (나이 <= 0), (나이=non-integer)
"Too old" : (나이 > 100) 메시지 != {"입장 불가", "보호자 동반 입장", "입장 가능", "Invalid input", "Too old"}
"노인 할인 입장" : (60 < 나이 <= 100)
- 노인 할인 입장은 테스터의 경험에 의해 생성됨
TC 입력 예상 출력 동등 클래스 1 50 "입장 가능" 0 < 나이 <= 100 2 0 "Invalid input" 나이 <= 0 3 -1 "Invalid input" 나이 <= 0 4 101 "Too old" 100 < 나이 5 15 "보호자 동반 입장" 10 < 나이 <= 15 6 "abc" "Invalid input" 나이 = 문자열 7 22.4 "Invalid input" 나이 = 실수 8 70 "입장 가능" "노인 할인 입장"
ex 2) 명세
나이 10세 이상 "입장 불가", 나이 10~15세면 "보호자 동반 입장", 나이 15세 초과 "입장 가능", 80세 이상 "보호자 동반 입장 가능", 0세이하이거나 정수가 아니면 "Invalid input", 100세 넘는 경우 "Too old" 메시지 출력, 남자 F, 여자 M, 30세 이상 여자 관객 할인
유효 분할 유효하지 않은 분할 입력 0 < 나이 <= 100
성별 = 'M'
성별 = 'F' 나이 <= 0
100 < 나이
나이 = 문자열
나이 = 실수
성별 != {'M', 'F'} 출력 "입장 불가" : (0 < 나이 <= 10)
"보호자 동반 입장" : (10 < 나이 <= 15), (80 < 나이 <= 100)
"입장 가능" : (30 < 나이 <= 80) && (성별='M'), (15 < 나이 <= 30)
"Invalid input" : (나이 <= 0), (나이=non-integer), 성별 != {'M', 'F'}
"Too old" : (나이 > 100)
"여성 할인 입장" : (30 < 나이 <= 80) && (성별 = 'F')
"여성 할인 입장" && "보호자 동반 입장" : (80 < 나이 <= 100 ) && (성별 = 'F') 메시지 != {"입장 불가", "보호자 동반 입장", "입장 가능", "Invalid input", "Too old"}
"노인 할인 입장" : (60 < 나이 <= 100)
one-to-one 동등 분할 : 1개의 값만 동등 클래스 평가, 1개 입력만 유효하지 않은 분할 사용해야함
ex)
TC# 나이 성별 예상 출력 동등 클래스 1 50 'M' "입장 가능" 0 < 나이 <= 100 2 30 'M' "입장 가능" 성별 = 'M' 3 -10 'M' "Invalid input" 나이 <= 0
최소화 동등 분할 : 모든 동등 클래스 평가
ex)
TC# 나이 성별 예상 출력 동등 클래스 1 65 'M' "입장 가능" 0 < 나이 <= 100,
성별='M',
(30 < 나이 <= 80) && (성별 = 'M')
"노인할인입장" : 60 < 나이 <= 100 2 21.5 'F' "Invalid input" 나이 = 실수
나이 = non-integer
성별 = 'F' 3 -10 'D' "Invalid input" 나이 <= 0,
성별 != {'M', 'F'}
따라서, one-to-one 동등 분할 -> 유효하지 못한 케이스 / 최소화 동등 분할 -> 유효한 케이스 설계
3. 분류 트리 기법
동등 분할 테스트를 체계적으로 수행 하기 위함 -> 도메인 지식, 경험, 프로그램 명세 등으로 분류
분류 트리
조합 방법
Each choice 조합 : 최소 1 TC에 1 클래스 할당
All combinations 조합 : 모든 TC에 각 클래스 모두 할당
위 그림의 조합표는 one-to-one 방식으로 TC를 작성함
테스트 케이스 입력 예상 출력 동등 클래스 T1 "abc" "Invalid input" 나이=문자열 T2 27.5 "Invalid input" 나이=실수 T3 -10 "Invalid input" 나이 <= 0 T4 110 "too-old" 나이 > 100 T5 5 "입장 불가" 0 < 나이 <= 10 T6 13 "보호자 동반 입장" 10 < 나이 <= 15 T7 13 "입장 가능" 15 < 나이 <= 80 T8 85 "보호자 동반 입장" 80 < 나이 <= 100
4. 경곗값 분석
클래스를 나누는 경계에 있는 값을 기준으로 분석
분석 방법
1. 명세에서 입/출력 식별
2. 입/출력에 대한 동등 분할 수행
3. 클래스 경곗값 식별
4. 2-value BVA나 3-value BVA 경곗값 분석 수행
5. 4의 결과를 기대 출력으로 TC설계 -> one-to-one 방식이나 최소화 방식 사용
ex)
경곗값
X = 9 (범위 미만 외부 경계)
X = 10, 20 (10 <= X <= 20 범위 내의 경계)
X = 21 (범위 초과 외부 경계)
X = 32767 (X 가 표현할 수 있는 최대 정수)
X = -32768 (X 가 표현할 수 있는 최소 정수)
2-value BVA
id 입력 경계 1 9, 10 9 2 9, 10 10 3 20, 21 20 4 20, 21 21 5 32767, 32768 32767 6 -32768, -32769 -32768
3-value BVA
id 입력 경계 1 8, 9, 10 9 2 9, 10, 11 10 3 19, 20, 21 20 4 20, 21, 22 21 5 32766, 32767, 32768 32767 6 -32767, -32768, -32769 -32768
ex 2) 20 <= 나이 <= 50, 155 <= 신장 <= 190인 경우만 O 나머지 X
2-value BVA
경곗값 = 나이 19, 20, 50, 51 / 신장 154, 155, 190, 191
one-to-one 방식으로 설계
TC 나이 신장 기대 출력 1 19 170 X 2 20 170 O 3 50 170 O 4 51 170 X 5 35 154 X 6 35 155 O 7 35 190 O 8 35 191 X
최소화 방식으로 설계
TC 나이 신장 기대 출력 1 19 154 X 2 20 155 O 3 50 190 O 4 51 191 X
5. 조합 테스트
입력 인자를 여러 클래스로 분할 하고 조합하여 테스트함
조합 테스트 방법
1. 입력 식별
2. 입력을 동등 분할이나 BVA로 클래스로 분할시킴
3. 적절한 조합 테스트 방법으로 입력값 조합
4. 기대 결과 예측
조합 테스트 종류
- Each choice 테스트 : 각 클래스 최소 1회 TC에 포함
- Pair-wise 테스트 : 각 클래스 다른 클래스와 최소 1회 조합
- All combinations 테스트 : 각 클래스 다른 클래스와 모든 조합
- Base choice 테스트 : 기반 테스트 input을 정해놓고, 한 클래스만 값을 변경하고 나머지는 고정
ex) 명세
도우 : 곡물 10000, 나폴리 12000, 씬 14000
토핑 : 기본 3000, 프리미엄 5000
주문 : 전화 -0, 온라인 주문 -1000
All combinations
TC 도우 토핑 주문 기대 출력 1 곡물 기본 전화 13000 2 곡물 기본 온라인 12000 3 곡물 프리미엄 전화 15000 4 곡물 프리미엄 온라인 14000 5 나폴리 기본 전화 15000 6 나폴리 기본 온라인 14000 7 나폴리 프리미엄 전화 17000 8 나폴리 프리미엄 온라인 16000 9 씬 크러스트 기본 전화 17000 10 씬 크러스트 기본 온라인 16000 11 씬 크러스트 프리미엄 전화 19000 12 씬 크러스트 프리미엄 온라인 18000
Each choice : 프로그램이 병렬적일 경우 효과적
TC 도우 토핑 주문 기대 출력 1 곡물 기본 온라인 12000 2 나폴리 프리미엄 전화 17000 3 씬 크러스트 프리미엄 전화 19000
Pair-wise : 단 2개의 입력에 대한 조합만 테스트
TC 도우 토핑 주문 기대 출력 1 곡물 기본 전화 13000 2 곡물 프리미엄 온라인 12000 3 나폴리 기본 전화 15000 4 나폴리 프리미엄 온라인 14000 5 씬 크러스트 기본 온라인 18000 6 씬 크러스트 프리미엄 전화 19000
In-Parameter-Order : Pair-wise TC 생성 알고리즘
1. 입력 인자(각 클래스)가 p1, p2, ..., pN까지 있을때, p1과 p2의 가능한 모든 조합의 집합 구성
2. 입력 인자를 하나씩 추가하면서 수평확장(입력 인자 추가)
3. 수직확장(TC를 기존 집합에 추가) 2~3 과정 반복
ex) 피자 예제
1. 도우 토핑 조합 구함
도우 토핑 곡물 기본 곡물 프리미엄 나폴리 기본 나폴리 프리미엄 씬 크러스트 기본 씬 크러스트 프리미엄
2. 수평확장 : 주문 인자 추가
도우 X 주문 = { (곡물, 전화), (곡물, 온라인), (나폴리, 전화), (나폴리, 온라인), (씬 크러스트, 전화), (씬 크러스트, 온라인) }
토핑 X 주문 = { (기본, 전화), (기본, 온라인), (프리미엄, 전화), (프리미엄, 온라인) }
새로운 인자와의 조합에서 구해진 조합에서 가장 많이 겹치는 인자를 추가
-> (곡물, 전화), (기본, 전화) 조합과 (곡물, 온라인), (기본, 온라인) 조합 둘다 기존 조합 2회씩 포함되므로 아무거나
도우 토핑 주문 곡물 기본 전화 곡물 프리미엄 나폴리 기본 나폴리 프리미엄 씬 크러스트 기본 씬 크러스트 프리미엄
-> 선택된 조합은 제거하고 다시 반복
도우 X 주문 = { (곡물, 온라인), (나폴리, 전화), (나폴리, 온라인), (씬 크러스트, 전화), (씬 크러스트, 온라인) }
토핑 X 주문 = { (기본, 온라인), (프리미엄, 전화), (프리미엄, 온라인) }
도우 토핑 주문 곡물 기본 전화 곡물 프리미엄 온라인 나폴리 기본 전화 나폴리 프리미엄 온라인 씬 크러스트 기본 씬 크러스트 프리미엄
-> 선택된 조합은 제거하고 다시 반복
도우 X 주문 = { (씬 크러스트, 전화), (씬 크러스트, 온라인) }
토핑 X 주문 = { (기본, 온라인), (프리미엄, 전화) }
도우 토핑 주문 곡물 기본 전화 곡물 프리미엄 온라인 나폴리 기본 전화 나폴리 프리미엄 온라인 씬 크러스트 기본 온라인 씬 크러스트 프리미엄 전화
3. 수직확장 : 남은 조합을 TC에 모두 추가
남은 쌍이 없으므로 끝
Pair-wise도 3가지 이상의 입력인자 조합으로 나오는 문제는 찾을 수 없음
따라서, Base-choice 이용
Base-choice 방법
1. 일반적으로 정상 작동하는 조합 1개 선정
2. 나머지 인자는 선정된 값으로 고정, 각 인자를 바꿔가며 테스트
ex) 곡물, 기본, 전화 조합을 선정하고 나머지 테스트
TC 도우 토핑 주문 기대 출력 1 곡물 기본 전화 13000 2 곡물 기본 온라인 12000 3 곡물 프리미엄 전화 15000 4 나폴리 기본 전화 15000 5 씬 크러스트 기본 전화 17000
6. 결정표 테스트
결정표 테스트 방법
1. 명세를 통해 모든 조건 분석
2. 조건 조합에 대한 행위 결정
3. 결정표 만듦
4. 가능하지 못한 조건 조합 배제
5. 결정표 축약
6. 결정표 각 규칙이 최소 한번은 실행 되도록 TC 생성
ex)
성적이 B이상이면 상담 프로그램 필요없음
성적이 C이하고 결석 일수가 3일 이상 -> ㄱ 상담 프로그램
성적이 C이하고 결석 일수가 2일 이하 -> ㄴ 상담 프로그램
성적이 C이하고 1학년이면 -> ㄷ 상담 프로그램 추가이수
1. 명세를 통한 조건 분석
- 성적이 C이하인지?
- 결석 일수가 3일 이상인지?
- 1학년인지?
2. 조건 조합에 대한 행위 결정
- 성적이 C이하고 결석 일수가 3일 이상 -> ㄱ 상담 프로그램
- 성적이 C이하고 결석 일수가 2일 이하 -> ㄴ 상담 프로그램
- 성적이 C이하고 1학년이면 -> ㄷ 상담 프로그램 추가이수
3. 결정표 생성
규칙 조건 행위 C이하 결석 3일 이상 1학년 ㄱ ㄴ ㄷ 1 T T T T F T 2 T T F T F F 3 T F T F T T 4 T F F F T T 5 F T T F F F 6 F T F F F F 7 F F T F F F 8 F F F F F F
4. 가능하지 못한 조건 배제
규칙 조건 행위 C이하 결석 3일 이상 1학년 ㄱ ㄴ ㄷ 1 T T T T F T 2 T T F T F F 3 T F T F T T 4 T F F F T T 5 F T T F F F 6 F T F F F F 7 F F T F F F 8 F F F F F F
5. 결정표 축약
규칙 조건 행위 C이하 결석 3일 이상 1학년 ㄱ ㄴ ㄷ 1 T T T T F T 2 T T F T F F 3 T F T F T T 4 T F F F T T 5 F - - F F F
6. 결정표에 따른 TC 생성
TC 학점 결석 일수 학년 기대 출력 1 D 3 1 ㄱ/ㄷ 상담 2 C+ 4 3 ㄷ상담 3 C 1 1 ㄴ/ㄷ 상담 4 D+ 2 2 ㄱ 상담 5 B+ 3 4 해당 없음
7. 상태 전이 테스트
상태 : 시스템의 상태
이벤트 : 상태가 자기자신 혹은 다른 상태로 전이될때 발생하는 행위
상태 전이 테스트 방식
1. 상태 테스트 : 모든 상태 최소 1회
2. 단일 전이 테스트 0-switch Test : 모든 유효한 전이 최소 1회
3. All Transitions Test : 모든 유효한 전이 최소 1회 + 모든 유효하지 않은 전이 최소 1회
4. 다중 전이 테스트 N-switch Test : N + 1개 전이 시퀀스들을 최소1회
All Transitions Test
1. 명세에 따라 상태 전이도 모델링
2. 전이 트리 작성
3. 전이 경로 TC 생성
4. 유효하지 않은 전이 TC 생성
전이 트리 작성 방법
1. 상태 전이도 초기 상태를 전이 트리의 루트 노드로
2. 루트에서 각 전이에 전이 후 상태 노드 추가 및 연결
3. 전이 후 상태가 종료상태가 아니면 반복
ex) 명세
테이프 재생기 재생, 빠른 이동, 빠른 재생, 정지 버튼 있음
재생 ->(빠른 재생 버튼)-> 빠른 재생
빠른 재생 ->(빠른 이동 버튼)-> 빠른 이동
빠른 재생 ->(정지 버튼)-> 재생
빠른 이동 ->(재생 버튼)-> 재생
재생 ->(정지 버튼)-> 정지
빠른 이동 ->(정지 버튼)-> 정지
상태 전이도
전이 트리
단일 전이 테스트 (0-switch Test) 수행 결과 : 유효한 전이
TC 입력 예상 출력 시작 상태 이벤트 행위 목적 상태 1 OFF play - PL 2 OFF fast forward - FF 3 PL fast play - FP 4 PL stop - OFF 5 FF play - PL 6 FF stop - OFF 7 FP stop - PL 8 FP fast forward - FF
유효하지 않은 전이 : 예외 발생 후 상태 그대로
TC 입력 예상 출력 시작 상태 이벤트 행위 목적 상태 1 OFF stop 예외 발생 OFF 2 OFF fast play 예외 발생 OFF 3 PL fast forward 예외 발생 PL 4 PL play 예외 발생 PL 5 FF fast forward 예외 발생 FF 6 FF fast play 예외 발생 FF 7 FP play 예외 발생 FP 8 FP fast play 예외 발생 FP
8. 시나리오 테스트
요구 사항의 기능에 대한 상세한 내용이 시나리오 형태로 기술되어 있으면 이를 바탕으로 수행 가능
시나리오 테스트 과정
1. 명세 분석 후 기본 시나리오 및 대안 시나리오 식별
기본 시나리오 : 올바르게 작동하는 상황
대안 시나리오 : 예외 발생 시나리오
2. UML 액티비티 다이어그램 등 이용해 시나리오 통합 모델 설계
3. 모델에서 테스트 시나리오 추출해 TC 생성
from http://jjayng.tistory.com/42 by ccl(A) rewrite - 2021-11-16 07:27:20