티스토리 뷰

오랜만에 내글을 쓴다. 세상살이가 그렇듯 쥔장도 다 사정이 있었으니 용서를 바란다. ^^

오늘은 결정 테이블에 대해서 함께 생각해 보도록 하자. 미리 말씀 드리지만, 사람은 완벽할 수 없으니, 이견이 있으신 분은 언제든 한 수 가르침 바란다. (아는체 하려고 태클 거는 분, 글 내용하고 별 관계없는 걸로 태클 거는 분들 사양합니다.)

내용은 테스팅 이론에 대해서 잘 알고 있다고 가정하므로, 아예 처음부터 이게 왜 그래요? 이런 질문은 정중히 사양한다. ^^

결정 테이블은 두 개로 구성되어 있다.

조건부 (Condition Section) / 액션부 (Action Section)

이 결정 테이블을 사용하기 위한 전제가 있는데,

1) 조건의 순서에 따라서 액션이 달라지지 않는다. 오로지 조건의 triggerring에 의해서만 액션이 결정된다.
2) 액션은 오로지 조건의 조합에만 영향을 받는다. 다른 입력 조건이나, 시스템의 특정 상태 (모드)가 액션을 결정하지 않는다.

이러한 전제가 충족된다면 결정 테이블 테스팅 (이하 DTT)를 사용할 수 있다.

설명을 더 진행하기 위해서 예를 들어보자. (The Testing Practitioner에 나오는 예제이다.)

명세)

모든 사람은 350의 공제를 받음.
근무 이력이 있고, 나이가 40세초과이면 추가로 100의 공제를 받음.
앞의 조건과 상관없이, 정확히 자녀가 4명이라면 50의 추가 공제를 받음.

이제 DTT를 이용해서 테스트 케이스를 생성해 보기 전에 오류가 발생할 가능성을 살펴보기 위해서 의사 코드를 작성해 보자.

의사코드)

EmployeeAmount = 0;                       
If (History && (Age > 40)) Then EmployeeAmount = EmployeeAmount + 100                       
If (Children = 4) Then EmployeeAmount = EmployeeAmount + 50                       
EmployeeAmount = EmployeeAmount + 350                       

간단한 의사코드이므로 쉽게 이해할 수 있을 것이다.

이제 결함이 발생할 수 있는 가능성을 살펴보자. (테스팅을 왜 하는가? 그리고, 결함이 발생할 가능성이 높은 부분을 어떻게 짐작하는가?)

History && (Age > 40) ==> AND 조건이다.

AND 조건의 진리표를 아는가?

TT / TF / FT / FF 이다.

즉, AND 조건은 결과값이 이 넷중 하나라는 의미이다.

또한, 코딩을 할 때 다음과 같은 상황이 가능함을 이해해 보자.

논리식의 진리표들)



진리표는 다들 아시리라 믿는다.

이 진리표를 자세히 들여다 보면, 흥미로운 사실을 알 수 있다.



같은 색상으로 마킹한 것들은 입력도 값고, 그 결과값 Z도 동일하다. 이게 무슨 상관이냐고? 테스팅을 1차원 적인 액션으로 보는 분들이 있는 것 같다. 물론 그런 테스팅이 가능한 상황도 있을 수 있다. 하지만, 많은 경우 TC1의 결과와 TC2의 결과가 서로 간에 검증을 해주는 상황이 많다.

요게 무슨 말인고 하니? TC1의 과정중 일 부분의 조건만 On시켜서 결과 1을 확인하고, TC1과 거의 똑같지만 일 부분의 조건만 Off된 결과 2를 확인해서, 결과 1 <> 결과 2라면 On > Off된 조건의 Off가 작동했다는 검증이 된다. 반대로, Off > On을 확인해도 "조건이 작동하였다"는 사실을 알 수 있다.

