반응형

블랙박스 테스트(Blackbox Test)

블랙박스 테스트는 아래 그림과 같이 외부에서 봤을 때 소프트웨어의 논리 구조가 보이지 않는 상태로 진행하는 테스트를 의미한다.

따라서 요구사항 명세서나 설계서를 기반하여 테스트 케이스를 작성하고 테스트를 수행하여 구현하고자 한 기능이 잘 구현되었는지 확인하는 테스트이다. 이러한 이유로 기능 테스트라고 불리기도 한다.

블랙박스 테스트는 단위 테스트, 통합 테스트, 시스템 테스트, 인수 테스트 전 과정에 걸쳐 사용될 수 있으며 프로그램 내부 구조를 아는 개발자보다 오히려 코드 내부 구조를 전혀 모르는 테스터가 진행하는 것이 더 좋다.

https://catsbi.oopy.io/7c084479-c9d0-44a1-acb9-f6b43a19e332

 

블랙박스 테스트를 수행했을 때의 이점은 다음과 같다.

  1. 테스트 케이스를 설계할 때 프로그램 코드가 없어도 되기 때문에 규모가 큰 단위에도 효과적으로 적용할 수 있다.
  2. 테스터가 구현에 관한 전문적인 지식이 없어도 테스트를 수행할 수 있다.
  3. 사용자 관점에서 테스트를 수행하기 때문에 효과적으로 오류를 검출할 수 있다.
  4. 명세 오류(일관성 결여 혹은 애매모호한 명세)를 찾아낼 수 있다.
  5. 모든 코드가 구현될 때까지 기다릴 필요가 없다.

 

지금까지 블랙박스 테스트가 무엇인지, 이점이 무엇인지에 대해 이해하여 보았다.

다음으로, 블랙박스 테스트를 진행하는 기법들에 대해 알아보자.

 

동등 분할 기법

동등 분할 기법은 블랙박스 테스트의 대표적인 방법으로써, 입력 영역을 동등 클래스(equivalence class)로 분할한 후, 각 클래스로부터 하나 또는 그 이상의 대표값을 선택하여 테스트 케이스로 이용하면 된다.

어떤 값이 있다면, 유효 범위 내의 값(valid value)과 유효 범위 밖의 값(invalid value)로 나눌 수 있다.

이때, 유효 범위 내의 입력 영역과 유효 범위 밖의 입력 영역을 동등 클래스라고 한다,

가령, 18~60세 사이의 숫자를 나이로 입력받는다고 가정하자. 이때, 유효 범위는 18~60까지의 수치형 데이터일 것이다.

따라서 위의 예시를 동등 클래스로 분할하면 다음과 같이 분할할 수 있다.

invalid valid invalid
< 18(age<=17) 18-60(18 <= age <= 60) > 60(age>=61)

 

이때, 각 동등 클래스의 대표값을 하나 또는 그 이상을 선택해서 테스트 케이스로 작성한 후, 테스트를 수행하면 된다.

 

경계값 분석 기법

여러 테스트 경험에 따르면 입력 영역 중 경계값에서 오류 발생 확률이 높다는 보고가 있다.

따라서, 동등 클래스에서 각 클래스 간의 경계가 되는 값을 경계값으로 두고 해당 값보다 하나 작은 값, 경계값, 경계값보다 하나 큰 값을 포함하여 테스트 입력으로 선택하면 된다.

가령, 동등 분할 기법의 예시에서 18~60세 사이의 나이를 입력받는다면 경계값은 각각 18과 60이라고 할 수 있다.

이때 테스트 입력으로는 17, 18, 19, 59, 60, 61을 포함하여 테스트 데이터로 선정하면 된다.

 

원인과 결과 그래프 기법(+ 결정 테이블)

