경계값 분석이 효과적인 테스팅 기법인 까닭? off by one error
off by one error
프로그램의 분기 등을 결정하는 논리적 조건문에서 조건이 값 1만큼의 차이로 서로 다른 행동을 하게 되는 결함
예로는 "작다"와 "작거나 같다"의 차이를 구별하지 못해 오는 실수로 인한 오류 검출을 경계값 분석이 돕는다
Loof
올바른 루프로,
for(i=0; i<10; i++){
/* body of loop*/
}
올바르지 않은 루프의 예시로는,
for(i=1; i<10; i++){
/* body of loop*/
}
for(i=0; i<=10; i++){
/* body of loop*/
}
for(i=0; i<11; i++){
/* body of loop*/
}
Fenceposts
대상들 사이에 경계가 몇 번이나 발생하는지를 셀 때 흔히 발생
1 |
2 |
3 |
4 |
위의 물건은 8개이지만, 경계는 5개이다
반복문과 조건을 올바르게 작성하여 경계가 8개 있다는 오류가 발생함을 유의
strncat
void foo(char *s){
char buf[15];
memset(buf, 0, sizeof(buf));
strncat(buf, s, sizeof(buf));//should be: sizeof(buf)-1
}
strncat 함수의 경우, 주어진 포인터로부터 버퍼로 문자열을 복사할 때 암묵적으로 문자열의 끝을 알리는 null 캐릭터를 함께 복사한다. 따라서 복사해야 되는 문자열의 길이는 버퍼의 크기에서 1을 빼주어야 한다.
이것은 심각한 보안 문제 발생할 수 있다.
Boundary Value analysis
Equivalence 파티션의 경계를 이루는 조건이 무엇인지 명확하게 판단하여 경계에 해당하는 값과 경계의 전후로 1만큼의 차이를 가지는 값을 고름 → off by one 효과적으로 검출
사용자의 나이를 입력으로 받는 시스템에 대한 경계값 분석
Equivalence 파티션 기법으로,
E1 = {0<= i <= 20} = {i < 0}
E2 = {20< i <= 70} = {i > 120}
E3 = {70 < i <= 120}
U1 = i < 0
U2 = i > 120
위와 같이 설정할 수 있다
그러므로 경계값 분석은,
경계의 조건에 해당하는 값과 그 값에 양쪽으로 1만큼의 차이가 나는 값을 선택해야 하므로 Test input을 {-1,0,1,19,20,21,69,70,71,119,120,121}로 구성한다