Scenario Testing vs Use Case Testing

Scenario Testing vs. Use Case Testing Scenario Testing과 Use Case Testing은 소프트웨어 테스팅 기법으로, 사용자 관점에서 시스템의 기능과 동작을 검증하는 데 사용된다. 두 기법은 유사한 점이 있지만, 접근 방식과 세부 사항에서 차이가 있다. 비교 항목 Scenario Testing Use Case Testing 정의 실제 사용자의 행동과 상황을 기반으로 한 현실적인 시나리오를 통해 시스템을 테스트하는 방법 사용자와 시스템 간의 상호작용을 구조화된 형식으로 정의하고 테스트하는 방법 테스트 관점 사용자 중심적이며, 실제 업무 상황과 맥락을 중요시함 시스템 중심적이며, 기능적 정확성과 완전성을 중요시함 목적 실제 사용 환경에서의 시스템 동작을 검증 시스템의 기능적 요구사항을 검증 구조화 정도 자유로운 형식으로, 스토리텔링 방식의 서술적 구조 체계적이고 형식적인 구조 (기본 흐름, 대체 흐름, 예외 흐름) 테스트 범위 여러 기능이나 프로세스를 걸쳐 있는 end-to-end 시나리오 주로 단일 기능이나 프로세스에 초점 테스트 설계 자유로운 형식으로 다양한 “가정” 상황을 포함 유스케이스 문서의 기본 흐름과 대체 흐름을 따름 테스트 케이스 도출 다양한 소스(사용자 피드백, 시장 조사 등)에서 시나리오 개발 유스케이스 문서에서 직접 테스트 케이스를 도출 상황 맥락 사용자의 동기, 감정, 환경 등 풍부한 맥락 정보 포함 객관적이고 기술적인 상호작용 위주의 맥락 문서화 방식 서술적이고 이야기 형식의 문서화 구조화되고 단계별로 정형화된 문서화 적합한 상황 사용자 경험이 중요한 애플리케이션, 복잡한 업무 프로세스 명확한 기능 요구사항이 있는 시스템, 트랜잭션 기반 애플리케이션 테스트 설계 난이도 실제 사용자 경험에 대한 이해가 필요하며, 창의적인 시나리오 도출이 중요 체계적인 분석과 문서화 능력이 필요하며, 기술적 이해가 중요 유지보수성 시나리오 수정이 비교적 자유롭고 유연함 구조화된 형식으로 인해 변경 관리가 체계적 재사용성 특정 상황에 특화된 시나리오로 재사용이 제한적 표준화된 형식으로 인해 재사용이 용이 커버리지 측정 시나리오 기반의 정성적 측정이 주로 이루어짐 흐름 기반의 정량적 측정이 가능 테스트 자동화 복잡한 시나리오로 인해 자동화가 어려울 수 있음 구조화된 형식으로 인해 자동화가 비교적 용이 장점 예상치 못한 오류 발견에 효과적, 사용자 경험 개선에 도움 요구사항 검증에 효과적, 체계적인 테스트 가능 단점 모든 가능한 시나리오를 고려하기 어려움 유스케이스 문서의 품질에 의존적 실제 프로젝트에서는 이 두 방법을 상호 보완적으로 사용하는 것이 효과적이다. 예를 들어, Use Case Testing으로 기본적인 기능 정확성을 검증하고, Scenario Testing으로 실제 사용 환경에서의 사용성과 통합성을 검증하는 방식으로 활용할 수 있다. ...

November 5, 2024 · 2 min · Me

Path Coverage

경로 커버리지(Path Coverage) 경로 커버리지는 프로그램의 제어 흐름 그래프(Control Flow Graph, CFG)에서 모든 가능한 실행 경로를 테스트하는 구조적 테스팅 기법이다. 이는 프로그램의 입력과 출력 값보다는 내부 제어 흐름에 초점을 맞춘다. 먼저 경로 커버리지의 기본 개념을 간단한 예제를 통해 이해해보자: 1 2 3 4 5 6 7 8 9 10 11 def calculate_discount(price, is_member, is_sale_period): if is_member: if is_sale_period: return price * 0.8 # 20% 할인 else: return price * 0.9 # 10% 할인 else: if is_sale_period: return price * 0.95 # 5% 할인 else: return price # 할인 없음 이 함수에는 다음과 같은 가능한 실행 경로들이 있다: ...

November 1, 2024 · 4 min · Me

조건 커버리지 (Condition Coverage)