원인과 결과 그래프(cause-effect graph)는 명세를 논리 표기법으로 도식화하여 명세의 불완전성과 모호성을 찾아내기 쉬운 장점이 있다. 원인과 결과 그래프를 완성하면 이를 이용하여 입력 조건에 따른 프로그램의 행위를 기술하고 이를 결정 테이블(decision table)을 만든다. 그리고 결정 테이블을 이용하여 테스트 케이스를 만들 수 있다.

원인과 결과 그래프 기법에서 우선 구해야 하는 것은 해당 기법의 이름대로 원인(cause, condition)과 결과(effect, action)를 찾아서 나열해야 한다. 이때, 원인은 입력값 또는 사전 조건을 의미하며 결과에 영향을 미치는 요인을 뜻한다. 그리고 결과는 결과값 또는 사후 조건을 의미하며, 하나 이상의 원인으로 인해 야기되는 결과를 뜻한다.

 

원인과 결과를 나열한 후, 각 관계를 파악하여 아래와 같이 표기할 수 있다.

https://grapevine9700.tistory.com/389

위 연산은 IDENTITY 연산으로, 원인이 참이면 결과도 참이고 원인이 거짓이면 결과도 거짓임을 의미한다.

 

https://grapevine9700.tistory.com/389

위 연산은 AND 연산으로 ^로 나타내며, 원인1과 원인2가 모두 참인 경우에만 결과가 참이고 원인이 하나라도 거짓인 경우 결과도 거짓임을 의미한다.

 

https://grapevine9700.tistory.com/389

위 연산은 OR 연산으로 V로 나타내며, 원인1 또는 원인2 중에서 하나라도 참이면 결과가 참이고 모두 거짓인 경우에만 결과가 거짓임을 의미한다.

 

https://grapevine9700.tistory.com/389

위 연산은 NOT 연산으로 ~로 나타내며, 원인1이 참인 경우 결과는 거짓이되고 원인1이 거짓인 경우 결과는 참이 된다는 것을 의미한다.

 

https://grapevine9700.tistory.com/389

만약, 여러 원인이 하나로 결합할 수 있다면 중간 노드를 원인과 결과사이에 아래와 같이 추가할 수 있다.

 

위 방식을 이용한 예제를 한번 풀어보자. 해당 예제는 '쉽게 배우는 소프트웨어 공학(김치수)'의 p.384 예제이다.

- 문제

  • 첫 번째 열이 P 또는 S로 시작하고, 두 번째 열이 #이면 '출입 가능'을 출력한다.
  • 첫 번째 열이 P 또는 S로 시작하지 않으면 '출입 금지'를 출력한다.
  • 첫 번째 열이 P 또는 S로 시작하고, 두 번째 열이 #이 아니면 '비밀번호 오류'를 출력한다.
  • P는 교수(Professor), S는 학생(Student)을 의미한다.

 

먼저, 문제에서 원인과 결과를 찾아서 나열해보자.

원인 결과
원인 1. 첫 번째 열이 P
원인 2. 첫 번째 열이 S
원인 3. 두 번째 열이 #
결과 1. '출입 가능' 출력
결과 2. '출입 금지' 출력
결과 3. '비밀번호 오류' 출력

 

원인은 주어진 문제에서 입력에 해당하는 부분으로 P, S, # 으로 나타낼 수 있다. 또한 결과는 문제에서 문장의 마무리 동사부분에 '출력한다'의 바로 앞 부분을 읽으면 쉽게 추출할 수 있다.

 

다음으로, 원인과 결과 간의 관계를 고려하여 원인과 결과 그래프를 작성하자.

먼저, 원인 1, 원인 2의 경우 입력하는 열이 동일하므로 중간 노드를 활용하여 결합해준다.

 

다음으로 문제의 결과 조건을 하나씩 읽으면서 관계를 그려주면 된다.

 

이제 위 그래프를 보고 결정 테이블로 변환하면 된다.

  1 2 3 4 5
원인1 (P) 0 0 0 1 0
원인2 (S) 1 0 0 0 1
원인3 (#) 1 1 x 0 0
출입 가능 1 1      
출입 금지     1    
비밀번호 오류       1 1