이번 포스트에서는 오랜만에 조합테스트에 대해서 기재해봅니다.
Allpairspy
라는 파이썬의 라이브러리를 사용해서 조합들을 Pairwise하게 생성해는 방법을 기재해봅니다.
아래의 글에서부터 이어집니다!
https://velog.io/@dahunyoo/Combinational-Test-1.-Orthogonal-array-and-Pairwise
https://velog.io/@dahunyoo/Combinational-Test-2.-PICT-and-CIT-BACH
https://velog.io/@dahunyoo/Combinational-Test-3.-PictMaster
이전에 앞서 소개해드린 PICT
라던지 PictMaster
등은, 특정 플랫폼 (맥, 리눅스 유저)에서는 약간 사용이 불편할 수 있습니다.
PICT
는 기본적으로는 .exe
파일이라 윈도우에서 쓰기 용이합니다. 물론 brew를 통해서 mac과 linux에서도 사용은 가능합니다. 그런데 또 기본적인 문법이 조금 작성하기 힘듧니다.
https://github.com/Microsoft/pict/blob/main/doc/pict.md#constraints
일단 .txt
로 작성을 해야하는데, 제 개인적인 경우에는 작성하기가 좀 어렵더라구요.
PictMaster
의 경우에도 마찬가지로 일단 엑셀을 사용할 수 있어야하고, VBA
가 실행될 수 있는 환경이어야합니다.
이런 경우에 사용할 수 있는, 페어와이즈한 조합을 도출할 수 있는 툴로는 ACTS
라던지 Allpairspy
가 있는데요, 이번 포스팅에서는 파이썬 라이브러리인 Allpairspy
를 간략하게 기재해보고자합니다.
이전에 파이썬2로 작성되어있는 코드에 대해, 레포지토리 주인이 이어받아 파이썬3로 유지하는 것 같았습니다.
일단 라이브러리를 설치합니다. 별다른 설정을 안해줬다면 pip3
로 설치가능합니다.
pip3 install allpairspy
기본적인 사용방법은 매우 간단합니다.
일단 2차원 배열 안에 parameter의 밸류를 기재합니다.
parameters = [
["macOS", "Windows", "Android"], #OS
["Chrome","Safari","Edge"], #Browser
["PC", "Galaxy Flip", "iPhone"] #Cell phone model
]
이 다음에 AllPairs()
객체를 선언하면서 반복문을 돌려가면서 한 행씩 도출해냅니다.
print("PAIRWISE:")
for i, pairs in enumerate(AllPairs(parameters)):
print(f"{i}: {pairs}")
실행하면 아래와 같이 도출됩니다.
PAIRWISE:
0: ['macOS', 'Chrome', 'PC']
1: ['Windows', 'Safari', 'PC']
2: ['Android', 'Edge', 'PC']
3: ['Android', 'Safari', 'Galaxy Flip']
4: ['Windows', 'Chrome', 'Galaxy Flip']
5: ['macOS', 'Edge', 'Galaxy Flip']
6: ['macOS', 'Safari', 'iPhone']
7: ['Windows', 'Edge', 'iPhone']
8: ['Android', 'Chrome', 'iPhone']
단순 계산하면 3개 파라미터에, 3개의 밸류씩 들어가니 3x3x3= 최대 27개 의 조합이 도출되어야됩니다만, 위 결과처럼 9개만 도출되었습니다.
조금 검증을 해보면, macOS
의 경우에
이렇게 다른 파라미터들과 최소 한 번씩 페어링이 되었고, 그 이상은 결과표에 노출되지 않는 것을 확인할 수 있어서, pairwise 하게 도출되었다~ 라고 말씀드릴 수 있을 것 같습니다.
그런데 제한조건들을 걸고 싶을 수도 있습니다. 위 예시를 봐도... Windows에서 Safari를 실행할 수는 없습니다. 따라서 조건식을 걸어 특정 조건은 만들어지지 않도록 제한을 걸어야합니다.
def filter_condition(row):
n = len(row)
if n > 1:
if row[0] == "Windows" and row[1] == "Safari":
return False
return True
일단 함수를 하나 만들어줍니다. 하나의 행에 대해 행의 길이를 최소조건으로 체크합니다. 그래서 함수로 들어온 행의 0번컬럼이 Windows
면서, 1번컬럼이 Safari
일때는 매칭되지 않도록 False
를 리턴합니다. 그 외에는 True
를 리턴합니다.
parameters = [
["macOS", "Windows", "Android"],
["Chrome","Safari","Edge"],
["PC", "Galaxy Flip", "iPhone"]
]
print("PAIRWISE:")
for i, pairs in enumerate(AllPairs(parameters, filter_func=filter_condition)):
print(f"{i}: {pairs}")
그 다음 실행 시에는 AllPairs()
생성자에 filter_func=
파라미터에 함수이름을 전달합니다.
PAIRWISE:
0: ['macOS', 'Chrome', 'PC']
1: ['Windows', 'Edge', 'PC']
2: ['Android', 'Safari', 'PC']
3: ['Android', 'Edge', 'Galaxy Flip']
4: ['Windows', 'Chrome', 'Galaxy Flip']
5: ['macOS', 'Safari', 'Galaxy Flip']
6: ['macOS', 'Edge', 'iPhone']
7: ['Windows', 'Chrome', 'iPhone']
8: ['Android', 'Chrome', 'iPhone']
Windows
가 포함된 행은 1, 4, 7번행인데 Safari
와 매칭되지 않은 것을 확인할 수 있습니다. Chrome
과 2회 페어링이 되었는데 이것은 Chrome
이 Phone model 파라미터와 매칭되기 위해 남는 부분에 들어갔다 라고 이해하시면 될 것 같습니다.
조건을 추가해보겠습니다. Android
는 Galaxy Flip
하고만 매칭되어야합니다.
if n > 1:
if row[0] == "Windows" and row[1] == "Safari":
return False
if n>2:
if row[0] =="Android" and row[2] != "Galaxy Flip":
return False
Android
이면서 Galaxy Flip
이 아니라면 False를 리턴합니다.
PAIRWISE:
0: ['macOS', 'Chrome', 'PC']
1: ['Windows', 'Edge', 'PC']
2: ['Android', 'Safari', 'Galaxy Flip']
3: ['Android', 'Edge', 'Galaxy Flip']
4: ['Windows', 'Chrome', 'Galaxy Flip']
5: ['macOS', 'Safari', 'iPhone']
6: ['Android', 'Chrome', 'Galaxy Flip']
이렇게하면 보시는 바와 같이 Android
와 매칭되는 phone model 파라미터의 밸류값은 무조건 Galaxy Flip
이 되는 것을 확인할 수 있습니다.
이렇게 만든 결과값을 간단하게 csv파일로 내보낼 수도 있습니다.
기본 csv
라이브러리를 import하고 with open
을 통해 csv파일을 생성합니다.
from allpairspy import AllPairs
import csv
parameters = [
["macOS", "Windows", "Android"],
["Chrome","Safari","Edge"],
["PC", "Galaxy Flip", "iPhone"]
]
with open('test.csv','w',newline='') as file:
write = csv.writer(file)
write.writerow(['OS', 'Browser', 'Phone model']) #헤더행 생성
for i, pairs in enumerate(AllPairs(parameters, filter_func=filter_condition)):
write.writerow(pairs) #조합 생성 후 기록
이렇게 컴마로 구분된 csv파일이 생성된 것을 확인할 수 있었습니다. 엑셀등으로 import해서 더 편하게 사용하실 수 있는데요, 0
으로 시작하는 문자로된 숫자가 있다면, 엑셀에서는 읽어들일 때 숫자로 바꾸면서 0이 없어질 수 있으므로 조심하셔야겠습니다.
파이썬으로 조합을 pairwise하게 만들기 끝!