Test Case(TC)는 Test Input과 정답을 포함해서 사용된다.
소프트웨어 테스트 케이스를 생성하는 전략은 크게 소프트웨어의 내부 구조 참조 여부에 따라 두 가지로 나뉜다. 1) 블랙박스 테스팅과 2) 화이트박스 테스팅이다.
블랙박스 테스팅 (Black-Box Testing)은 프로그램의 내부 구조를 보지 않고 '블랙박스'로 간주하여 테스팅하는 기법이다. 내부를 살피지 않고 기능이 명세서(Specification)에 명시된 요구사항을 충족하는지를 중점적으로 보는 것이다. 이 방법을 사용하면 소스 코드가 완성되기 전, 소프트웨어 프로세스의 초기 단계부터 명세서를 바탕으로 테스트 계획을 시작할 수 있다는 장점이 있다.
이 때 동치 분할 (Equivalence Partitioning)이라는 개념이 사용되는데, Equivalence Partitioning이란, 입력 데이터와 출력 결과가 동일하게 취급되는 클래스(집합)들로 나뉜다는 원리를 이용하는 것을 말한다.
하나의 파티션(클래스) 내의 모든 입력에 대해 프로그램이 동일하게(동등하게) 동작한다고 가정하므로,각 클래스에서 모든 값을 테스트할 필요 없이 대표 테스트 케이스만 선택하여 테스트한다.
10,000~99,999 사이의 5자리 정수가 입력 조건이라면, 범위를 <0-9999>, <10000-99999>, <100000 이상>으로 분할하고 각 경계값인 00000, 09999, 10000, 99999, 100000을 추출하여 테스트하는 것을 예로 들 수 있다.
블랙박스 테스팅과는 상반된 방식으로, 구조적 테스팅(Structural testing)이라고도 불리며 모듈 내부의 실제 소스 코드를 들여다보고 프로그램 구조에 따라 테스트 케이스를 도출한다. 이 방식은 프로그램에 대한 지식을 바탕으로 추가적인 테스트 케이스를 식별해 낸다.
화이트박스 테스팅의 목표는 프로그램의 모든 구문, 조건, 의사결정들을 한 번 이상 실행해보는 것이다. 단, 무한할 수 있는 모든 경로의 조합을 실행하는 것은 아니다.

화이트박스 테스팅의 예시로는 이진 탐색이 있다. Java 소스 코드를 분석하여 while 문과 if 조건문들을 거치는 4가지의 독립적인 경로(Independent paths: 1-2-8-9, 1-2-3-8-9 등)를 도출하고, 이를 Program Flow Graph로 모델링하여 검증한다.
명세 기반 테스팅은 블랙박스 테스팅 또는 기능 테스팅(Functional testing)이라고도 불린다.
명세 기반 테스팅의 가장 큰 장점은 프로그램 내부의 구현(Implementation) 방식이 변경되더라도 명세가 바뀌지 않는 한 테스트 케이스는 변경되지 않으며, 프로그램 구현과 동시에 테스트 케이스를 병행하여 개발할 수 있다는 것이다.
명세(Specification)와 프로그램, 테스트 케이스의 관계 (벤 다이어그램 시각화) 실제 개발 환경에서 명세(S)와 개발된 프로그램(P)은 완벽히 일치하지 않는다.
위의 그림에서 Scope 1이 명세서에서 기대되고(Expected), 프로그램에 올바르게 구현되었으며(Programmed), 성공적으로 테스트된(Tested) 이상적인 영역이고, Scope 2와 5는 명세서에서 요구하여 기대되지만(Expected), 아직 테스트되지 않은 영역이며 Scope 6은 명세서에 없는데 개발자가 임의로 구현했으며(Programmed, not expected), 테스트되지도 않은 잠재적 결함 영역이다.
IEEE 표준 소프트웨어 결함 분류 (IEEE Std. Fault Types - 1993) 소프트웨어에서 발생하는 이상 징후는 다음과 같이 5가지로 분류된다.
입력이나 출력 도메인의 변수 영역 끝부분(경계)에서 오류가 가장 많이 발생한다는 것을 바탕으로하는 테스팅 기법이다.
예외를 제외하고 유효한 입력의 경계값만을 독립적으로 다룬다. <최솟값, 최솟값+1, 정상값, 최댓값-1, 최댓값> 5가지 포인트를 중심으로 테스트를 수행한다.
Normal 테스팅의 확장판으로 예외 처리 상황까지 중심으로 테스팅한다. Normal Boundary Value Testing의 포인트를 중심으로 범위를 벗어나는 <최솟값-1, 최댓값+1>을 추가하여 총 7가지 포인트를 확인합니다 (예: 엘리베이터의 하중 초과 시 동작 테스트)
변수들이 서로 독립적이지 않고 변수들 간의 의존성을 고려하여 모든 경계값들의 최악의 조합을 산출하는 방식이다. (Robust worst-case 방식도 존재)
중복된 테스트를 피하면서도(avoid redundancy) 완벽하게 테스트했다는 확신을 얻기 위해 사용하는 테스팅 방법으로, 동치 클래스는 교집합이 없어야 하며, 합치면 전체 도메인이 되어야 한다. 또한 입력 값들은 동일 기능을 수행하기 때문에 대표값만 테스트해도 된다.
Testing 방법에 따라 아래 3가지 방법으로 나눌 수 있다.
유효한 값(Valid) 영역과 유효하지 않은 값(Invalid) 영역을 단순히 나누어 각각에서 값을 추출한다.
오직 유효한 정상 케이스(Normal cases) 에만 집중한다. 입력 변수들이 완전히 독립적이면 Weak, 서로 연관성/의존성이 있으면 조합을 고려하는 Strong 방식을 쓴다.
유효한 입력과 유효하지 않은 예외 입력을 모두 고려(Consider both) 하는 가장 강력한 방식이다. 독립 여부에 따라 Weak와 Strong으로 구분한다.
1960년대부터 복잡한 논리 관계를 표현하고 분석하는 데 쓰인 기법이다. 프로그램의 action을 수행하기 위한 다양한 조건(c1, c2, c3...)의 참/거짓 논리 조합을 표 형태로 그리고, 각 수행 조건(규칙)별로 빠짐없이 Test Case를 생성한다.
동일한 문제(Triangle, NextDate 등)를 각 기법으로 테스트할 때 도출되는 테스트 케이스의 개수를 비교해 보면, 모든 예외와 변수 의존성을 조합하는 Robust Worst-case (rob. wc) 방식이 압도적으로 가장 많은 테스트 케이스를 요구합니다
테스트 기법 선택 기준은 1) 변수가 물리적(아날로그)인지 논리적인지, 2) 변수 간 의존성이 있는지, 3) 단일 결함인지 다중 결함 가정이 필요한지, 4) 예외 처리를 고려해야 하는지 여부에 따라 적절한 기법(a1~a8)을 선택해야 한다.
수업 자료에서는 이론을 실제화하기 위해 4가지 구체적인 예제를 다룹니다.
조건
보험료(Premium) = 기본료 * 나이 가중치(ageMultiplier) - 안전운전 할인(safeDrivingReduction). 나이별로 가중치가 다르고(16세~100세), 벌점(Point)이 커트오프 점수 아래일 때만 할인이 주어진다.

