✅ 화이트 박스 테스트 기법이란?

✔︎ 화이트 박스 테스팅은 테스트 대상의 내부 구조를 기반으로 한다.
모든 테스트 레벨에서 적용가능하나 실라버스에서 언급하고 있는 두 가지 코드 관련 기법(구문, 결정 테스팅)은 단위 테스트 레벨에서 가장 일반적으로 사용된다.
높은 안전성, 무결성 환경에서 더 높은 커버리지를 달성을 위해 다른 기법들이 있지만 그러한 기법은 심화이기때문에 따로 포스팅해서 다룰 예정이다.

1. 블랙박스테스팅과 화이트박스테스팅의 공통점과 차이점

공통점 : 효율적인 다이나믹 테스팅을 진행

차이점: 테스트 베이시스가 다름 (화이트: 구조 산출물, 블박 : 명세서, 경험기반: 테스터의 경험)

2. 블랙박스 테스트 기법

블랙박스테스트 :
동등분할,
경계값 분석,
결정 테이블 테스팅(일반평문언어로 된 요구사항명세서에서 원인, 결과를 찾아 원인의 조합을통해 테스트케이스 도출) ,
상태 전이 테스팅(상태,전이,이벤트),
유즈 케이스(기본경로,예외경로테스팅)을 적용해서 테스트케이스를 도출한다.


✔︎ 제어 흐름 테스팅(Control flow testing)

  • 프로그램 코드 상의 수행경로를 정의하고 그 경로를 cover하는 테스트케이스 개발/수행
  • 소스 프로그램의 제어 흐름을 사용하는 구조적 테스팅 전략의 하나이며, 단위 테스팅에 적용하기에 적합함

✅ 4.3.1 구문 테스팅과 커버리지 (Statement Testing and Coverage)

  • 구문 테스팅은 코드의 잠재적으로 실행 가능한 구문을 실행한다.
  • 커버리지는 일반적으로 백분율로 표기한다.
  • 구문 커버리지 : 테스트로 실행한 구문의 수 / 테스트 대상의 모든 실행 가능한 구문의 수
void test (int x) {
    system.out("첫번째 줄"); // 1번
    if (x > 0) { // 2번
        system.out("두번째 줄"); // 3번
    }
    system.out("마지막 줄"); // 4번
}

위 함수에 매개값을 음수 "-1"을 주게 되면 3번째 구문이 실행되지 않는다. 고로 구문 커버리지는 75%이다.

String test(String text){
   String result;	//1번
   if(text == "아연이"){	//2번
     result = "success";	//3번
     log.info(result); 	//4번
   }else{		
     result = "fail";	//5번
     log.info(result);  //6번
   }
    return result;	//7번
 }

위 함수에 매개값으로 "아연이"를 매개값으로 주게 되면 실행되는 구문은 1,2,3,4,7번.
5,6번은 else문으로 실행되지 않으므로 구문 커버리지 계산은 5/7 즉 71%가 된다.

구문 커버리지 계산은 테스트 중에 실제로 어떤 라인들이 실행되었는지를 기반으로 하므로, 실제로 코드 커버리지를 측정하는 도구를 사용하여 확인하는 것이 가장 정확하다.

✅ 4.3.2 결정 테스팅과 커버리지 (Decision Testing and Coverage)

  • 결정 테스팅은 코드에 존재하는 결정문을 실행하고 결정문의 결과(참과거짓)에 따라 실행되는 코드를 테스트한다.
  • 이것을 달성하기 위해 테스트 케이스는 결정문에서 시작되는 제어 흐름을 따라 실행된다.
  • 커버리지 = 테스트로 실행된 결정문 결과의 수/ 테스트 대상의 가능한 모든 결정문 결과의 수
  • 브랜치 = 분기 = 흐름

※ 구문과 결정커버리지의 차이점
결정 커버리지가 구문 커버리지보다 강도가 있음
구문커버리지는 결정을 고려하지 않는다. 실행구문들만 테스트를 하는 것.

func getGrade(int score) {
    String grade = ""
    
    if score >= 90 {
        grade = "A"
    } else if score >= 80 {
        grade = "B"
    } else if score >= 70 {
        grade = "C"
    } else {
        grade = "F"
    }
    
    return grade
}

// 테스트 케이스
print(getGrade(score: 95)) // 테스트 케이스 1: A 학점
print(getGrade(score: 85)) // 테스트 케이스 2: B 학점
print(getGrade(score: 75)) // 테스트 케이스 3: C 학점
print(getGrade(score: 60)) // 테스트 케이스 4: F 학점

reference : https://ios-development.tistory.com/1387

4가지 모든 분기를 커버하고 있으므로 브랜치 커버리지 100%이다.
(결정 테스팅과 브랜치 테스팅은 의미가 조금 다르다.)

✅ 4.3.3 구문 및 결정 테스팅의 가치

  • 100% 구문 커버리지 달성 = 코드에 존재하는 모든 실행 가능한 구문을 최소한 한 번씩은 테스트했다. 그러나 모든 결정 로직을 테스트했다는 것을 보장하지는 않는다.

  • 구문 테스팅은 결정 테스팅보다 커버리지가 낮다.

  • 100% 결정 커버리지 달성 = 명확한 거짓 구문이 명시되지않은 경우(if문에 else문이 없는 경우)에도 결과가 참, 거짓 경우를 포함한 모든 결정 결과가 실행되었다.

  • 구문 커버리지 = 다른 테스트에 의해 실행되지 않은 코드의 결함을 찾는 데 도움.

  • 결정 커버리지 = 다른 테스트가 참과 거짓 결과 모두를 테스트하지 않은 코드의 결함을 찾는 데 도움.

  • 100% 결정 커버리지는 100% 구문 커버리지를 보장. 반대는 성립하지 않음.


✔︎ 마치며

화이트박스 테스팅에는 제어 흐름 테스팅과 기본 경로 테스팅이 있다.
실라버스에는 제어 흐름 테스팅만 다루고 있고 기본 경로 테스팅은 강의시간에 강사님이 설명해주신 적이 있다. 기본 경로 테스팅은 복잡도 계산하는 방법이며 집중해서 들었지만, 사실 어렵다. 이번 ISTQB 시험이 끝나면 제어 흐름 테스팅의 심화부분과 기본 경로 테스팅에 대해서 다시 공부해서 관련 포스팅 올리겠다.

profile
쓸때 대충 쓰지 말고! 공부하면서 써!

0개의 댓글