소프트웨어의 테스트 기법들 (정적, 동적 테스트와 원인 결과 그래프)

 

 

테스트는 예상된 결과와 실제 결과가 어떤 차이를 보이는지 검사하고 평가하는 작업이다.

하지만 테스트는 결함이 있음을 보여줄 뿐, 결함이 없음을 증명할 수는 없기 때문에 주의해야 한다.

 

작은 의미로는 소스코드에 남아있는 오류를 발견하는 것으로 볼 수 있지만

크게 보면 개발자와 고객에게 사용하기에 충분한 소프트웨어임을 보여주는 것으로,  개발된 소프트웨어의 신뢰성을 높여주기 위한 작업이라고 볼 수 있다.

 

 

 

 

 

테스트 절차

 

우선, 테스트를 계획하기 위해서 목표를 정의하고, 테스트 대상 및 범위를 결정하며, 테스트 계획서를 작성하고 검토한다.

 

이제 작성한 계획서를 바탕으로 현재 문제에 적절한 테스트 설계 기법을 선정하고, 도출된 테스트 케이스에 입력 값으로 사용 할 원시 데이터를 작성한다. 이 과정에서 테스트 케이스 명세서, 설계서, 절차서를 작성한다.

 

테스트 환경을 구축해서 테스트를 실시하고, 테스트 실행 결과를 문서에 기록한다.

 

테스트가 끝나면 계획 대비 결과를 비교·분석하고 테스트 결과에 대한 보고서를 작성한다.

 

마지막으로 테스트 결과 어디에서, 어떤 종류의 오류가 발생했는지 확인하고 수정한다.

 

 

 

기본적인 테스트 절차는 이런 흐름으로 이루어진다.

이 과정에서 프로그램의 실행 여부에 따라 정적 테스트와 동적 테스트로 구분된다.

 

 

 

 

 

정적 테스트

프로그램을 실행하지 않은 채로 코드만 놓고 검토해서 결함을 찾는 것을 말한다.

개별검토

체크리스트를 가지고 본인이 개발한 코드와 산출물 등을 검토한다.

가장 간단하지만 본인 스스로 검토하기 때문에 객관성이 떨어진다.

 

 

동료검토

이 역시 개별검토와 마찬가지로 정해진 형식이 없는 비공식 검토이다. 다른 점은 동료에게 물어본다는 것이다.

 

동적 테스트에서 발견하기 어려운 것 (산출물에서 발생할 수 있는 누락과 같은 결함)을 조기에 발견할 수 있는 이점이 있다.

 

 

검토 회의

개발자가 직접 전문가를 소집해서 작업을 검토하고 평가한다.

주의해야 할 점은, 이들은 문제점을 찾는 데 주안점을 두지 문제를 해결하지 않는다.

 

 

소프트웨어 검사 - 공식검토

원시 코드뿐 아니라 각 단계 산출물의 문서 등을 포함하여 분석하고 품질을 평가한다.

소프트웨어 품질 보증 기법으로 유용하다.

 

 

 

 

 

 

동적 테스트

 

동적 테스트란, 테스트 데이터를 이용해 실제 프로그램을 실행함으로써 오류를 찾는다.

동적 테스트는 명세 기반 테스트와 구현 기반 테스트로, 정보를 얻는 문서 종류에 따라 분류할 수 있다.

 

 

 

명세 기반 테스트(블랙박스 테스트)

프로그램에 명세된 데이터를 기반으로, 프로그램의 내부 구조나 알고리즘과 같은 코드를 보지 않고 수행하는 테스트를 말한다.

 

 

신택스syntax 기법

가장 단순한 방법으로, 문법에 기반을 둔 테스트다.

문법을 정해놓고 적합/부적합 입력 값에 따른 예상 결과가 제대로 나오는지 테스트한다.

 

 

동등 분할equivalence partitioning기법

입력 값에 대한 예상 결과 값을 미리 정해 놓고, 각 영역에서 임의 값을 하나 정해 입력 값으로 사용하여 실제 결과가 예상 값과 같은지 확인한다.

이 표에서 각 등급마다 하나씩 케이스를 부여한다.

 

 

경계 값 분석(boundary value analysis)기법

동등 분할처럼 딱딱 구간을 나누는 것이 아니라 경계에 있는 값을 테스트한다.

(이상, 이하, 미만, 초과까지 체크)

 

간단하게 경계 값과 경계 이전 값, 경계 이후 값을 가지고 테스트한다.

 

 

 

 

위 기법들의 단점은 입력 환경의 복합성을 완전하게 고려하지 못한다는 것이다. 단순히 구역을 나누는 것으로는 한계가 있다.

이를 극복하고자 새로운 기법이 있다.

 

 

원인-결과 그래프기법

여러 입력 조건을 결합해서 결과를 하나 이상 얻는 것으로 위 단점을 극복할 수 있는 기법이다.

원인에 해당하는 입력 조건과 그 원인으로부터 발생하는 출력 결과를 가지고 그래프를 만든다.

이 그래프를 기초로 의사결정 테이블을 만들고, 이를 기반으로 테스트 케이스 데이터를 작성한다.

 

 

 

그래프를 그리기 위해선

가장먼저, 규모가 큰 프로그램을 적합한 크기로 분할한다.

그 다음으로 요구분석명세서, 설계서, 프로그램에서에서 원인과 결과를 찾아 그래프를 작성한다.

 

원인-결과 그래프를 작성하기 전 알아야 하는 기호가 있다.