이때, TC1만 가지고서 "조건이 작동하거나 작동하지 않는다"라고 말할 수 있는가? 절대 그런 말을 할 수가 없다. 조건이 On > Off, Off > On된 것을 확인하기 위해서는 TC1, 2 모두 수행해서 그 결과를 서로 비교하여야 검증이 완성된다는 의미이다.

이와 마찬가지로, 위에 같은 색으로 마킹한 진리표도 입력값을 동일하게 넣어서 원하는 결과를 얻었다고 하여도, 내부 로직이 전혀 엉뚱하게 코딩되어 있을 가능성이 있음을 증명해 준다. (잘 생각해 보라... 이게 무슨 말인지...)

다시 본 주제로 되돌아와서,

History && (Age > 40)를 코딩함에 있어 개발자가 다음과 같이 잘못 구현했다면,

History || (Age > 40)

T || T >> T

즉, History = Y, Age = 41를 넣어서 오호라 잘 작동하는 구나! 라고 테스팅을 종료하면 큰일 난다는 이야기 이다.

왜냐하면, AND가 아닌 OR로 실수를 해도 T // T의 입력을 넣어버리면 AND와 결과와 OR의 결과가 같기 때문에 잘못된 코딩을 찾아낼 수 없기 때문이다. 논리식에서 이러한 현상이 참으로 많고, 논리식이 복잡해지면 복잡해질 수록 찾기도 어렵고 수행해야 하는 테스트 케이스의 수도 많아진다.

결론적으로,

History && (Age > 40)을 테스팅함에 있어서, 단순히 T // T의 입력만 시험해서는 안 된다는 결론을 얻는다. 그러면, AND 조건에서 나올 수 있는 진리표 4개를 모두 수행해야 하는가? 일단은 모두 수행해야 한다고 가정하자.

여기서 끝일까? 아니다. 고민해야 하는 문제가 또 남아있다. (-_- 이런 간단한 명세를 테스트 하는데 이런 고생을 한다는게 좀 우습기도 하다.)

Age > 40 이 의사코드를 보자.

뭐 별 문제는 없어 보인다. 그러나, 여기에도 결함의 가능성이 숨어 있다. 잘 생각해 보자.

이 산식을 잘못 구현할 가능성은 다음과 같다.

올바른 구현)

Age > 40

잘못된 구현)

Age = 40
Age < 40

주로 코딩할 때는 이 산식을 이렇게 많이 쓰기도 한다.

Age <= 40

자 어떤가? 이제부터 머리가 아플 것이다. 하지만, 여기서 놀라지 말라~~ 아직도 더 머리가 아파야 하는 내용이 더 있다~~ ^^

즉, AND 조건의 N 입력을 넣을 때, Age <= 40의 오류를 검출할 수 있는 값을 넣어야 한다.

이제 되었나?

아니다. 또 비슷한 이슈가 있다.

Children = 4 를 보자. 이제 위에서 부터 충실히 읽어오신 분들은 눈치채셨으리라 믿는다.

맞다. Children < 4, Children > 4로 잘못 코딩될 가능성이 있다.

자 이제 이러한 테스팅의 체크 포인트들을 다 믹스하여 논리적인 테스트 케이스를 만들어 보도록 하자.

DTT를 얘기하려고 했는데, 부연 설명이 좀 길었다. ^^


원래 DTT를 작성할 때는, 논리적으로 가능한 모든 가능성을 쭉 나열하고 거기서 불필요해 보이는 조합을 제거하는 방식을 사용할 수 있으나, 보다시피 Simple Binary가 아닌 3개중 한 개를 선택할 수 있는 가능성이 존재한다. (항목중에서 언더스코어 표시한 것이 말하자면, True 조건이다.)

먼저, AND 조건부터 생각해 보자.

어떤 상황을 반드시 테스트 해야 할까?

Histoty가 가질 수 있는 조합은 뭘까? Y 또는 N이다.

따라서, 다음과 같이 매트릭스를 채울 수 있다. (TC1-2 등의 표기법은 신경 쓰지 말고 왜 이렇게 채웠는지 생각해 보라.)