조건 커버리지 (Condition Coverage) 조건 커버리지는 결정 포인트 내의 각 개별 조건식이 참(true)과 거짓(false)의 결과를 최소한 한 번씩 갖도록 테스트하는 기법이다. 이는 전체 조건식의 결과와는 독립적으로 각 개별 조건의 결과에 초점을 맞춘다. 주요 특징 개별 조건 중심: 전체 조건식이 아닌 각 개별 조건식의 결과를 검증한다. 최소 요구사항: 각 조건이 최소한 한 번씩 참과 거짓의 결과를 가져야 한다. 세분화된 테스트: 복잡한 조건문의 각 부분을 개별적으로 테스트할 수 있다. 장점 조건의 독립적 평가: 각 조건을 독립적으로 평가하여 더 세밀한 테스트가 가능하다. 제어 흐름에 대한 높은 민감도: 프로그램의 제어 흐름을 더 정확하게 테스트할 수 있다. 결정 커버리지보다 강력: 더 많은 테스트 케이스를 요구하므로 더 철저한 테스트가 가능하다. 단점 전체 조건식 결과 보장 부족: 개별 조건의 참/거짓만을 테스트하므로 전체 조건식의 모든 결과를 보장하지 않을 수 있다. 테스트 케이스 증가: 조건의 수가 많아질수록 필요한 테스트 케이스의 수가 증가한다. 따라서 조건 커버리지는 다른 테스트 커버리지 지표들(구문 커버리지, 분기 커버리지 등)과 함께 사용되어야 하며, 이를 통해 더 완성도 높은 테스트를 수행할 수 있다. 조건 커버리지를 계산하는 방법 1 2 3 4 5 6 public boolean isEligibleForDiscount(int age, boolean isMember, int purchaseAmount) { if (age >= 60 && isMember || purchaseAmount > 1000) { return true; } return false; } 이 코드에는 세 가지 개별 조건이 있다: ...

November 1, 2024 · 4 min · Me

Decision Coverage

결정 커버리지 (Decision Coverage) 결정 커버리지는 프로그램의 모든 결정 포인트(조건문)에서 전체 조건식이 최소한 한 번씩 참(True)과 거짓(False)의 결과를 가지도록 테스트하는 방법이다. 이는 브랜치 커버리지(Branch Coverage)라고도 불린다. 간단한 예제: 1 2 3 4 5 6 7 8 9 10 11 public class LoanApproval { public boolean approveLoan(double income, double creditScore) { if (income >= 50000) { if (creditScore >= 700) { return true; } return false; } return false; } } 이 코드의 결정 커버리지를 100% 달성하기 위해서는 다음과 같은 테스트 케이스가 필요하다: ...

November 1, 2024 · 3 min · Me

Statement Coverage

구문 커버리지 (Statement Coverage) 구문 커버리지는 프로그램을 구성하는 모든 문장들이 최소한 한 번은 실행될 수 있는 입력 데이터를 테스트 데이터로 선정하는 기준이다. 또한 라인 커버리지(Line Coverage)라고도 불린다. 먼저 간단한 예제를 통해 구문 커버리지의 이해: 1 2 3 4 5 6 7 8 9 10 11 12 13 def calculate_grade(score): # 구문 1 if score >= 90: # 구문 2 grade = 'A' elif score >= 80: # 구문 3 grade = 'B' else: # 구문 4 grade = 'C' # 구문 5 return grade 이 함수의 모든 구문을 실행하기 위해서는 다음과 같은 테스트 케이스가 필요하다: ...

November 1, 2024 · 4 min · Me

Function Coverage

함수 커버리지 (Function Coverage) 함수 커버리지는 프로그램 내의 모든 함수가 테스트 중에 최소한 한 번 이상 호출되었는지를 측정하는 지표이다. 간단한 예제: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 class Calculator: def add(self, a, b): return a + b def subtract(self, a, b): return a - b def multiply(self, a, b): return a * b def divide(self, a, b): if b == 0: raise ValueError("Cannot divide by zero") return a / b 이 계산기 클래스의 모든 함수를 테스트하기 위해서는 다음과 같은 테스트 코드가 필요하다: ...

November 1, 2024 · 4 min · Me

다중 조건 테스팅 (Branch Condition Combination Testing)