여기서 원인은 하나의 입력 조건이고, 결과는 출력 조건이다

 

 

그래프에 제한 조건을 표시할 수 있는 기호도 있다.

 

 

이렇게 만든 원인-결과 그래프를 바탕으로 의사결정 테이블로 변환한다.

 

 

그래프 예시

 

 

 

 

구현 기반 테스트(화이트박스 테스트)

지금까지 코드를 보지 않고 명세된 사항만으로 테스트를 진행했다.

반대로, 화이트박스 테스트는 코드를 기반으로 테스트를 진행한다.

 

 

하지만, 가능한 경로를 모두 테스트할 수 없기 때문에 프로그램의 일부 경로만 정해서 테스트해야 한다.

여기서 어떤 경로를 테스트 대상으로 선정할지 기준을 선정한다.

선정된 기준을 만족하는 입력 데이터를 만들고 테스트를 실행한다.

 

 

화이트 박스 테스트를 하는 방법은 여러 가지가 있다.

각각의 방법 별로 복잡도와 소요 시간이 다르므로 테스트의 목적과 조건에 맞는 방법을 선택하자.

 

 

문장 검증 기준statement coverage

프로그램 내의 모든 문장이 최소한 한 번은 실행될 수 있는 테스트 데이터를 갖는 테스트 케이스를 선정하는 기준이다.

 

원시 코드를 제어 흐름 그래프로 표현해서 가능한 모든 경로를 구한다.

이 중, 모든 문장 검증 기준을 만족하는 경로를 선택해서 입력 데이터로 넣고 테스트를 실행한다.

 

하지만 각각의 조건문 and와 or에서 오류가 발생해도 발견하지 못할 수 있는 문제가 있다.

이러한 문제를 해결할 수 있는 방법으로 분기 검증 기준이 있다.

 

 

 

분기 검증 기준(branch coverage)

조건문에 대해 T, F가 최소한 한 번은 실행되는 입력 데이터를 테스트 케이스로 사용한다.

분기 시점 또는 합류 위치에서 조건과 관련된 오류를 발견할 가능성이 높다.

 

문장 검증 기준과 같이, 모든 경로를 구한 상태에서 분기 검증 기준을 만족하는 경로를 선택한다.

 

하지만 조건문만 고려하기 때문에 개별 조건식에 존재하는 오류를 발견하지 못하는 경우가 있다.

이런 문제는 조건 검증 기준을 통해 극복할 수 있다.

 

 

 

조건 검증 기준

두 개의 개별 조건식이 존재할 때 개별 조건식의 T와 F를 최소한 한 번은 테스트할 수 있 도록 테스트 케이스 선정한다.

분기 검증 기준에서 발견하지 못한 오류(개별 조건식에 존재하는 오류)를 발견할 수 있는 더 강력한 테스트이다.

 

앞서 만든 경로 그래프에서, (가) 조건의 개별 조건식을 만족하는 테스트 케이스를 구한다.

  • (가) : (X>1) = T and (Y=0) = T
  • (가) : (X>1) = T and (Y=0) = F
  • (가) : (X>1) = F and (Y=0) = T
  • (가) : (X>1) = F and (Y=0) = F

 

같은 방식으로 (다) 개별 조건식 또한 구하고 모든 경로를 테스트한다.

 

 

 

분기/조건 검증 기준branch/condition coverage

개별 조건식을 모두 만족하면서 전체 조건식도 만족하는 테스트 케이스이다.

 

위 예시와 같이 어떤 개별 조건식이 다른 개별 조건식의 결과와 상관없이 이미 결정되어지는 것으로, 이런 경우를 마스크라고 한다.

 

 

 

다중 조건 검증 기준 multiple condition coverage

마스크 문제까지 해결한 테스트 케이스에 해당하는 테스트 데이터를 생성하는 기준이다.

 

and로 연결된 개별 조건식에서의 마스크 문제 해결 방법

[문제] 두 식 중 하나가 F인 경우 나머지 식이 F이든 T이든 상관없이 결과가 F라는 것

[해결 방법] 나머지 식에서 T와 F인 경우를 각각 하나씩 추가하여 테스트 케이스 선정

 

 

or로 연결된 개별 조건식에서의 마스크 문제 해결 방법

[문제] 두 식 중 하나가 T인 경우 나머지 식은 F이든 T이든 상관없이 결과가 T라는 것

[해결 방법] 나머지 식에서 T인 경우와 F인 경우를 하나씩 추가하여 테스트 케이스 선정

 

 

 

기본 경로 테스트 basic path test

원시 코드의 독립적인 경로가 최소한 한 번은 실행되는 테스트 케이스를 찾아서 테스트한다.

이 테스트의 목적은 원시코드의 독립적인 경로를 모두 수행하는 것이다.

 

 

우선, 문장statement, 조건문if then else, 반복문for과 같은 3가지의 기본 구조로 순서도를 작성한다.

 

 

다음으로 순서 구조, 선택 구조와 같은 표기법을 사용하여 원시 코드 흐름 그래프를 표현한다.

 

아래는 위 흐름 그래프에서 표현된 표기법이다.

 

 

흐름 그래프를 그린 다음, 원시 코드가 얼마나 복잡한지를 알아보기 위해 순환 복잡도를 계산한다.

얼마나 많은 논리적인 경로를 가지고 있는지 계산한 값을 말한다.

 

 

위 예시에서 순환 복잡도는 3이므로 독립적인 경로는 3개가 나온다.

각각의 경로를 정의하고 테스트 케이스를 작성한다.