원인-결과 그래프(Cause-Effect Graph) 기반 테스팅
- 원인-결과 그래프를 통해 요구사항 명세를 입력 조건과 출력 조건 간의 논리적 관계로 표현하고, 이를 기반으로 테스트케이스를 도출한다.
- 원인-결과 그래프의 ‘원인(causes)’은 입력 조건을 의미하고 ‘결과(effects)’는 입력 조건의 결과를 의미한다. 원인-결과 그래프는 원인과 결과 간의 논리적 관계를 AND, OR, NOT 같은 boolean 연산자를 사용하여 표현한다.
- 기원은 하드웨어 공학의 ‘단순화된 디지털 논리 회로 그래프(a simplified digital-logic circuit graph)’이며, 이를 소프트웨어 공학에 맞게 적용한 것이다.
- 테스트 출력이 여러 테스트 입력의 조합(combinations)에 의존하는 시나리오에서 사용하기 적절한 기법이다.
원인-결과 그래프 표기법
원인-결과 그래프는 어떤 원인을 그 결과와 연결하는 방향성을 가진 그래프이다. 원인을 나타내는 노드는 그래프의 좌측에 결과를 나타내는 노드는 우측에 위치하며, 노드는 1(‘참’ 또는 ‘있음’을 의미)과 0(‘거짓’ 또는 ‘없음’을 의미)의 두 가지 상태를 가진다.
IDENTITY 연산은 아래와 같이 표현한다. 원인이 참이면 결과도 참이고, 원인이 거짓이면 결과도 거짓임을 의미한다.
AND 연산은 하나 이상의 원인 집합을 가질 수 있고, 아래와 같이 표현한다. 결과1이 참이려면 원인1과 원인2가 모두 참이어야 한다를 나타낸다.
OR 연산은 하나 이상의 원인 집합을 가지며, 아래와 같이 표현한다. 결과1이 참이려면 원인1 또는 원인2가 참이어야 한다를 나타낸다.
NOT 연산은 아래와 같이 표현한다. 결과1이 참이려면 원인1이 거짓이어야 한다를 나타낸다.
여러 원인을 결합하는 중간 노드(intermediate nodes)가 원인-결과 사이에 위치할 수도 있다. 아래는 결과1이 참이려면 (원인1 Ù 원인2) Ú 원인3 이 충족되어야 함을 표현한 것이다.
불가능한 원인 조합 또는 결과 조합을 표현하기 위해 제약(constraints)이 추가될 수도 있다(그래프 상에 점선과 제약 심볼을 표기하여 나타냄). 원인에 적용가능한 제약 심볼은 E(exclusive), I(Inclusive), O(one and only one), R(Requires)이다.
E 제약: 원인1과 원인2 중 많아야 하나가(at most one) 참이 될 수 있음을 나타낸다. 즉, 두 원인이 동시에 참일 수 없다.
I 제약: 원인1, 원인2, 또는 원인3 중 적어도 하나는(at least one) 참이어야 함을 나타낸다. 즉, 모두가 동시에 거짓일 수는 없다.
O 제약: 원인1과 원인2 중 오로지 하나만 참이어야 함을 나타낸다.
R 제약: 원인1이 참이려면 원인2도 반드시 참이어야 함을 나타낸다. 즉, 원인1이 참이면서 원인2가 거짓인 경우는 불가능하다.
결과에 적용가능한 제약 심볼로 M(Mask)가 있다. 아래는 결과1이 참이면 결과2는 강제로 거짓이 된다를 표현한 것이다.
E 제약과 O 제약의 구분 E 제약은 “많아야 1개(at most one)”이므로 0 또는 1개의 원인이 참일 수 있다. O 제약은 정확하게 1개(one and only one)의 원인이 참이어야 한다. |
원인-결과 그래프 테스팅 절차
Step 1: 명세서를 분석하여 원인(입력 조건)과 결과(출력 조건, 액션, 또는 상태)를 식별하고, 각각에 고유한 식별번호를 부여한다.
Step 2: 원인과 결과를 연결하는 boolean 그래프를 작성한다.
Step 3: 불가능한 원인 조합 또는 결과 조합을 나타내는 제약(constraints)을 그래프에 표시한다.
Step 4: 원인-결과 그래프를 의사결정표(decision table)로 전환한다.
Step 5: 의사결정표의 각 컬럼을 테스트케이스로 전환한다.
예제
두 개 문자를 읽어 그 값에 따라 메시지를 프린트하는 프로그램의 명세가 아래와 같다.
① 첫번째 문자는 반드시 “A” 또는 “B” 이어야 한다.
② 두번째 문자는 반드시 0~9까지의 숫자이어야 한다.
③ 첫번째 문자가 “A” 또는 “B”이고 두번째 문자가 0~9의 숫자이면 파일이 업데이트된다.
④ 첫번째 문자에 에러가 있으면(즉, “A” 또는 “B”가 아님), 메시지 X가 출력된다.
⑤ 두번째 문자에 에러가 있으면(0~9까지의 숫자가 아님), 메시지 Y가 출력된다.
원인(causes) 식별
C1 : 첫번째 문자가 ‘A’
C2 : 첫번째 문자가 ‘B’
C3 : 두번째 문자가 숫자
결과(effects) 식별
E1 : 파일 업데이트가 수행됨
E2 : 메시지 X가 출력됨
E3 : 메시지 Y가 출력됨
원인-결과 그래프 작성
Tip: 결과부터 시작해 원인으로 탐색해 나간다. 즉, E1부터 시작하여 E2, E3의 각 결과가 참이려면 어떤 원인(들)이 참이어야 하는지를 따져가면서 그래프를 작성한다.
의사결정표 작성
Tip: 그래프 작성 시와 마찬가지로 표 하단의 E1부터 시작해서 결과 각각이 참이 되려면 상단의원인들이 어떤 상태이어야 하는지를 따져가면서 표를 작성한다.
Actions | Rule 1 | Rule 2 | Rule 3 | Rule 4 | Rule 5 | Rule 6 |
C1: 첫번째 문자가 ‘A’ | True | False | False | False | True | False |
C2: 첫번째 문자가 ‘B’ | False | True | False | False | False | True |
C3: 두번째 문자가 숫자 | True | True | True | False | False | False |
E1: 파일 업데이트 | True | True | - | - | - | - |
E2: 메시지 X가 출력됨 | - | - | True | True | - | - |
E3: 메시지 Y가 출력됨 | - | - | - | - | True | True |
테스트케이스 작성
의사결정표의 각 열(Rule)을 테스트케이스로 전환한다.
ID | 테스트케이스명 | 단계 | 예상 결과 |
TC1 | 파일 업데이트_시나리오1 | 1. 애플리케이션을 시작한다. 2. 첫번째 문자로 ‘A’를 입력한다. 3. 두번째 문자로 0~9 사이 숫자를 입력한다. |
파일이 갱신됨 |
TC2 | 파일 업데이트_시나리오2 | 1. 애플리케이션을 시작한다. 2. 첫번째 문자로 ‘B’를 입력한다. 3. 두번째 문자로 0~9 사이 숫자를 입력한다. |
파일이 갱신됨 |
History
컴퓨팅 초기에 소프트웨어 커뮤니티는 하드웨어 커뮤니티에서 많은 아이디어를 빌렸다. 어떤 경우는 이것이 잘 작동했지만 소프트웨어의 문제가 기존 하드웨어 기술과 잘 맞지 않는 경우도 많았다. 원인-결과 그래프가 그러한 좋은 예이다.
하드웨어 분야에서는 회로를 AND, OR 및 NOT 게이트가 있는 개별 컴포넌트(discrete components)의 구성으로 설명하는 것이 관행이었다. 일반적으로 회로 다이어그램에 입력 측이 존재하며, 다양한 컴포넌트를 통과하는 입력 흐름을 왼쪽에서 오른쪽으로 추적한다. 이를 통해 하드웨어 결함(예, stuck at 0/1)의 영향을 출력 측으로 추적할 수 있었고, 이는 회로 테스트(circuit testing)를 크게 용이하게 하였다.
원인-결과 그래프는 이러한 패턴을 따르려는 시도였다. 그림의 왼쪽에 테스트 대상 단위의 입력을 표시하고, AND, OR 및 NOT "게이트"를 사용하여 해당 단위의 여러 단계에 걸친 데이터 흐름을 표현함으로써 테스트를 돕고자 하였다. 원인-결과 그래프에서 배울 수 있는 가장 큰 것은 출력에 어떤 문제가 있는 경우 해당 출력에 영향을 준 입력으로 되돌아가는 경로를 다시 추적할 수 있다는 것이다. 실제로 테스트케이스를 식별하는 데 대한 지원은 거의 없다.
References
책 The Art of Software Testing by G. J. Myers 초판(1979년)의 제4장 Test Case Design에서 'Cause-Effect Graphing' 기법을 자세히 다루고 있다.
책 Software Testing A Craftsman’s Approach, Paul C. Jorgensen, Fourth Edition, 2014년,
7.6 Cause-and-Effect Graphing, 128~130페이지
'테스트케이스설계기법별 > 명세 기반' 카테고리의 다른 글
책 요약 – 페트리 네트 모델링 by Jorgensen (0) | 2023.05.15 |
---|---|
요약정리 – 상태, 상태 그래프, 전이 테스팅 by Beizer (0) | 2021.03.15 |
문서요약 - 조합 테스팅(COMBINATORIAL TESTING) by Kuhn (0) | 2020.04.27 |
페이퍼요약 - 기능 설계 검증을 위한 테스트 케이스 도출 by Stoica (0) | 2020.04.20 |
문서요약 – 직교 배열표 테스팅 기법 by Harrell (0) | 2020.04.13 |