다중 조건 테스팅 (Branch Condition Combination Testing) 다중 조건 테스팅은 각 결정문에서 가능한 모든 조건 조합을 테스트하는 기법이다. 이는 조건 커버리지의 확장된 형태로, 가능한 모든 부울 조건 조합을 테스트하는 것을 목표로 한다. 주요 특징 완전한 조건 조합: 결정문 내의 모든 개별 조건식에 대해 가능한 모든 true/false 조합을 테스트한다. 높은 커버리지: 100% 다중 조건 커버리지를 달성하면 결정 커버리지와 조건 커버리지도 100% 달성된다. 복잡한 로직 테스트: 여러 조건이 복합적으로 사용되는 복잡한 의사결정 구조를 철저히 테스트할 수 있다. 장점 철저한 테스트: 모든 가능한 조건 조합을 테스트하므로 누락된 경우의 수 없이 철저한 테스트가 가능하다. 숨겨진 버그 발견: 특정 조건 조합에서만 발생하는 오류를 찾아낼 수 있다. 로직 오류 검출: 복잡한 조건문의 로직 오류를 효과적으로 발견할 수 있다. 단점 테스트 케이스 증가: 조건의 수가 증가할수록 테스트 케이스의 수가 기하급수적으로 늘어난다. 시간과 비용: 많은 테스트 케이스로 인해 테스트 수행 시간과 비용이 증가한다. 복잡성: 조건이 많은 경우 모든 조합을 고려하는 것이 매우 복잡해질 수 있다. 사용 사례 다중 조건 테스팅은 다음과 같은 상황에서 특히 유용하다: ...

November 1, 2024 · 2 min · Me

Data Flow Testing

데이터 흐름 테스팅 (Data Flow Testing) 데이터 흐름 테스팅은 프로그램에서 변수의 정의와 사용 위치에 초점을 맞춰 테스트 케이스를 설계하고 실행하는 기법이다. 이 방법은 데이터가 프로그램 내에서 어떻게 생성되고 전달되는지를 확인하는 데 중점을 둔다. 데이터 흐름에서 발생할 수 있는 주요 활동들: 정의(Definition): 변수에 값이 할당되는 지점 사용(Use): 변수의 값이 읽히는 지점 계산용(Computational use): 다른 값을 계산하는데 사용 조건용(Predicate use): 조건문에서 사용 예제 코드를 통한 데이터 흐름: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 def calculate_final_price(base_price, quantity): # 변수 정의(Definition) discount = 0 # 조건용 사용(Predicate use) if quantity > 10: # 변수 정의(Definition) discount = 0.1 elif quantity > 5: discount = 0.05 # 계산용 사용(Computational use) final_price = base_price * quantity * (1 - discount) return final_price 이 코드에서 discount 변수의 데이터 흐름을 분석해보면: ...

November 1, 2024 · 4 min · Me

변경 조건/결정 커버리지 테스팅 (Modified Condition/Decision Coverage Testing, MC/DC)

변경 조건/결정 커버리지 테스팅 (Modified Condition/Decision Coverage Testing, MC/DC) MC/DC는 결정문 내의 각 조건이 독립적으로 결정의 결과에 영향을 미치는지 확인하는 테스트 기법이다. 이는 조건 커버리지와 결정 커버리지를 확장한 개념으로, 복잡한 논리 표현식의 각 입력이 출력에 미치는 영향을 독립적으로 보여준다. 먼저, MC/DC의 기본 개념을 이해하기 쉬운 예제를 통해 살펴보자: 1 2 3 public boolean validateFlight(boolean autopilotEngaged, boolean altitude, boolean airspeed) { return autopilotEngaged && (altitude || airspeed); } 이 코드는 비행 조건을 검증하는 간단한 함수이다. 자동조종장치가 켜져 있고, 고도나 속도 중 하나가 적절한 경우에만 비행이 허용된다. MC/DC에서는 각 조건이 독립적으로 전체 결과에 영향을 미치는 것을 검증해야 한다. ...

November 1, 2024 · 4 min · Me

구문 테스팅(Syntax Testing)

구문 테스팅(Syntax Testing) 구문 테스팅은 프로그램 코드의 모든 실행 가능한 구문을 최소한 한 번 이상 실행하도록 설계된 테스트 케이스를 사용하여 소프트웨어를 테스트하는 방법이다. 주요 특징 코드 커버리지 중심: 테스트 스위트에 의해 실행된 구문의 비율을 측정한다. 내부 구조 기반: 소프트웨어의 소스 코드에 직접 접근하여 테스트를 수행한다. 최소 실행 보장: 모든 코드 구문이 적어도 한 번은 실행되도록 한다. 구문 커버리지 구문 커버리지는 구문 테스팅의 효과를 측정하는 지표이다: 테스트 스위트에 의해 실행된 구문의 백분율로 표현된다. 100% 구문 커버리지는 코드의 모든 실행 가능한 구문이 최소한 한 번 실행되었음을 의미한다. 장점 철저한 코드 검증: 전체 코드와 구조를 테스트하므로 매우 철저하다. 코드 최적화: 불필요한 코드를 식별하고 제거하는 데 도움이 된다. 초기 단계 적용: 인터페이스가 필요 없어 개발 초기 단계에서 시작할 수 있다. 자동화 용이: 구조적 특성으로 인해 자동화하기 쉽다. 구문 테스팅의 실제 적용 예시를 살펴보면, 다음과 같은 시나리오들을 테스트할 수 있다: ...

November 1, 2024 · 4 min · Me