|
--|--|
나이와 벌점이라는 두 변수의 경계값(Min, Max) 및 유효/비유효 구간을 나누어 도식화한 후, 벌점 커트오프 영역을 고려한 'Worst-Case Testing'과 유효/비유효 구간의 대표값을 뽑아내는 'Weak Robust Equivalence Class' 테스트 케이스 도출 과정을 보여준다.
"Input을 구성해야한다. 환자 상태, 약품, 경고 무시 여부를 나누고 이를 warning 메세지 여부로 출력한다. 그리고 이 모든 조합을 분석해서 TC를 만든다"
요구사항
환자가 특정 약품에 알레르기가 있다면 처방 시 시스템이 경고 메시지를 띄워야 합니다. 의사가 경고를 무시하려면 반드시 무시하는 이유를 입력해야 한다.
이때 입력 조건과 출력 조건은 다음과 같다.
입력 조건: 알레르기 유무(None, One, Two), 처방 약품(Normal, 1개 알레르기, 다중 알레르기), 경고 무시 여부(No, Yes)
출력: Warning Message 여부.

이에 따라 나올 수 있는 모든 조합을 분석하여, 정상 처방 시 메시지가 안 뜨는 TC#1부터, 2가지 알레르기가 있는데 이를 모두 무시하고 처방하여 두 가지 사유를 입력받아야 하는 TC#13까지 총 13개의 구체적인 테스트 케이스를 도출해 낸다.
.
문제 정의
세 정수 a,b,c를 입력으로 받으며 아래의 조건을 만족해야한다.
• a = b = c 이면, 정삼각형 출력
• a, b, c 중 한 쌍만 같을 때, 이등변삼각형 출력
• 한 쌍도 같지 않을 때, 삼각형 출력
• 두 변의 합이 한 변의 길이보다 작으면, “삼각형 아님”

입력 도메인과 출력 도메인은 위와같이 분류할 수 있다.
문제 정의
세 정수 a,b,c의 길이를 입력으로 받으며 아래의 조건을 만족해야한다.
• C1: 1 <= a <= 200, C2: 1<= b <= 200, C3: 1<= c <= 200
• C4: a < b + c, C5: b < a + c, C6: c < a + b

또한 출력은 다음과 같이 정의한다.
• a = b = c이면, 정삼각형 출력
• a, b, c 중 한 쌍만 같을 때, 이등변삼각형 출력
• 한 쌍도 같지 않을 때, 삼각형 출력
• C4, C5, C6가 만족되지 않으면, “삼각형 아님” 출력

출력값 기준의 Weak Normal Equivalence Class, Strong Robust Equivalence Class를 작성하고, 입력값 변수 기준의 Weak Robust Equivalence Class 테스트 케이스를 뽑아내는 훈련을 제시한다.
문제 정의
년(18122012), 월(112), 일(1~31)의 세 정수를 입력받아 바로 다음 날짜를 출력하는 함수입니다
테스트 케이스 설계
Weak Robust 기법을 위해 년/월/일의 단순 유효 범위를 M1, D1, Y1으로 나눕니다

Strong Normal 기법을 위해 월(30일인 달, 31일인 달, 2월), 일(128일, 29일, 30일, 31일), 년도(비윤년, 윤년, 세기말 평년 등)를 매우 세부적인 조건(M1M3, D1D4, Y1Y3)으로 치밀하게 클래스를 분할하여 테스트 케이스를 설계하는 전략을 보여줍니다