당연히, History만 가질 수 있는 조합은 Y/N이다. 하지만, History와 Age의 AND 조건이다. 따라서, 다음의 조합이 가능하다.


여기서는 Age = 40, Age > 40, Age < 40의 조건중 Age = 40이 Y이며, Age > 40 또는 Age < 40이 N의 조건이다. 즉, 단순한 Simple Binary의 조건이 아니다. (N이 또 두 개의 가능성을 가지고 있다.) 결국 다음과 같이 매트릭스를 채워야 한다.


이때, Children의 조건까지 함께 고려해 보자.


드디어, 원하는 결과를 얻었다.

왜 이런 식의 채우기를 해야 하느냐고? 쥔장은 이를 설명할 수 있다.

하지만, 여기서 더는 설명하지 않겠다. 아마, 눈치가 빠른 분들은 위의 내용을 다시 한 번 천천히 읽어 보면 힌트를 얻으실 수도 있겠다.

심오한 뜻이 있다.

그럼... May the force be witu U!
댓글
  • 프로필사진 BlogIcon Oh 테크바~드님, 거짓말 하신 건 하나도 없는데요?^^ 멘션 보고 왔습니다. 영광입니다.^^

    "조건의 순서에 따라서 액션이 달라지지 않는다. 오로지 조건의 triggerring에 의해서만 액션이 결정된다." 이건 맞는 말이긴 한데, 복잡하게 구현된 코드를 보게 되면 1차 조건이 나오고 Y와 N 중 하나를 선택하면 각각 다른 2차 조건이 나오는... 즉, 조건의 순서를 따질 수 밖에 없는 경우도 생기더라구요. 몇번 조건의 순서를 고려해서 Decision Table를 만들어보긴 했는데 잘된건지는 검증해 줄 사람도 없고 저도 잘 모르겠고 그렇네요.^^:

    그리고 40세 이상이면 >= 이지 않나요? 전 명세서에서 이상, 초과 이게 항상 헛갈립니다. 일단 예제 아래 나온 코드가 맞다 생각하고 봤어요. 그리고 자녀가 4명 초과이면 50 혜택이 없다니 이 회사 너무 야박하네요. 정확히 4명이라니!! 5명 낳은 것도 훌륭한 건데 말이죠. ㅎ 억울하겠어요. 5명을 키운 가장에게 넌 50 혜택이 없으렸다, 라는 신의 장난?ㅎ 농담이 길었네요.

    전 항상 논리적으로 가능한 조합을 열거 해놓고 Collapsed하는 방식을 택해왔었는데, 사실 조건이 5개만 되도 2^5 기겁하겠더군요. 사전에 불가능한 조합은 미리 미리 제거해놓긴 하지만요. 쥔장님만이 설명하실 수 있는 진리, 다음 포스팅 때 더 자세히 좀 알려주세요~~
    2010.07.03 15:15 신고
  • 프로필사진 BlogIcon techbard Oh 님 댓글 감사합니다~~

    이상/이하... 저도 헛갈립니다. 찾아보니, 이상/이하는 경계를 포함, 초과/미만은 경계 미포함이라는 군요. 저도 앞으로 정확하게 사용해야 겠습니다. 고로, 명세를 바꾸겠습니다. ㅎㅎ

    제가 이해한 이 이슈에 대한 통찰력은 포스팅하지 않을 생각입니다. 더 다듬어서 언젠가 공개 강좌라도 할까요? ㅎㅎ Oh님 제가 어쩌면 문제를 낸 건데, 함 맞춰보세요~~ ^^
    2010.07.03 15:28 신고
  • 프로필사진 aa XOR진리표가 완전 반대입니다.! 2011.06.11 15:11 신고
댓글쓰기 폼
공지사항
Total
394,932
Today
3
Yesterday
28
«   2018/11   »
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  
글 보관함