Combinational Test - 4. Allpairspy

Dahun Yoo·2023년 9월 8일
0

QA or Test

목록 보기
34/38

이번 포스트에서는 오랜만에 조합테스트에 대해서 기재해봅니다.

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


Allpairspy

이전에 앞서 소개해드린 PICT 라던지 PictMaster 등은, 특정 플랫폼 (맥, 리눅스 유저)에서는 약간 사용이 불편할 수 있습니다.

PICT 는 기본적으로는 .exe 파일이라 윈도우에서 쓰기 용이합니다. 물론 brew를 통해서 mac과 linux에서도 사용은 가능합니다. 그런데 또 기본적인 문법이 조금 작성하기 힘듧니다.

https://github.com/Microsoft/pict/blob/main/doc/pict.md#constraints

일단 .txt 로 작성을 해야하는데, 제 개인적인 경우에는 작성하기가 좀 어렵더라구요.

PictMaster 의 경우에도 마찬가지로 일단 엑셀을 사용할 수 있어야하고, VBA 가 실행될 수 있는 환경이어야합니다.

이런 경우에 사용할 수 있는, 페어와이즈한 조합을 도출할 수 있는 툴로는 ACTS 라던지 Allpairspy 가 있는데요, 이번 포스팅에서는 파이썬 라이브러리인 Allpairspy 를 간략하게 기재해보고자합니다.

Allpairspy

https://github.com/thombashi/allpairspy

이전에 파이썬2로 작성되어있는 코드에 대해, 레포지토리 주인이 이어받아 파이썬3로 유지하는 것 같았습니다.

setup

일단 라이브러리를 설치합니다. 별다른 설정을 안해줬다면 pip3 로 설치가능합니다.

pip3 install allpairspy

how to use

기본적인 사용방법은 매우 간단합니다.

일단 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의 경우에

  • 0 : (macOS, Chrome), (macOS,PC)
  • 5 : (macOS, Edge), (macOS, Galaxy Flip)
  • 6 : (macOS, Safari), (macOS, iPhone)

이렇게 다른 파라미터들과 최소 한 번씩 페어링이 되었고, 그 이상은 결과표에 노출되지 않는 것을 확인할 수 있어서, pairwise 하게 도출되었다~ 라고 말씀드릴 수 있을 것 같습니다.

filter condition

그런데 제한조건들을 걸고 싶을 수도 있습니다. 위 예시를 봐도... 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 파라미터와 매칭되기 위해 남는 부분에 들어갔다 라고 이해하시면 될 것 같습니다.

조건을 추가해보겠습니다. AndroidGalaxy 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 이 되는 것을 확인할 수 있습니다.

Export to csv

이렇게 만든 결과값을 간단하게 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하게 만들기 끝!

profile
QA Engineer

0개의 댓글