brunch

You can make anything
by writing

C.S.Lewis

by Kim Sjoon George Feb 20. 2019

애증의 Allpairs.py

allpairs.py적용기

테스트 설계 기법의 기본 동작은 컨디션간의 조합에 의한다.


테스트 설계 기법을 조금 공부해 본 사람들은 어느정도 공감하리라 생각한다. 경계값분석, 동등분할은 아니라 하더라도, 결정테이블, 상태전이는 물론이고, 구조기반 설계들도 어떻게 보면 True와 False의 조합이라고 볼 수 있다.


인기언어인 java나 Python에 이런 조합을 구해주는 라이브러리가 있을 것 같다.  나는 Python에 익숙하기 때문에 PyPI에서 한번 검색을 해 봤더니.. 바로 나왔다¹. 


소스 코드에서 조건절(if, while등)을 읽어들여 조합을 만들 수 있다. 예를 들어 

if (A>0 || B==0){ //조건절 #1
      statement1;
}

if (C>0 && D==0){ //조건절 #2
      statement2;
}

에서 Condition Coverage를 만족시키는 통합 케이스를 만들려고 하면 조건절 #1에서의 True/False케이스(4개)와 조건절 #2에서의 케이스(4개) 조합이다. 조건간 조합은 Full조합이 아닌, 각 케이스가 1회씩만 나오면 되므로 결국 모든 케이스는 4개로 될 것이다.


조건절#1의 경우의 수

조건절#2의 경우의 수

조건절#1 × 조건절#2의 전체 케이스

위에선 각 조건절이 독립적이어서 각 조건절의 결과가 영향을 미치는 관계가 아니었다. 하지만 Nested 구문에서는 이야기가 달라진다. 

if (A>0 || B==0){ //조건절 #1
    statement1;    
    if (C>0 && D==0){ //조건절 #2
        statement2;
    }
}


조건절 #2는 조건절 #1이 True 일때만 True또는 False가 판단될 수 있다. #1이 False일 경우에는 그냥 판단이 되지 않는다. 앞에서는 그냥 두 조건결과에 대한 조합을 만들어 주면 되었지만, 이번에는 조합에 제약을 걸어야 하는 것이다. 

결과는 아래와 같이 될 것이다.(총 5개 케이스)

이 외에도 코드에서 조건절간에서 제약을 걸어야 할 경우가 몇가지 더 있지만², 거기까지 여기에 기술하지는 않겠다. 


allpairs.py라이브러리에서는 당연하겠지만 조합에 제약을 거는 기능(필터링)이 있다 필터링 샘플 코드는 아래와 같다.


그런데 여기에 로직상 오류가 조금 있었다. 여기에서 자세히 언급하지는 않겠지만, 필터링할 조건이 여러개가 있을 때, 그 순서를 변경하면 페어링의 결과가 바뀌거나 누락되는경우가 발생을 했다³ . 여기에서 고민에 빠진다.

로직을 아예 내가 손을 댈까?  

로직을 건들지 말고 필터링 조건 순서를 좀 자동 조정을 해서 결과를 뿌릴까?

난 로직을 수정할 자신이 도저히 없었기 때문에⁴ 두번째 길을 선택했지만, 그렇게 간단하지 않았다. 자동조정도 생각해야 할 경우의 수들이 많았으며, 무려 6개월 가까이 시간이 걸렸다. 그러다보니 allpairs.py에 미운정 고운정이 다 든것 같다.  


그래서 탄생한 것이 바로 지금은 다 지워버렸지만, TCaseGenerator라는 앱이었다. 당시에는 나름 MC/DC를 페이크로 구현하였었다. 윈도우즈와 MacOS앱으로 PyInstaller를 이용하여 만들어 당시 내 고객들에게 다운받게 하였다. 결과의 정확도를 떠나서, 얼추 MC/DC를 어떻게 활용하는지는 알려주는 효과는 있었다고 자부한다. 


Allpairs에 대한 로직을 언젠가 직접 건드릴 날이 올 것 같다. 



1) 개발을 시작할 당시에는 Allpairs2.0.1만 있었다. 이제는 새롭게 Fork된 allpairspy 2.4.3이 나와 이를 사용하면 된다.

2) else if구문, Nested else if구문, 컨디션 인자의 중복사용 등이 그 경우이다. 어느 하나 쉬운 것이 없었다. 

3) 지금 새로 만들어진 allpairspy.py에서는 아직 테스트를 하지 못했지만, 사용법이 그대로인걸로 봐서 수정이 안되었을 가능성이 크다.

4) 원인은 어떤 것인지 파악은 했지만, 사이드 이팩트가 제일 두려웠다. 

매거진의 이전글 산출물을 읽어서 자동으로 테스트 케이스를 만들어준다?
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari