[SW test] Allpairs - IPO Algorithm / 조합 테스트를 위한 TC(테스트케이스)선택 툴 사용하기
소프트웨어 테스트는 크게 두 갈래로 나뉜다.
정적테스트
- 정적 분석
- 리뷰
- 인스펙션
- 워크스루
동적테스트
- 명세기반 테스트
- 구조기반 테스트
- 경험기반 테스트
이 정적/동적의 차이점은 '코드의 실행 여부'다.
코드를 실행한 상태에서 실행하는 테스트를 동적테스트라고한다.
그 중에서도 오늘 알아볼 Allpairs라는 툴은 동적테스트의 명세기반 테스트에서 사용된다.
명세기반 테스트 안에도 여러가지가 존재한다.
- 동등분할
- 경계 값 분석
- 조합 테스트
- 상태 전이
- 결정 테이블
이 중에서 조합테스트에 사용된다.
조합 테스트(pairwise test)란?
- 페어와이즈 테스트(Pairwise Testing)는 입력 변수들의 모든 가능한 값 쌍(pair)을 최소한 한 번씩 포함하는 테스트 케이스를 생성하는 기법이다.
- 모든 변수의 모든 조합(전체 조합)을 테스트하는 대신, 두 변수 간의 모든 조합을 커버하도록 테스트 케이스를 설계한다.
- 이를 통해 테스트 케이스 수를 크게 줄이면서도 주요 결합 결함을 효과적으로 발견할 수 있다.
예를 들어
Fun1(a,b,c)라는 함수가 있다고 해보자.
a에는 one, two, three가
b에는 four, five
c에는 six, seven 들어갈 수 있다고 할 때,
일반적인 경우
만들어질 수 있는 경우의 수는 3x2x2으로 12개일 것이다.
반면, 조합 테스트를 사용하는 경우
예를 들어:
- (a, b): one과 four, one과 five, two와 four 등
- (a, c): one과 six, one과 seven, two와 six 등
- (b, c): four와 six, four와 seven, five와 six 등
이런 모든 쌍이 포함되도록 테스트 케이스를 설계하므로, 전체 조합보다 적은 수의 테스트 케이스로 커버가 가능하다
비교하면 다음과 같다.
labels:
['Play', 'Config', 'Equalizer']
parameters:
[['linear', 'linearRecursive', '1'], ['Hold', 'Take'], ['Off', 'Live']]
+----+-----------------+--------+-----------+
| 00 | Play | Config | Equalizer |
+----+-----------------+--------+-----------+
| 01 | linear | Hold | Off |
| 02 | linearRecursive | Take | Off |
| 03 | 1 | Take | Live |
| 04 | 1 | Hold | Off |
| 05 | linearRecursive | Hold | Live |
| 06 | linear | Take | Live |
+----+-----------------+--------+-----------+
All Combinations: 12 [3, 2, 2]
vs
All Pairs: 6
딱봐도 헷갈리고 인간이 계산하기에 힘들것같다.
그래서 만들어 진 것이 allpairs다.
이제 이 툴을 사용해보자.
https://github.com/joebmt/allpairs
GitHub - joebmt/allpairs: Allpairs testing tool written in python
Allpairs testing tool written in python. Contribute to joebmt/allpairs development by creating an account on GitHub.
github.com
코드는 위의 것을 클론해오면 된다.
이제 아래의 파일에 조합을 파악하고 싶은 내용을 작성한다.
ap_datafile.py
# ---
# ap_datafile.py - python datafile to use as allpairs input to generate allpairs combinations
# ---
labels = \
['Play', 'Config', 'Equalizer']
parameters = \
[['linear', 'linearRecursive', '1', '1 Recursive', 'suffle'],
['Hold', 'Take', 'Slide', 'Caption'],
['Off', 'Live', 'Wide', 'Mild', 'Pro']]
위의 파일은 각 Play, Config, Equalizer 레이블에 들어갈 파라미터들을 표현한 것이다.
나는 윈도우 운영체제를 사용하고 있어서 git bash에서 실행했다.
(리눅스명령어 쓰려면 그냥 나는 gitbash에서 쓰는게 편한것같다.. 아님 말구요)
leath@heewon2 MINGW64 ~/Downloads/allpairs/release/allpairs (master)
$ perl allpairs --csv_out ./data/ap_datafile.py > ap.csv
## 이렇게 쓰면 결과가 ap.csv에 저장된다.
leath@heewon2 MINGW64 ~/Downloads/allpairs/release/allpairs (master)
$ perl allpairs -v ./data/ap_datafile.py
Note: Processing python datafile: ./data/ap_datafile.py
## 이렇게 쓰면 아래와 같이 bash에 출력된다.
labels:
['Play', 'Config', 'Equalizer']
parameters:
[['linear', 'linearRecursive', '1', '1 Recursive', 'suffle'],
['Hold', 'Take', 'Slide', 'Caption'],
['Off', 'Live', 'Wide', 'Mild', 'Pro']]
+----+-----------------+---------+-----------+
| 00 | Play | Config | Equalizer |
+----+-----------------+---------+-----------+
| 01 | linear | Hold | Off |
| 02 | linearRecursive | Take | Off |
| 03 | 1 | Slide | Off |
| 04 | 1 Recursive | Caption | Off |
| 05 | suffle | Caption | Live |
| 06 | suffle | Slide | Wide |
| 07 | 1 Recursive | Take | Wide |
| 08 | 1 | Hold | Wide |
| 09 | linearRecursive | Hold | Live |
| 10 | linear | Caption | Wide |
| 11 | linear | Slide | Live |
| 12 | linearRecursive | Slide | Mild |
| 13 | 1 | Take | Live |
| 14 | 1 Recursive | Hold | Mild |
| 15 | suffle | Take | Mild |
| 16 | suffle | Hold | Pro |
| 17 | 1 Recursive | Slide | Pro |
| 18 | 1 | Caption | Mild |
| 19 | linearRecursive | Caption | Pro |
| 20 | linear | Take | Pro |
| 21 | linear | Take | Mild |
| 22 | linearRecursive | Take | Wide |
| 23 | 1 | Take | Pro |
| 24 | 1 Recursive | Take | Live |
| 25 | suffle | Take | Off |
+----+-----------------+---------+-----------+
All Combinations: 100 [5, 4, 5]
vs
All Pairs: 25
leath@heewon2 MINGW64 ~/Downloads/allpairs/release/allpairs (master)
$
끝!