|
블랙박스 테스트(Blackbox test)는 프로그램의 내부 논리 구조를 참조하지 않고 사용자의 요구사항이 기술된 명세나 설계정보 등을 이용하여 테스트 케이스를 개발한다. 따라서, 프로그램이 기능을 어떻게 수행하느냐 보다는 프로그램이 사용자가 원하는 기능을 수행하는지의 여부를 테스트하는데 중점을 둔다. 이런 관점에서 블랙박스 테스트를 기능 테스트(Functional test)라고도 한다.
블랙박스 테스트를 통하여 올바르지 않거나 누락된 기능이 무엇인가를 찾아낼 수 있고 인터페이스 오류 및 인터페이스에서 사용된 자료의 오류 등을 검출할 수 있다. 또한 블랙박스 테스트는 명세 정보가 제공되는 모든 시스템에 대해 적용할 수 있으며, 단위 테스트, 통합 테스트, 시스템 테스트 및 인수 테스트 전 과정에 걸쳐 사용될 수 있다. 테스트 전 과정뿐만 아니라, 제품의 개발이 시작되고 명세가 제공되는 시점부터 테스트를 시작할 수 있어 개발과 함께 테스트를 진행할 수 있다.
개발자는 코드가 잘 동작되는 면만을 부각시키는 테스트 케이스를 작성하는 경향이 있기 때문에, 블랙박스 테스트는 오히려 프로그램 코드 내부 구조를 자세하게 아는 개발자보다는 프로그램의 코드 내부 구조를 전혀 모르는 사람이 테스트를 실행하는 것이 좋다. 즉, 내부 구현 기술이나 코드를 모르는 독립적인 테스터가 블랙박스 테스트를 수행하는 것이 좋다. 물론 독립적인 테스터라 할지라도 프로그램의 기능을 충분하게 이해하고 있어야 하며 테스트 케이스를 작성하기 위해서는 어떤 입력에 대해 어떤 출력이 예상되는지를 알아야 한다.
블랙박스 테스트는 그 외에도 다음과 같은 이점을 갖는다.
첫째, 테스트 케이스를 설계할 때 프로그램 코드가 없어도 되기 때문에 서브 시스템이나 전체 시스템과 같이 규모가 큰 단위에도 효과적으로 적용할 수 있다.
둘째, 테스터가 개발 언어나 알고리즘 등 구현에 관한 지식이 없어도 테스트를 수행할 수 있으며, 셋째, 사용자 관점에서 테스트를 수행하기 때문에 효과적으로 오류를 검출할 수 있는 기회가 제공된다. 넷째, 명세 오류(일관성 결여나 애매모호한 명세)를 찾아낼 수 있는 기회를 제공하며, 다섯째, 명세가 완성되는 순간부터 테스트 케이스들을 설계할 수 있다. 즉, 코드가 구현될 때까지 테스터가 기다릴 필요가 없다. 마지막으로 블랙박스테스트 케이스들은 동일한 기능을 제공하는 여러 구현 모듈들을 테스트하는데 재사용할 수 있다. 예를 들면, A 모듈은 버블 정렬(Bubble sort) 알고리즘을 사용하여 구현하였고 B 모듈은 힙 정렬(Heap sort) 알고리즘을 사용하여 구현하였다면 A와 B 두 모듈을 테스트하는데 동일한 블랙박스 테스트 케이스들을 사용할 수 있다. 그 이유는 모두 동일한 정렬이라는 명세에 바탕을 두고 개발되었기 때문이다.아래와 같다.
블랙박스 테스트의 장점
① 명세 정보가 제공되는 모든 시스템에 적용할 수 있다.
② 모든 테스트 과정에 걸쳐 사용될 수 있다.
③ 명세 정보가 제공되는 시점부터 테스트를 시작할 수 있다.
④ 규모가 큰 시스템에도 쉽게 적용할 수 있다.
⑤ 내부 기술 및 코드를 모르더라도 테스트 할 수 있다.
⑥ 명세 오류를 검출할 수 있다.
⑦ 동일한 명세를 바탕으로 하는 경우 테스트 케이스를 재사용할 수 있다.⑧ 사용자 관점에서 테스트가 수행되어 효과적인 오류 검출이 가능하다.
블랙박스 테스트를 이용하여 테스트 케이스를 설계하는 방법에는 여러 가지가 있지만, 여기서는 주로 많이 활용되는 동등 분할 테스트, 경계값 테스트, 도메인 테스트, Pairwise 테스트, 상태 전이 테스트, 인과 그래프와 결정 테이블 방법에 대해 소개한다.
5.1 동등 분할
동등 분할(Equivalence partitioning)은 블랙박스 테스트의 대표적인 방법이다.동등 분할 방법은 서로 독립적인 입력 변수들에 대해 프로그램의 입력 영역을 몇 개의 동등 클래스(Equivalence class)라 불리는 영역으로 분할한 후, 각 클래스로부터 하나 또는 그 이상의 대표값을 선택하여 테스트 케이스로 이용한다. 입력 영역을여러 동등 클래스로 분할할 때 주의할 점은 각 클래스는 시스템에 의해 동일하게 처리되고 동일한 결과를 출력하는 입력 조건 또는 입력값들의 모임이어야 한다.
동등 분할 방법은 기본적으로 다음과 같은 가정에 기반을 두고 있다.
• 동등 클래스로부터 선정된 입력값에서 오류가 발견되면, 클래스에 속한 다른 입력값들에서도 동일한 오류가 발견된다.
• 동등 클래스로부터 선정된 입력값에서 오류가 발견되지 않으면, 같은 클래스에 속한 다른 입력값에서도 오류가 발견되지 않는다.
즉, 동등 클래스의 입력 값 중에서 일부 입력값만을 검증하여 동일 클래스 내에 속한 모든 입력값에 대해 검증하겠다는 것이다. 따라서, 이 테스트 방법에서는 동등 클래스를 어떻게 잘 분할하는지가 관건이라고 할 수 있다. 주어진 입력값과 외부 조건에서 적절한 동등 클래스를 찾아내는 과정은 휴리스틱하다고 할 수 있으며, 일반적으로 아래와 같은 지침을 참고할 수 있다.
• 입력 조건이 범위(Range)인 경우
입력 조건을 만족시키는 하나의 유효한(Valid) 클래스와 입력 조건을 만족시키지 않는 두 개의 유효하지 않은(Invalid) 클래스로 나눈다. 예를 들어, 어떤 학원의 수강생 정원이 1~50명이라고 하면 수강생 수의 입력 조건은 1~50이며, 이 경우 입력값이 1~50에 속하는 클래스(유효한 클래스)와 입력값이 1보다 작은 클래스, 입력값이 50보다 큰 클래스(유효하지 않은 클래스)로 구분한다.
• 입력 조건이 몇 개의 값(Number of values)인 경우
입력 조건을 만족시키는 하나의 유효한 클래스와 입력 조건을 만족시키지 않는 두 개의 유효하지 않은 클래스로 나눈다. 예를 들어, 어떤 회사의 이사직에 1~6명을 채용할 수 있다고 하면, 이사직에 1~6명을 채용한 경우(유효한 클래스)와 이사직에 아무도 채용하지 않은 경우, 이사직에 6명보다 많은 사람을 채용한 경우(유효하지 않은 클래스)를 각각 동등 클래스로 설정한다.
• 입력 조건이 값의 집합(Set of input values)인 경우
입력 조건을 만족시키는 하나의 유효한 클래스와 입력 조건을 만족시키지 않는 한 개의 유효하지 않은 클래스로 나눈다. 예를 들어, 선호 언어 설정 시 한국어, 영어, 프랑스어, 스페인어 중 하나를 입력해야 한다고 할 때, 이 중 하나를 입력값으로 하는 클래스(유효한 클래스)와 이태리어와 같은, 입력 조건을 충족시키지 않는 입력값을 가지는 클래스(유효하지 않은 클래스)로 구분한다.
• 입력 조건에 규칙(Must-be situation)이 존재하는 경우
입력 조건 규칙을 충족하는 하나의 유효한 클래스와 규칙을 충족하지 않는 하나의 유효하지 않은 클래스로 분류한다. 예를 들어, 등록할 계정은 반드시 숫자를 포함해야 한다고 할 때, 계정에 숫자를 포함하는 클래스(유효한 클래스)와 계정에 숫자를 포함하지 않는 클래스(유효하지 않은 클래스)로 구분한다.
동등 분할을 이용한 블랙박스 테스트 개념을 이해하기 위해 영화관에 입장할 수 있는 자격 처리와 관련된 프로그램의 명세를 살펴보자.
"나이가 10세 이하이면 입장을 할 수 없고, 나이가 10~19세이면 부모가 동반해야 입장이 가능하고, 나이가 19~30세이면 혼자서도 입장이 가능하다.”
동등 분할 방식을 적용하기 위해 우선 입력 데이터를 식별해야 한다. 명세로부터 나이' 가 유일한 입력 데이터임을 알 수 있다. 입력 데이터가 식별되면 입력 데이터의 입력값들을 동등 클래스들로 분할해야 한다. 여기서는 식별된 '나이' 라는 입력 데이터를 동등 클래스들로 분할한다. 여기서는 그림과 같이 ‘나이’ 를 5개의 동등 클래스로 분할하였다.
우선 첫 번째 분할 규칙이 적용되었다. 즉, 0부터 30세까지는 이 프로그램의 입력값으로 타당하지만 0보다 적은 나이나 30보다 큰 나이는 타당한 입력값이 아니다. 0보다 적은 나이는 있을 수 없기 때문에 0보다 적은 값을 입력했을 때 프로그램이 어떤 반응을 보이는가를 테스트하는 것은 매우 흥미롭다. 상식적으로 30이 넘은 성인이 볼 수 없는 영화는 없을 것이나, 30보다 큰 나이에 대해서는 명세만 보면 어떻게 처리하느냐가 전혀 나와있지 않다. 따라서 이는 명세의 완전성이 결여된 것으로 볼 수 있다. 이와 같이 명세로부터 테스트 케이스를 추출하는 과정에서 명세 오류를 검출할 수도 있다. 명세가 20세 이상이면 혼자 입장할 수 있는 것으로 명세가 수정되었다고 가정하였을 때 나이에 대한 동등 클래스들은 그림과 같다.
입력 영역을 동등 클래스들로 분할하였으면 각 동등 클래스로부터 최소한 하나의 대표값을 선정하여 테스트 케이스에 반영해야 한다. 표는 그림에서 분할된 동등 클래스에 바탕을 두고 설계한 테스트 케이스들을 보여준다.
테스트 ID | 입력(나이) | 예상 출력 | 비고 |
1 | -10 | 오류 메시지 | 나이 ≤ 0 |
2 | 3 | 입장 불가 | 0 < 나이 ≤10 |
3 | 15 | 부모와 동반 | 10 ≤ 나이 ≤19 |
4 | 27 | 입장 | 19 < 나이 |
표. 영화관 입장 제한 프로그램의 테스트 케이스
그림의 분할 외에 나이 항목에 문자열을 입력하면 어떻게 될까? 실수 값을 입력하면 어떨까? 전혀 기대하지 않은 입력값을 입력하였을 때 프로그램이 어떻게 행동하는지를 테스트하는 것은 매우 중요하다. 이러한 테스트를 부정적 테스트(Negative test)라고 한다. 이는 우리가 앞서 도출한 테스트 케이스인 긍정적 테스트(Positive test)에 반대되는 것으로, 부정적 테스트를 통해 시스템의 신뢰성을 시험해 볼 수 있으므로 긍정적 테스트 못지 않은 중요한 테스트이다. 표는 나이의 값으로 실수와 문자열을 고려한 부정적 테스트 케이스들이다.
테스트 ID | 입력(나이) | 예상 출력 | 비고 |
5 | 15, 79 | 오류 메시지 | 실수 |
6 | "abc" | 오류 메시지 | 문자열 |
표. 추가된 테스트 케이스
동등 분할 테스트에 대해 조금 더 알아보기 위해 명세를 조금 수정하여 보자. 이제는 입력으로 남자(M) 인지 여자(F)인지를 구분하고, 만약 30세 이상인 여자 관객에 대해서는 할인한다고 할 때, 테스트 케이스를 설계하여 보자. 세 번째 분할 규칙을 적용하면, 성별을 나타내는 입력에 M' 또는 F'를 갖는 클래스와 이 두 개의 값을 갖지 않는 클래스로 분할할 수 있다. 후자의 경우를 'D'로 표시하자.
테스트 ID | 나이 | 성별 | 예상 출력 | 비고 |
1-1 | -10 | 'D' | 오류 메시지 | 나이 < 0, 성별 |
1-2 | 3 | 'M' | 입장 불가 | 0 < 나이 ≤ 10 |
1-3 | 15 | 'F' | 부모와 동반 | 10 < 나이 ≤ 19 |
1-4 | 27 | 'F' | 입장 | 19 < 나이 |
1-5 | 15.79 | 'M' | 오류 메시지 | 실수 |
1-6 | "abc" | 'D' | 오류 메시지 | 문자열, 성별 |
표. 좋지 않은 테스트 케이스
표는 앞서 생성한 테스트 케이스에서 성별 항목을 추가하고 각 항목에 값을 부여한 것이다. 불행하게도 표의 테스트 케이스들은 그리 좋다고 볼 수 없다. 그 이유는 다음과 같다. 우선 테스트 케이스 1-1, 1-6은 나이와 성별에 모두 타당하지 않은 입력값들을 가지고 있다. 만약 프로그램이 이 테스트 케이스를 타당한 입력값으로 처리한다면 명백하게 프로그램이 입력 필드들에 대한 검증 작업을 하지 않는다는 의미가 된다. 그러나 만약 프로그램이 이들을 입력값으로 받아들이지 않는다면 테스터 입장에서는 어떤 필드에 문제가 있는지를 알 수 없게 된다. 따라서 타당하지 못한 테스트 케이스를 설계하는 경우에는 한 번에 하나의 입력값만 타당하지 못한 것으로 구성하는 것이 바람직하다.
테스트 케이스 1-1을 타당하지 않은 나이 입력값을 가지는 테스트 케이스 1-11과 타당하지 않은 성별 입력값을 갖는 테스트 케이스 1-1-2로 분리하고, 테스트케이스 1-6을 타당하지 않은 나이 입력값을 갖는 테스트 케이스 1-6-1로 재구성하면, 표와 같은 테스트 케이스를 구할 수 있다.
테스트 ID | 나이 | 성별 | 예상 출력 | 비고 |
1-1-1 | -10 | 'M' | 오류 메시지 | 나이 < 0 |
1-1-2 | 25 | 'D' | 오류 메시지 | 성별 |
1-2 | 3 | 'M' | 입장 불가 | 0 < 나이 ≤ 10 |
1-3 | 15 | 'F' | 부모와 동반 | 10 < 나이 ≤ 19 |
1-4 | 27 | 'F' | 입장 | 19 < 나이 |
1-5 | 15.79 | 'M' | 오류 메시지 | 실수 |
1-6-1 | "abc" | 'F' | 오류 메시지 | 문자열, 성별 |
표. 수정된 테스트 케이스
그러나 여전히 문제점이 남아 있다. 명세에서 30세 이상인 여자 관람객이 할인을 받는다는 요구사항이 있는데도 불구하고 이를 테스트할 수 있는 테스트 케이스가 존재하지 않는다. 이러한 테스트 케이스를 체계적으로 찾아내기 위해서는 출력에 대해서도 입력과 마찬가지로 동등 분할을 하여 그러한 출력을 가져오는 입력값을 식별할 필요가 있다. 이 예에서 할인을 할 수 있는 경우는 30세 이상 여성이므로 30세 이상 여성에 대한 테스트 케이스를 추가하면, 표와 같은 최종 테스트케이스를 얻을 수 있다.
테스트 ID | 나이 | 성별 | 예상 출력 | 비고 |
1-1-1 | -10 | 'M' | 오류 메시지 | 나이 < 0 |
1-1-2 | 25 | 'D' | 오류 메시지 | 성별 |
1-2 | 3 | 'M' | 입장 불가 | 0 < 나이 ≤ 10 |
1-3 | 15 | 'F' | 부모와 동반 | 10 < 나이 ≤ 19 |
1-4 | 27 | 'F' | 입장 | 19 < 나이 |
1-5 | 15.79 | 'M' | 오류 메시지 | 실수 |
1-6-1 | "abc" | 'F' | 오류 메시지 | 문자열, 성별 |
1-7 | 36 | 'F' | 할인 입장 | 30 < 나이 |
표. 할인 입장을 고려한 테스트 케이스
5.2 경계값 테스트
여러 테스트 경험에 따르면 입력 영역의 경계값에서 오류가 발생할 확률이 높다는보고가 있다. 따라서, 경계값 테스트(Boundary value test) 또는 경계값 분석(Boundary value analysis) 기법에서는 경계값을 테스트 데이터로 선택한다. 여기서 경계값이라 함은 동등 클래스에서 각 클래스간의 경계가 되는 값을 말하는데, 단순히 경계에 속하는 값뿐만이 아니라, 경계 바로 아래의 값과 경계 바로 위의 값을 포함한다. 동등 분할 기법에서 단순히 하나의 동등 클래스에서 한 개 이상의 임의 테스트 데이터를 선정하는데 주안점을 두었다면, 경계값 테스트에서는 동등분할 기법과 같이 하나의 동등 클래스에 속하는 한 개 이상의 임의의 테스트 데이터를 선정하기는 하나 결과값에 영향을 미칠 확률이 높은 경계값을 이용하는데 주안점을 둔다. 일반적으로 경계값 테스트 기법은 동등 분할 테스트 기법을 보완하는 테스트 기법으로 활용되고 있다.
경계값 테스트 기법을 통한 테스트 케이스 선정 방법을 이해하기 위해 아래와 같은 롤러코스터 티켓 발매기의 명세를 살펴보자.
"롤러코스터는 안전상의 이유로 신장이 120 이상 210 이하인 사람만 탑승할 수 있다."
경계값을 구하기 전에 입력 영역을 그림과 같이 몇 개의 동등 클래스로 분할한다.
앞서 살펴본 동등 분할 테스트 기법에 따르면, 각 동등 클래스마다 적어도 하나 이상의 테스트 데이터를 선정하게 되므로, X=100, X=165, X=250과 같은 테스트 데이터를 도출할 수 있을 것이다.
하지만, 경계값 테스트 기법에서는 오류 발생 확률이 높은 경계값을 테스트 데이터로 선정해야 하므로, 각 클래스에서의 경계값에 해당하는 테스트 데이터를 선정하게 된다. 경계값은 경계에 속하는 값 뿐만 아니라 경계 바로 위와 아래의 값을 포함한다. 이 예제에서 입력값의 단위가 1이라고 하면 경계값은 '경계에 속하는 값', '경계에 속하는 값-1', '경계에 속하는 값+1'이 된다. 즉, 입력값이 120 미만인 클래스에 대해서는 119, 120, 121을, 입력값이 120 이상이고 210 이하인 클래스에서는 119, 120, 121, 209, 210, 211을, 입력값이 210 초과인 클래스에서는 209, 210, 211을 경계값인 테스트 데이터로 선정할 수 있다.
선정된 테스트 케이스 = {119, 120, 121, 209, 210, 211}
여기에 추가적으로, 경계에 속하지 않는 일반적인 값에 대해서도 오류가 없는지를 검증하기 위해 경계값이 아닌 임의의 값을 선정한다. 이 임의의 값을 중간값(Middle value) 또는 대표값(Typical value)이라 부른다. 중간값으로 165를 선정하였을때, 경계값 테스트 기법에 의해 최종적으로 선정된 데이터는 아래와 같다.
선정된 테스트 케이스={119, 120, 121, 165, 209, 210, 211}
이러한 경계값 테스트의 효용성을 알아보기 위해 다음의 경우들을 생각해보자.
• 만약 프로그램이 120≤x≤210을 120<X≤210으로 구현하였다면, 선정된 테스트 게이스 중 X=120을 이용하여 오류로 검출될 수 있다. 마찬가지로120≤X≤210가 120≤X<210로 구현되었어도 X=210에 의하여 오류가 검출된다.
• 만약 프로그램이 120≤X≤210을 119≤X≤210으로 구현하였다면, X=119가 오류를 검출할 수 있다. 그 이유는 X=119는 원래의 영역에서는 외부 영역의 한 값으로 취급되었으나 프로그램에서는 영역 내부에 있기 때문이다.
• 만약 120≤X≤210이 X≤210으로 구현되었다면, 즉 아래쪽 경계 부분이 빠졌다면 X=119가 이제는 영역 내부에 있게 되기 때문에 오류를 검출할 수 있다. 마찬가지로 120≤X≤210 120≤X로 구현되었다면, X=211이 내부의 점으로 처리되어 오류가 검출될 수 있다.
다시 말하면, 경계값 테스트 기법에서는 클래스 내에서 하나의 테스트 데이터만을 선정하는 것이 아니라, min-, min, min+, 중간값(또는 대표값), max-,max, max+에 해당하는 7개의 데이터를 선정하게 된다.
테스트 데이터가 더 많아진다는 것은 곧 더 많은 테스트를 수행함을 의미하고 위험(Risk)이 감소함을 의미하지만, 현실적으로는 모든 경계값에 해당하는 테스트데이터를 수행하기 힘든 경우가 많다. 따라서, 테스트할 데이터의 수를 줄이기 위해 앞서 소개한 7개의 테스트 데이터를 min-, min, 중간값(또는 대표값), max,max+의 5개의 데이터로 줄일 수도 있다. 이 경우, 앞선 예제에서의 테스트 데이터는 아래와 같게 된다.
선정된 테스트 케이스={119, 120, 165, 210, 211}
테스트 데이터가 줄어든 만큼 결함을 발견하지 못할 위험도 증가하게 된다. 예를 들면, 줄어든 테스트 케이스를 이용하여 시험한다면 120≤X≤210가 120≤X≤209와 같이 구현되었을 때의 오류를 검출할 수 없게 된다.
지금까지는 2개의 입력 변수만을 고려하였는데 만약 n개의 입력 변수가 있을 경우에는 다음의 절차를 통해 경계값 테스트를 수행할 수 있다. (앞서의 경우와 같이동등 클래스 내의 경계값 중, min-, min, max, max+만을 고려하도록 하자.)
① 명세로부터 입력 변수들을 식별한다.
② 각 입력 변수에 대한 영역을 식별한다. 즉, 각 입력 변수가 가질 수 있는 최대값(max) 및 최소값(min)을 구한다. 또한 최대값 보다 약간 큰 값(max+)과 최소값보다 약간 작은 값(min)을 구한다.
③ 모든 변수에 대해 (min-, min, max, max+)의 모든 가능한 조합을 생성한다.따라서 입력 변수가 n개 이므로, 4개의 테스트 케이스가 생성될 것이며, 최종적으로 입력 영역 내부의 값 하나가 추가되므로 4+1개의 테스트 케이스가 생성된다.
예를 들어, 두 개의 입력 변수 '나이'와 '신장' 에 따라 처리를 달리하는 프로그램을 테스트하는 경우를 생각해 보자. 만약 각 입력 변수의 영역이 20≤나이≤50,120≤신장≤210으로 주어졌다면 그림과 같이 17개의 테스트 케이스가 생성됨을 알 수 있다.
[참고] 경계값 분석 기법의 테스트 케이스 수
동등 클래스에서 테스트 케이스 값을 선정할 때, 경계 부분에 해당하는 입력값에서 결함이 발견될 확률이 경험적으로 높으므로, 경계값을 포함하여 테스트 케이스를 도출하는 방법이 경계값분석 테스트 기법이다. 경계값 분석 기법을 사용하면 항상 위에서 소개한 4 + 1개의 테스트 케이스만을 구할 수 있는 것은 아니다. 그보다 더 많은 테스트 케이스를 도출하도록 입력값을 선택할 수도 있다. 또한, 현실적으로 수많은 테스트 케이스를 모두 시험하기에는 시간적인 제약이 따를 수 있으므로, 그보다 더 작은 테스트 케이스만을 도출할 수도 있다. 앞서 소개한 47 + 1개의 테스트 케이스를 도출하는 방법을 사용하는 경우, 5개의 변수가 존재하는 프로그램에서는 1025(= 45 + 1)개의 테스트 케이스가 도출되는데, 이를 모두 시험하기 힘든 경우가 발생할 수있으므로 대개는 적절한 수의 테스트 케이스를 도출하고 시험하게 된다.
경계값을 동등 클래스 간의 경계에 있는 값, 경계 바로 아래에 있는 값, 경계 바로 위에 있는 값이라고 정의하였을 때, 특정 영역이 주어진 경우의 경계값은 (min-, min, min+, max-, max,max+)이다. 이 경우, 모든 경계값과 중간값의 조합을 이용하여 테스트 케이스를 구하면 총 7개의 테스트 케이스가 도출된다.
위에서 도출한 7개의 테스트 케이스 수를 줄이기 위해, 아래와 같이 경계값 (min-, min,max, max+)과 중간값의 모든 조합을 이용하여 테스트 케이스를 도출하는 경우에는 총 5개의테스트 케이스를 얻을 수 있다.
하나의 입력값에 대해 경계값 (min-, min, min+, max-, max, max+)과 중간값의 조합을 이용하여 6n+1개의 테스트 케이스를 아래와 같이 구할 수도 있다.
또는 경계값 (min-, min, max, max+)과 중간값의 조합을 이용하여 6n+1개의 테스트 케이스를 아래와 같이 구할 수도 있다.
경계값 (min-, min, max, max+)과 중간값의 조합을 이용하여 4n+1개의 테스트 케이스를 아래와 같이 구할 수도 있다.
5.3 도메인 테스트
5.1절과 5.2절에서 설명한 동등 분할 테스트 방법과 경계값 테스트 방법은 입력 변수들 간의 상관관계를 전혀 고려하지 않고 각 입력 변수의 범위만을 고려하여 테스트 케이스를 선정한다. 예를 들어, 2개의 입력 변수 x, y가 그림과 같은 영역을 형성하는 관계가 있을 때 경계값 테스트 방법으로는 그림에서 'X'로 표시된 16개의 경계값을 구하게 된다. 그러나 이렇게 구한 경계값들은 모두 영역 밖에 존재하게 되므로 오류를 검출하는 능력이 떨어질 수 밖에 없다.
그림은 2개의 입력 변수가 있을 때 발생할 수 있는 여러 종류의 도메인 오류들을 보여준다.
• 경계 이동 오류 : 경계가 수직이나 수평으로 이동된 오류
• 경사 경계 오류 : 경계가 올바르지 못한 각도로 회전된 오류
• 경계 분실 오류 : 영역을 이루는 경계가 누락된 오류
• 과잉 경계 오류 : 실제 있지 않은 경계가 더 발생한 오류
5.2절에서 설명한 경계값 테스트와는 달리, 도메인 테스트(Domain test)는 테스트 케이스의 개수를 획기적으로 줄이면서도 도메인 오류들을 효과적으로 검출한다. 다음은 도메인 테스트에서 자주 사용되는 용어들이다.
• on 포인트 : 경계에 있는 값
• off 포인트 : 경계에 있지 않은 값
• in 포인트 : 모든 경계 조건을 만족하고, 경계에 있지 않은 값
• out 포인트 : 모든 경계 조건을 만족하지 않고, 경계에 있지 않은 값
on off 포인트들의 선정은 경계가 개방되어 있는지 닫혀 있는지에 따라 달라진다.
• 관계 연산자 <, >,=등에 의하여 경계가 닫혀있을 때, on 포인트는 경계상에 존재하는 값(또한 영역 내에 속한다)이고, off 포인트는 영역 밖에 있는 값이다.
• 관계 연산자 <,>에 의하여 경계가 개방되어 있을 때, on 포인트는 경계상에 존재하지만 영역 내에 속하지 않는 값이고, off 포인트는 영역 내에 있는 값이다.
그림에서 'y-x≤15' 에 의해 이루어진 영역을 생각해보자. A는 on 포인트이고, 'y-x=15' 에 의한 경계에서 약간 벗어난 B는 off 포인트이다. in 포인트들은 'y-x≤15' 영역 안에 있는 값들이며, out 포인트들은 영역 밖에 있는 값들이다.
그림에서 'x<100' 에 의해 이루어진 영역을 생각해보자. E는 경계상에 존재하지만 영역 밖에 있기 때문에 on 포인트가 되고, C는 경계에서 약간 떨어진 영역 내에 존재하기 때문에 off 포인트가 된다. in 포인트들은 'x<100' 영역 안에있는 값들이며, out 포인트들은 영역 밖에 있는 값들이다.
도메인 테스트에 기반한 테스트 데이터를 선정하는 가장 대표적인 방법으로 1×1 도메인 테스트 기법과 NX1 도메인 테스트 기법이 있다. 여기서는 1×1 도메인 테스트 기법에 관해서만 기술하고, (참고)에서 NX1 도메인 테스트 기법에대해 논의할 것이다.
1×1 도메인 테스트 기법은 각 영역 경계에서 하나의 on 포인트와 하나의 off 포인트를 선정하도록 한다. on 포인트와 off 포인트를 선정하는 규칙은 다음과 같다.
• 각 관계 조건(≤, <, > 또는 >)에 대해 하나의 on 포인트와 하나의 off 포인트를선정한다.
• 등가 조건(=)에 대해서는 하나의 on 포인트와 두 개의 off 포인트를 선정한다.예를 들어, ‘x=10' 이라는 조건이 있다고 하자. 만약, 'x=10'이 ‘x≥10'으로 잘못 구현되었다면 on 포인트인 x=10과 off 포인트인 x=9만을 가지고는 오류를 검출하지 못하며, x=11과 같은 또 다른 off 포인트에 대해 테스트를 수행해야 오류를 검출하게 될 것이다. 따라서, 등가 조건에 대해서는 하나의 on 포인트와 2개의 off 포인트를 선정해야 한다.
위와 같이 하나의 변수에 대해 on 포인트와 off 포인트를 선정하였으면, 다른 변수에 대해서는 on 포인트나 off 포인트가 아닌 값을 선정하여야 한다. 즉, 하나의테스트 케이스에는 하나의 on 포인트와 하나의 off 포인트만을 갖도록 구성하여야한다.
도메인 테스트의 테스트 데이터와 각 테스트 데이터에 대한 수행 예상 결과는 도메인 테스트 매트리스(Domain test matrix)라 불리는 표에 기록한다. 도메인 테스트 매트릭스는 다음과 같은 항목들로 구성된다.
• 변수 : 모든 입력 변수들을 나열한다.
• 조건 : 각 변수에 대한 경계 조건들을 기술한다.
• 타입 : 포인트의 종류(예, on, off, in, out)를 기술한다.
• 테스트 케이스 : 테스트 케이스들을 기술한다.
• 대표값 : 해당 변수에 대해 아무런 제약이 기술되어 있지 않는 경우를 나타낸다.
• 예상 결과 : 테스트 데이터들이 시스템에 의해 처리가 되는지(Accept) 또는 처리가 되지 않는지(Reject)를 나타내며, 예상되는 출력 결과 또는 오류 메시지들을기술한다.
표는 그림에 해당하는 도메인 테스트 매트릭스이다.
변수 | 조건 | 타입 | 테스트 케이스 | |||
1 | 2 | 3 | 4 | |||
x | x < 100 | on | 100 | |||
off | 101 | |||||
대표값 | in | 50 | 50 | |||
y | y ≤ x + 15 | on | 65 | |||
off | 66 | |||||
대표값 | in | 113 | 112 | |||
예상 결과 | Accept | Reject | Accept | Reject | ||
예상 결과1 | ||||||
.. | ||||||
예상 결과n |
표. 도메인 테스트 매트릭스 예
테스트 케이스 1과 테스트 케이스 2는 변수 x에 대한 조건에서 on 포인트와 off포인트를 테스트하는 것이다. 이 때 다른 변수 y의 값은 대표값으로 in 포인트를선정한다. 이 예에서는 테스트 케이스 1과 테스트 케이스 2에서 y의 값으로 in 포인트를 선정하였다. 또 하나 주목할 사실은 각 테스트 케이스에 하나의 on 포인트나 하나의 off 포인트만을 포함한다는 점이다. 테스트 케이스 x의 값으로는 on 포인트인 100을 선정하였고, y의 값으로는 in 포인트인 113(113100+15)을 선정하였다. 테스트 케이스 2는 x의 값으로는 off 포인트인 101을 선정하였고, y의 값으로는 in 포인트인 112(112100+15)를 선정하였다.
테스트 케이스 3과 테스트 케이스 4는 변수 y에 대한 조건식(y=x+15)의 on 포인트와 off 포인트를 테스트한다. 테스트 케이스 3은 x의 값을 50으로 할 때 65(=50+15)를 on 포인트로 선정하였고, 테스트 케이스 4는 이보다 약간 큰 값 66 y off 포인트로 선정하였다.
[참고] NX1도메인 테스트 기법
NX1 도메인 테스트 기법은 입력 변수의 개수가 n개 라면 입력 영역의 각 경계에서 n개의 on 포인트와 1개의 off 포인트를 선정하는 방식이다. 예를 들어, 2개의 입력 변수 x, y가 10≤x, y≤20이고 x≥y+1를 만족해야 한다면 NX1 도메인 테스트 기법은 입력 영역의 경계에서 세 개의 테스트 데이터를 구한다.그 중 두 개는 입력 경계에 있는 on 포인트이고 나머지 하나는 입력 영역 외부에 있는 off 포인트이다. 아래 그림은 이러한 과정을 보여준다. 그림에서는 (x=13, y=12)와 (x=18, y=17)이 되도록 on 포인트들을 선정했고, off 포인트로 (x=15, y=15)를 선정했다.
만약 프로그램이 ‘x≥y+1'를 ‘x>y+1'로 구현하였다면 두 개의 on 포인트들에 대해서 프로그램의 실행값이 예상 결과와는 다르게 출력됨을 알 수 있다. NX1 도메인 테스트 기법의 한 가지 단점은 사용되는 테스트 케이스의 개수가 1×1 도메인 테스트 기법에 비해 많다는 점이다. 경계의 개수가 b라고 할 때 N×1도메인 테스트 기법은 (n+1)*6개의 경계(on, off 포인트)점을 선정해야 하지만 1X1 도메인 테스트 기법은 2*6개만 선정한다. 그림 5.7과 같은 거의 모든 도메인 오류에 대해서도 11 도메인 테스트 기법이 NX1 도메인 테스트 기법에 비해 오류 검출 능력이 그리 떨어지지 않는다는 연구 결과가 있다.
5.4 Pairwise 테스트
Pairwise 테스트(Pairwise Test) 방법에 대해 설명하기 전에 어느 회사에서 구축한 웹 사이트가 올바르게 동작하는지를 테스트하는 상황을 생각해 보자. 이 웹사이트는 다음과 같은 동작 환경에 대한 요구사항들이 존재한다.
• 서버 운영체제 : Windows NT, Windows 2000 및 리눅스 운영체제 등에서 동작이 가능해야 한다.
• 웹서버 : IIS, Apache 및 WebLogic 웹 서버들로부터 데이터 수신이 가능해야 한다.
• 웹브라우저 : 웹 사이트는 IE(Internet Explorer), Netscape, Mozilla 브라우저에서 올바르게 동작해야 한다.
• 클라이언트 운영체제 : Windows 98, Windows ME, Windows XP과 같은 클라이언트 운영체제를 지원해야 한다.
이 웹 사이트를 철저하게 테스트하기 위해서는 세 종류의 서버 운영체제 및 세 종류의 웹서버, 세 종류의 웹브라우저, 세 종류의 클라이언트 운영체제의 모든 가능한 조합(3⁴=81)에 대해 테스트해야 한다. 그러나 한정된 테스트 기간 및 인력으로 81가지 환경에서 테스트하기는 현실적으로 불가능하다. 이와 같은 경우 Pairwise 테스트 방법을 사용하면 테스트해야 하는 조합의 수를 줄일 수 있다.
Pairwise 테스트는 입력값들의 모든 가능한 조합들을 테스트하는 대신 모든 짝(Pair)들의 조합을 테스트하는 방법이다. 즉, 모든 입력값들에 대해 존재할 수 있는 모든 상호작용을 고려하지 않고 두 개의 입력값들 간의 가능한 모든 상호작용만을 고려한다. 표 는 Pairwise 테스트를 적용하여 테스트 케이스의 개수를 81개에서 9개로 줄인 결과이다. 좀 더 자세히 살펴보면 서버 운영체제, 웹서버, 웹브라우저, 클라이언트 운영체제에서 모든 2개 입력 항목의 조합인 (서버 운영체제, 웹서버), (서버 운영체제, 웹브라우저), (서버 운영체제, 클라이언트 운영체제), (웹서버, 웹브라우저), (웹서버, 클라이언트 운영체제), (웹브라우저, 클라이언트 운영체제)에 대해 모든 가능한 입력값의 조합이 포함되어 있음을 알 수 있다. 예를 들어, (서버 운영체제, 웹서버) 조합의 모든 가능한 입력 조합인 (Windows NT, IIS), (Windows NT, Apache), (Windows NT, WebLogic), (Windows 2000, IIS), (Windows 2000, Apache), (Windows 2000, WebLogic), (Linux, IIS), (Linux, Apache), (Linux, WebLogic) 입력값이 모두 포함되어 있다.
테스트 케이스 | 서버 운영체제 | 웹서버 | 웹브라우저 | 클라이언트 운영체제 |
1 | Windows NT | IIS | Netscape | Windows XP |
2 | Windows 2000 | Apach | Netscape | Windows 98 |
3 | Linux | WebLogic | Netscape | Windows ME |
4 | Linux | Apache | IE | Windows XP |
5 | Windows 2000 | IIS | IE | Windows ME |
6 | Windows NT | WebLogic | IE | Windows 98 |
7 | Windows 2000 | WebLogic | Mozilla | Windows XP |
8 | Linux | IIS | Mozilla | Windows 98 |
9 | Windows NT | Apache | Mozilla | Windows ME |
표. Pairwise 테스트 적용 결과
연구에 따르면, Pairwise 테스트 방법을 사용하면 모든 가능한 입력 조합들을사용하여 테스트하는 것과 비슷한 효과를 얻을 수 있다고 한다. Kuhn과 Reilly가모질라 웹 브라우저와 아파치 서버에 대한 버그 데이터베이스를 분석한 결과, 보고된 오류의 76%를 Pairwise 테스트로 검출할 수 있다는 사실을 발견하였으며, 또한 Wallace와 Kuhn FDA에서 15년간 반품된 의료장비를 분석한 결과, Pairwise 테스트로 97%의 오류를 검출할 수 있다는 사실을 발견하였다.
Pairwise 테스트를 이용하여 테스트 케이스를 생성하기 위한 여러 알고리즘이 존재하지만 여기에서는 IPO(In-Parameter-Order) 방법에 대해 알아본다. IPO알고리즘에서는 프로그램이 P1, P2, …, P개의 입력 인자를 가지고 있을 때, 다음과 같은 과정을 거쳐 Pairwise 테스트 집합을 만든다.
① 처음 두 입력 인자인 p1과 p2로 이루어진 모든 가능한 조합들의 집합을 구성한다.
② 입력 인자를 하나씩 추가하면서 입력인자 pn까지 수평확장(Horizontal growth, HG)과 수직확장(Vertical growth, VG)을 반복적으로 수행한다. 여기서, 수평확장은 입력인자를 추가하는 과정을 의미하고, 수직확장은 테스트케이스를 기존 집합에 추가시키는 과정을 의미한다.
위의 두 과정을 통하여 테스트 케이스를 도출하는 경우를 예를 통해 살펴보도록하자. 만약 어떤 함수가 3개의 인자 A, B, C를 입력으로 받고 인자 A는 A1, A2, A3 세 가지 값을 가지며, B는 B1과 B2의 두 가지 값을, C는 C1, C2, C3의 세 가지 값을 가질 수 있다고 가정하자
입력 인자 | 입력 가능 값 |
A | A1, A2, A3 |
B | B1, B2 |
C | C1, C2, C3 |
① 처음 두 입력 인자인 (A, B)의 모든 입력값의 쌍을 구한다. A는 A1, A2, A3를,B는 B1, B2, B3를 가질 수 있으므로, 모든 가능한 입력값은 (A1, B1), (A1, B2), (A2, B1), (A2, B2), (A3, B1), (A3, B2)가 된다.
테스트 ID | A | B | C |
T1 | A1 | B1 | - |
T2 | A1 | B2 | - |
T3 | A2 | B1 | - |
T4 | A2 | B2 | - |
T5 | A3 | B1 | - |
T6 | A3 | B2 | - |
② [수평확장 1] 다음은 '단계①' 에서 사용한 인자인 A와 B를 제외한 인자의 조합인 A, C 및 B, C의 모든 쌍을 구하고 이 쌍들의 집합을 AP라고 한다. AP 집합은 아래와 같다.
AP = { (A1, C1), (A1, C2), (A1, C3),
(A2, C1), (A2, C2), (A2, C3),
(A3, C1), (A3, C2), (A3, C3),
(B1, C1), (B1, C2), (B1, C3),
(B2, C1), (B2, C2), (B2, C3) }
'단계①'에서 도출한 테스트 케이스에서 인자 C의 입력 가능 값인 C1, C2, C3를 차례로 입력하여 테스트 케이스 T1, T2, T3를 확장한다.
테스트 ID | A | B | C |
T1 | A1 | B1 | C1 |
T2 | A1 | B2 | C2 |
T3 | A2 | B1 | C3 |
T4 | A2 | B2 | * |
T5 | A3 | B1 | * |
T6 | A3 | B2 | * |
③ [수평확장 2] 단계'에서 수평확장한 테스트 케이스 T1, T2, T3에 대해 AP집합에 속하는 원소들을 삭제한다. 예를 들어, 테스트 케이스 T1 (A1, B1, C1)은(A1, C1)과 (B1, C1)를 포함하므로 이를 AP 집합에서 제거한다. 새롭게 구성된AP 집합은 아래와 같다.
AP = { (A1, C1), (A1, C2), (A1, C3),
(A2, C1), (A2, C2), (A2, C3),
(A3, C1), (A3, C2), (A3, C3),
(B1, C1), (B1, C2), (B1, C3),
(B2, C1), (B2, C2), (B2, C3) }
④ [수평확장 3] 아직 T4, T5, T6에 대해서는 인자 C의 값이 정해지지 않았으므로가능한 AP에 있는 짝들을 많이 포함하도록 C의 값을 추가한다. 만약, T4에 대해 인자 C의 값을 C1으로 입력한다면 T4는 (A2, B2, C1)이 되고 (A2, C1)과(B2, C1) 두 개의 쌍을 커버한다. 만약 C2를 입력하면 T4는 (A2, B2, C2)이 되고 (B2, C2) 하나의 쌍만을 커버한다. 인자 C의 입력값으로 C3를 입력한다고하면 T4는 (A2, B2, C3)가 되고 (B2, C3) 하나의 쌍만을 커버한다. 따라서 두개의 쌍을 커버하는 T4의 인자 C의 입력값으로 C1을 채택한다. 결과, AP 집합은 아래와 같이 변경된다.
AP = { (A1, C1), (A1, C2), (A1, C3),
(A2, C1), (A2, C2), (A2, C3),
(A3, C1), (A3, C2), (A3, C3),
(B1, C1), (B1, C2), (B1, C3),
(B2, C1), (B2, C2), (B2, C3) }
동일한 방법으로 T5와 T6를 확장하면 T5에 C3, T6에 C1을 입력할 수 있다. AP집합은 아래와 같아진다.
AP = { (Al, C1), (A1, C2), (A1, C3),
(A2, C1), (A2, C2), (A2, C3),
(A3, C1), (A3, C2), (A3, C3),
(B1, C1), (B1, C2), (B1, C3),
(B2, C1), (B2, C2), (B2, C3) }
T4, T5, T6의 확장을 완료한 후 테스트 케이스는 다음과 같이 구성된다.
테스트 ID | A | B | C |
T1 | A1 | B1 | C1 |
T2 | A1 | B2 | C2 |
T3 | A2 | B1 | C3 |
T4 | A2 | B2 | C1 |
T5 | A3 | B1 | C3 |
T6 | A3 | B2 | C1 |
⑤ [수직확장1] 커버되지 않은 AP의 모든 쌍에 대해 테스트 케이스들을 추가한다.커버되지 않은 AP = {(A1, C3), (A2, C2), (A3, C2), (B1, C2), (B2, C3)}에서서로 배타적인 쌍을 찾아보면, 동일한 인자 A와 C로 구성된 (A1, C3), (A2,C2), (A3, C2)가 있다. 각 쌍에 대해 하나의 테스트 케이스를 추가한다. (A1,C3)에 대해 (A1, *, C3)를 추가한다. 여기에서 *는 아직 결정하지 않았다는 사실을 나타낸다. (A2, C2)에 대해 (A2, *, C2)를 추가한다. (A3, C2)에 대해서는(A3, *, C2)를 추가한다. 위의 3 쌍을 추가한 테스트 케이스는 아래와 같다.
테스트 ID | A | B | C |
T1 | A1 | B1 | C1 |
T2 | A1 | B2 | C2 |
T3 | A2 | B1 | C3 |
T4 | A2 | B2 | C1 |
T5 | A3 | B1 | C3 |
T6 | A3 | B2 | C1 |
T7 | A3 | * | C2 |
T8 | A2 | * | C2 |
T9 | A1 | * | C3 |
(B1, C2)에 대해서는 이미 추가된 (A3, *, C2)를 (A3, B1, C2)로 변경하여 커버하도록 한다. (B2, C3)에 대해서는 이미 추가된 (A1, *, C3)를 (A1, B2, C3)로 변경하여 커버한다. AP에 더 이상의 짝이 남아있지 않으므로 모든 짝들의 조합이 생성되었다. 다음 표는 최종 결과를 보여준다.
테스트 ID | A | B | C |
T1 | A1 | B1 | C1 |
T2 | A1 | B2 | C2 |
T3 | A2 | B1 | C3 |
T4 | A2 | B2 | C1 |
T5 | A3 | B1 | C3 |
T6 | A3 | B2 | C1 |
T7 | A3 | B1 | C2 |
T8 | A2 | B1 | C2 |
T9 | A1 | B2 | C3 |
이 예제를 통해, Pairwise 테스트 방법을 사용하지 않는 경우 총 18(= 3*2*3)개의 테스트 케이스가 존재하나, Pairwise 테스트 기법을 사용하면 총 테스트 케이스를 9개로 줄일 수 있음을 알 수 있다.
5.5 상태 전이 테스트
상태 전이도(State transition diagram, STD)는 시스템 외부로부터 들어오는 일련의 이벤트들에 대해 시스템의 상태가 어떻게 전이되고 어떤 식으로 반응하는가를 나타내는 좋은 명세 수단이다. 상태 전이 테스트(State transition test)는 시스템을 상태 전이도로 모델링 한 후 테스트 케이스들을 상태 전이도로부터 도출하는방법이다.
그림은 형광등을 상태 전이도로 표현한 것이다. 형광등은 'ON' 상태나 또는 'OFF' 상태에 있을 수 있는데 스위치 버튼을 누르는 외부 행위에 따라 'ON상태에서 'OFF' 상태로 전이되거나 역으로 'OFF' 상태에서 'ON' 상태로 전이된다. 상태 전이도에서 원은 시스템의 상태를 표현하고 화살표는 상태간의 전이를나타낸다. PUSH SWITCH' 는 시스템 외부에서 시스템으로 들어오는 시스템의상태 변화를 야기하는 이벤트를 나타낸다. '다음에 나오는 명령은 시스템의 행위를 나타낸다. 또 검은 색으로 칠해진 원은 시스템 시작점을 나타낸다. 이 예에서시스템의 초기 상태는 ‘OFF' 상태로 설정되었으며, 스위치를 눌러(‘PUSHSWITCH' 이벤트 발생) 형광등을 켜고 끄는 과정이 모델링 되었다.
상태 전이 테스트를 수행하는 과정은 다음과 같다.
① 상태 전이도를 사용하여 테스트하려고 하는 시스템을 모델링한다.
② 상태 전이도로부터 전이 트리(Transition tree)를 만든다.
③ 전이 트리로부터 각 전이 경로를 테스트하는 테스트 케이스들을 생성한다.
④ 비정상적인 전이를 테스트하기 위한 테스트 케이스들을 생성한다.
아래와 같은 테이프 재생기의 명세가 주어졌을 때 상태 전이 테스트 방법을 이용하여 테스트 케이스를 생성해보자.
“테이프 재생기는 재생(PLAY), 빠른 전진 이동(FAST FORWARD) 및 빠른 재생(FAST PLAY) 기능을 가지고 있다. 재생과 빠른 전진 이동은 각각 재생과 빠른 전진 이동 버튼을 누른 경우에 동작되며, 정지(STOP) 버튼을 사용하여 동작을 중지할 수 있다. 재생 모드에 있을 때 빠른 재생을 위해서는 빠른 전진 이동 버튼을 사용한다. 빠른 재생 모드에 있을 때는 빠른 전진 이동 버튼을 이용하여 빠른 전진이동 모드로 전환하거나 정지 버튼을 사용하여 재생 모드로 돌아갈 수 있다. 빠른 전진 이동 모드에 있을 때는 재생 버튼을 사용하여 재생 모드로 바로 갈 수 있다."
그림은 테이프 재생기에 대한 상태 전이도를 보여준다. 명세로부터 상태전이도를 구축한 후에는 상태 전이도로부터 전이 트리를 만든다. 상태 전이도로부터 전이 트리를 만드는 과정은 다음과 같다.
① 상태 전이도의 초기 상태를 전이 트리의 루트 노드로 한다.
② 루트 상태로부터 나오는 각 전이에 대해 전이되는 다음 상태에 해당하는 노드를추가하고 루트 노드에서 추가된 노드로의 간선을 연결한다. 만약 목적 상태가전이 트리에 이미 나와 있거나 종료 상태가 아니라면 이와 같은 과정을 각 목적상태에 대해 수행한다.
그림은 상태 전이도로부터 생성된 전이 트리를 보여준다. 전이트리의 각 경로가 하나의 테스트 케이스에 해당된다.
테스트 ID | 입력 | 예상 출력 | ||
초기상태 | 이벤트 | 행위 | 완료상태 | |
1.1 | OFF | PLAY | - | PL |
1.2 | PL | FAST FORWARD | - | FP |
1.3 | FP | STOP | - | PL |
2.1 | OFF | PLAY | - | PL |
2.2 | PL | FAST FORWARD | - | FP |
2.3 | FP | FAST FORWARD | - | FF |
3.1 | OFF | PLAY | - | PL |
3.2 | PL | STOP | - | OFF |
4.1 | OFF | FAST FORWARD | - | FF |
4.2 | FF | PLAY | - | PL |
5.1 | OFF | FAST FORWARD | - | FF |
5.2 | FF | STOP | - | OFF |
표. 테이프 재생기의 테스트 케이스
표는 그림의 전이트리를 이용하여 루트노드로부터 각 단말노드에 이르는 경로를 테스트하기 위한 테스트 케이스들을 보여준다. 예를들어 루트노드인 OFF에서 좌측 단말노드인 PL까지의 경로를 테스트하기 위해서는 표의 1.1, 1.2, 1.3 테스트 케이스를 이용할 수 있다. 표의 테스트 케이스는 상태 전이도에 명시적으로 기술된 상태와 이벤트의 조합만을 고려하여 만들어진 것이다. 그러나,보다 철저한 테스트를 위해서는 이렇게 정상적인 경우만을 테스트하는 것뿐만이아니라 비정상적인 경우에 대해서도 테스트해야 한다. 여기에서 비정상적인 경우란 상태 전이도의 각 상태에서 명시되어 있지 않은 이벤트를 말한다.
예를 들어, 테이프 재생기가 FP 상태에 있을 때 'PLAY 이벤트에 대한 전이 정보가 상태 전이도에는 없다. 또한 테이프 재생기가 FF 상태에 있을 때 FASTFORWARD' 이벤트에 대한 전이 정보도 없다. 만약, 현재 상태에서 기대하지 않은 이벤트를 만나면 일반적으로 시스템은 예외처리를 하고 상태는 변경되지 않는다. 아래의 표는 비정상적인 경우를 함께 고려한 테스트 케이스를 보여준다.
테스트 ID | 입력 | 예상 출력 | ||
초기상태 | 이벤트 | 행위 | 완료상태 | |
1.1 | OFF | PLAY | - | PL |
1.2 | PL | FAST FORWARD | - | FP |
1.3 | FP | STOP | - | PL |
2.1 | OFF | PLAY | - | PL |
2.2 | PL | FAST FORWARD | - | FP |
2.3 | FP | FAST FORWARD | - | FF |
3.1 | OFF | PLAY | - | PL |
3.2 | PL | STOP | - | OFF |
4.1 | OFF | FAST FORWARD | - | FF |
4.2 | FF | PLAY | - | PL |
5.1 | OFF | FAST FORWARD | - | FF |
5.2 | FF | STOP | - | OFF |
6 | OFF | STOP | 예외발생 | OFF |
7 | PL | PLAY | 예외발생 | PL |
8 | FP | PLAY | 예외발생 | FP |
9 | FF | FAST FORWARD | 예외발생 | FF |
표. 비정상적인 경우를 고려한 테스트 케이스
5.6 인과 그래프와 결정 테이블
인과 그래프(Cause-effect graph)는 1973년 IBM에서 개발된 테스트 케이스 작성 기법으로, 명세를 논리 표기법(Logic network notation)으로 도식화하여 명세의 불완전성과 모호성을 찾아내기 쉬운 장점이 있다. 여기서는 인과 그래프를 이용하여 입력 조건에 따른 프로그램의 행위를 기술하고 이를 결정 테이블(Decisiontable)로 변환하여 테스트 케이스를 도출하는 방법에 대해 설명한다. 결정 테이블방법은 복잡한 논리적 관계를 표현하기에 좋고 누락된 요구사항을 검사하고자 할때 용이하게 사용할 수 있다.
우선 인과 그래프를 이용하여 어떻게 명세를 도식화할 수 있는지를 살펴보자.
인과 그래프에서 '인(Cause, Condition)'은 입력값 또는 사전 조건을 의미하며, 결과에 영향을 줄 수 있는 어떤 원인이 되는 것을 말한다. '과(Effect, Action)’는 결과값 또는 사후 조건을 의미하며, 하나 이상의 원인으로 인해 야기되는 어떤 결과를 말한다. 즉, 인과 그래프는 프로그램의 입력에 따른 결과를 선으로 연결하여 도식화한 것이다. 인과 그래프에서는 명세를 논리적으로 표현하기 위해 Identity,AND, OR, NOT과 같은 함수(Functions)와 E(Exclusive), I(Inclusive), R(Require), O(Only one), M(Mask)과 같은 제약사항(Constraints)을 이용한다. 표는 인과 그래프에서 사용되는 함수와 제약사항을 보여주고 있다.여기서 1은 참(True)을 의미하고, 0은 거짓(False)를 의미한다.
인과 그래프를 이용하여 명세를 도식화하기 위해 아래와 같은 티켓 판매 프로그램 명세를 살펴보자.
"티켓을 30매 이상 동시 구매하는 경우 30%의 단체할인가를 적용하며, 주중에는 10% 할인가를 적용한다. 쿠폰 소지자에 한해서는 주중 20%, 주말 10% 할인가를 적용한다. 단체할인가를 적용하는 경우에는 쿠폰을 사용할 수 없다."
위의 명세에서 원인과 결과를 식별해보자. 원인 즉, 입력 조건은 아래와 같다.
• 30매 이상 동시구매
• 쿠폰 사용
• 주중
• 주말
주어진 명세에서 결과, 즉 발생 가능한 행위는 아래와 같다.
• 30% 할인
• 20% 할인
• 10% 할인
• 0% 할인
그림은 위의 명세를 인과 그래프로 표현한 것이다. 원인을 왼쪽에, 결과를오른쪽에 표시하고, 원인과 결과와의 관계를 표에서 설명한 기호로 표시하였다. 그림에서 주중에 쿠폰을 사용하는 경우 20%가 할인됨을 표현하기 위해, 주중과 쿠폰 사용이라는 원인의 AND 조합을 20% 할인이라는 결과와 연결하였다. 또한 주말에 쿠폰을 사용하는 경우 10%의 할인을 받을 수 있음을 표현하기 위해서 주말과 쿠폰 사용의 AND 조합을 10% 할인이라는 결과와 연결하였다. 제시된 4가지 원인 중, 주중과 주말은 동시에 참이 될 수 없는 조건이므로, 두조건을 연결하고 E' 라고 표시하였으며, 30매 이상 동시구매를 하는 경우에는 다른 결과와는 상관없이 항상 30% 할인가를 적용 받으므로, 다른 결과와의 관계에서 'M' 이라고 표시하였다.
인과 그래프로부터 테스트 케이스를 도출하기 위해서는 인과 그래프를 해석하여 결정 테이블로 변환한다. 표는 그림의 인과 그래프에 해당하는 결정테이블을 보여준다.
조건의 조합(Rule) | ||||||
1 | 2 | 3 | 4 | 5 | ||
입력 조건 (cause 또는 condition) | 30매 이상 동시구매 | Y | N | N | N | N |
쿠폰 사용 | D | Y | N | Y | N | |
주중 | D | Y | Y | N | N | |
주말 | D | N | N | Y | Y | |
행위 (effect 또는 action) | 30% 할인 | X | ||||
20% 할인 | X | |||||
10% 할인 | X | X | ||||
0% 할인 | X |
표. 티켓 판매 프로그램의 결정 테이블
결정 테이블은 입력 조건과 행위를 행으로, 조건의 조합을 열로 하는 테이블 형태로 기술한다. 즉, 입력 조건이 조건의 조합에 명시된 것과 같이 주어졌을 때, 어떤 행위가 발생하는지를 기술한다. 여기서, 입력 조건의 'Y'는 해당 조건이 참(True)임을 의미하며, 'N'은 해당 조건이 거짓(False)임을 의미한다. 또한, 'D'는 해당 조건의 참 혹은 거짓 유무에 종속적이지 않음(Don't care)을 의미한다. 결정 테이블의 행위에서 X'는 주어진 입력 조건에 대해 해당 행위가 발생함을 의미하며, 공백으로 표기된 것은 해당 입력 조건에서 행위가 발생하지 않음을 의미한다.
결정 테이블이 도출되면, 조건의 조합에 해당하는 입력값의 집합이 각각 하나의 테스트 케이스가 된다. 즉, 위의 예에서는 총 5개의 테스트 케이스를 도출한 셈이 된다. 테스트 케이스의 예를 들면, 조건의 조합 5의 테스트 케이스는 주말에 30매보다 작은 매수의 티켓을 쿠폰을 사용하지 않고 구매하는 경우가 된다.
인과 그래프를 작성한 후 결정 테이블을 도출할 수도 있지만, 인과 그래프를 작성하지 않고 바로 결정 테이블을 도출할 수도 있다. 결정 테이블을 작성하는 방법은 아래 절차를 따른다.
① 명세로부터 입력 조건(Cause)과 행위(Effect)를 식별한다.
② 입력 조건을 위에, 행위를 아래에 두는 결정 테이블을 그리고, 모든 입력 조건의 조합을 ‘Y', 'N'을 이용하여 나열하고, 각 입력 조건의 조합에 해당하는 행위를 표시한다.
③ 발생할 수 없는 입력 조건의 조합을 테이블에서 삭제한다. ④ 동일한 행위를 유발하는 조건의 조합을 찾아, 테스트 케이스
를 줄인다.
결정 테이블 작성 절차에 따라, 결정 테이블을 작성해보자.
우선, 명세로부터 입력 조건과 행위를 식별한다. 입력 조건은 아래와 같다.
• 30매이상 동시구매
• 쿠폰 사용
• 주중
• 주말
여기서, 결정 테이블을 더욱 간소화 하기 위해, 주중과 주말이라는 입력 조건은 항상 'E' 관계를 가지므로 하나로 표기할 수 있다. 즉, 주중이 1(True)이면 주말은 항상 0(False)이고, 주중이 0(False)이면 주말은 항상 1(True)이므로, 입력 조건을 '30매 이상 동시구매', '쿠폰 사용', '주중'으로 간소화할 수 있다. 하지만, 여기서는 결정 테이블의 작성법을 보다 자세히 설명하기 위해 간소화하지 않은 입력 조건을 예로 들어 설명하도록 한다.
발생 가능한 행위는 아래와 같다.
• 30% 할인
• 20% 할인
• 10% 할인
• 0% 할인
위에서 식별한 입력 조건과 행위를 이용하여 아래와 같이 결정 테이블을 작성한다.
조건의 조합 | ||||
1 | ... | N | ||
입력 조건 | 30매 이상 동시구매 | |||
쿠폰 사용 | ||||
주중 | ||||
주말 | ||||
행위 | 30% 할인 | |||
20% 할인 | ||||
10% 할인 | ||||
0% 할인 |
이제 각 입력 조건의 모든 가능한 조합을 나열하고, 해당하는 행위를 표시한다.
조건의 조합 | ||||||||||||||
1 | 2 | 3 | 4 | 5 | ... | 10 | 11 | 12 | 13 | 14 | 15 | 16 | ||
입력 조건 | 30매 이상 동시구매 | Y | Y | Y | Y | Y | N | N | N | N | N | N | N | |
쿠폰 사용 | Y | Y | Y | Y | N | Y | Y | Y | N | Y | N | N | ||
주중 | Y | Y | N | N | Y | Y | Y | N | Y | Y | N | N | ||
주말 | Y | N | Y | N | Y | Y | N | N | Y | N | Y | N | ||
행위 | 30% 할인 | X | X | X | X | X | ||||||||
20% 할인 | X | |||||||||||||
10% 할인 | X | X | ||||||||||||
0% 할인 | X | X |
위의 결정 테이블에서 불가능한 조합을 삭제한다. 입력 조건 중, 주중과 주말은항상 같은 값을 가질 수 없으므로 즉, 불가능한 조건의 조합이므로, (주중, 주말)이 (Y, Y)이거나 (N, N)인 조합을 아래와 같이 삭제한다.
불필요한 조합이 삭제된 결정 테이블은 아래와 같이 축소된다.
조건의 조합 | |||||||||
2 | 3 | 6 | 7 | 10 | 11 | 14 | 15 | ||
입력 조건 | 30매 이상 동시구매 | Y | Y | Y | Y | N | N | N | N |
쿠폰 사용 | Y | Y | N | N | Y | Y | N | N | |
주중 | Y | N | Y | N | Y | N | Y | N | |
주말 | N | Y | N | Y | N | Y | N | Y | |
행위 | 30% 할인 | X | X | X | X | ||||
20% 할인 | X | ||||||||
10% 할인 | X | X | |||||||
0% 할인 | X |
이제 동일한 행위를 유발하는 조건의 조합을 찾아 테스트 케이스를 줄인다. 동일한 행위인 30%의 할인율을 제공하는 조건 조합 2, 3, 6, 7번을 보면, 쿠폰 사용여부, 주중 및 주말과 상관없이 30% 할인이 가능함을 알 수 있다. 따라서, 조건 조합 2, 3, 6, 7번을 합쳐서 하나로 기술할 수 있다. 여기서는 3, 6, 7번을 삭제하도록하자. 동일한 행위인 10% 할인을 유발하는 조건 조합 11, 14번과 같이 하나로 기술할 수 없는 경우에는 그대로 둔다.
불가능한 조건의 조합을 제거하고, 동일하게 합쳐질 수 있는 테스트 케이스를 합친 결과, 최종적으로 수정된 결정 테이블은 아래와 같다. 아래의 결정 테이블에서는 조건의 조합 번호를 다시 매겼다.
조건의 조합 | ||||||
1 | 2 | 3 | 4 | 5 | ||
입력 조건 | 30매 이상 동시구매 | Y | N | N | N | N |
쿠폰 사용 | Y | Y | Y | N | N | |
주중 | Y | Y | N | Y | N | |
주말 | N | N | Y | N | Y | |
행위 | 30% 할인 | X | ||||
20% 할인 | X | |||||
10% 할인 | X | X | ||||
0% 할인 | X |
연습문제
1. 다음은 학점 부여 시스템에 대한 명세이다. 아래의 명세를 읽고 동등 분할 기법을 이용하여 테스트 케이스를 작성하시오.
"점수는 시험 점수와 과제 점수의 합산으로 정해지는데, 시험 점수는 65점 만점이고 과제점수는 35점 만점이다. 이 두 점수를 더한 총점으로 A부터 D까지 등급을 매긴다. 총점이70점 이상이면 A, 50점 이상 70점 미만이면 B, 30점 이상 50점 미만이면 C, 30점 미만이면 D를 준다. 만약 총점이 음수이거나 100보다 큰 수가 나오면 오류 메시지를 출력하며, 모든 입력값은 정수이다."
2(1)번 문제의 명세에서 n개의 입력 변수가 있다면 4n+1개의 테스트 케이스를 경계값 테스트 기법을 사용하여 작성하시오.
3 경계값 테스트를 사용하면 시험해야 할 테스트 케이스의 수가 많아진다. 위에서 도출한테스트 케이스를 줄일 수 있는 방안에 대해 설명하고, 수를 줄인 테스트 케이스를 작성하시오.
4(1)번 문제의 명세에 대해 (1×1) 도메인 테스트 기법을 이용하여 테스트 케이스를 작성하시오.
5 1×1 도메인 테스트가 검출하지 못하는 오류를 NX1 도메인 테스트 방법이 검출하는 예를보이시오.
6 어떤 프로그램이 입력인자 A, B, C, D를 각각 받아들이며, A는 A1, A2, A3 중의 한 값을,B는 B1, B2 중의 한 값을, C는 C1, C2 중의 한 값을, 마지막으로 D는 D1, D2, D3 중의 한값을 가진다고 한다. 이 때, 이 프로그램의 테스트 케이스를 Pairwise 테스트 기법을 이용하여 작성하시오.
입력인자 | ||||
A | B | C | D | |
입력 가능 값 | A1 | B1 | C1 | D1 |
A2 | B2 | C2 | D2 | |
A3 | - | - | D3 |
7. 다음은 Pairwise 테스트를 수행하여 얻은 테스트 케이스들을 보여준다. 만약, A1과 C2의 조합이 모순(예: A1이 Windows XP이고 C2가 Mac)인 경우에는 A1과 C2의 조합을 가지고 있는 테스트 케이스 2를 제거하여야 한다. Pairwise 테스트에서 테스트 케이스를 제거하는 절차를 자세하게 기술하시오.
테스트 ID | A | B | C |
1 | A1 | B1 | C1 |
2 | A1 | B2 | C2 |
3 | A2 | B1 | C3 |
4 | A2 | B2 | C1 |
5 | A3 | B1 | C3 |
6 | A3 | B2 | C1 |
7 | A3 | B1 | C2 |
8 | A2 | B1 | C2 |
9 | A1 | B2 | C3 |
8 다음은 간단한 전자시계에 대한 명세이다. 명세를 읽고 다음 물음에 답하시오.
"전자시계는 'display time', 'change time', 'display date' 및 'change date' 네 가지 모드를 가지고 있다. 'change mode' 버튼을 이용하여 'display time' 모드에서 'displaydate' 모드로 'display date' 모드에서 display time' 모드로 변경할 수 있다. displaytime' 모드에서 'change time' 모드로 또는 'display time' 모드에서 'change date' 모드로 변경하기 위해서는 'reset' 버튼을 사용한다. 또한, 'set' 버튼을 사용하여 'changetime' 모드에서 'display time' 모드로 또는 'change time' 모드에서 'display date' 모드로 변경한다."
가) 상태 전이도를 작성하시오.
나) 전이 트리를 작성하시오.
다) 정상적인 경우를 테스트하는 테스트 케이스를 작성하시오.
라) 비정상적인 경우를 테스트하는 테스트 케이스를 작성하시오.
9 다음 설명을 읽고 물음에 답하시오.
"어떤 회사에서는 사원들의 저축을 장려하기 위해 장기 저축에 대하여 보조금을 지급한다. 즉, 5년 이상 장기간 저축을 하면 이자 외에 총 저축 금액의 15%를 보조금으로 지급한다. 그러나 사원들이 저축할 수 있는 금액은 연봉과 근속 연수에 따라 차등을 둔다. 4000만원 미만의 연봉에 대해서 3년 미만의 근속자는 5%, 3년 이상 근속자는 7%까지만 저축을 허용한다. 연봉이 4000만원 이상인 경우에 3년 미만의 근속자는 6%, 3년 이상 근속자는 8%까지 저축을 허용한다.”
가) 인과 그래프를 작성하시오.
나) 결정 테이블을 작성하시오.
다) 테스트 케이스를 생성하시오.
10. 다음의 인과 그래프에 해당하는 결정 테이블을 작성하시오.
|