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

Security Vulnerability Scanning

보안 취약점 스캔 (Security Vulnerability Scanning) 시스템의 모든 진입점과 약점을 체계적으로 검사하는 과정이다. 주로 자동화된 도구를 사용하여 알려진 취약점 패턴을 검사하고, 잠재적인 보안 위험을 식별합니다. 주요 목적 잠재적인 보안 취약점 식별 데이터 유출 및 사이버 공격 위험 감소 규정 준수 요구사항 충족 전반적인 보안 태세 강화 작동 방식 대상 식별: 스캔할 시스템, 네트워크, 애플리케이션을 정의 스캔 실행: 자동화된 도구를 사용하여 취약점 검색 데이터 수집 및 분석: 발견된 취약점에 대한 정보 수집 및 분석 보고서 생성: 식별된 취약점과 심각도 수준을 포함한 상세 보고서 작성 결과 평가 및 조치: 우선순위에 따라 취약점 해결 방안 수립 주요 스캔 유형 네트워크 취약점 스캔: 방화벽, 라우터 등 네트워크 인프라의 취약점 검사 웹 애플리케이션 취약점 스캔: SQL 인젝션, XSS 등 웹 관련 취약점 탐지 데이터베이스 취약점 스캔: 데이터베이스 시스템의 보안 취약점 평가 호스트 취약점 스캔: 개별 서버나 워크스테이션의 OS 수준 취약점 검사 장점 조기 취약점 발견으로 비용 절감 자동화를 통한 효율적인 보안 관리 규정 준수 입증 용이 지속적인 보안 상태 모니터링 가능 주의사항 거짓 양성(false positive) 결과 발생 가능성 모든 취약점을 발견할 수 없음 스캔 자체가 시스템에 부하를 줄 수 있음 참고 및 출처

October 29, 2024 · 1 min · Me

성능 프로파일링 (Performance Profiling)

성능 프로파일링 (Performance Profiling) 성능 프로파일링(Performance Profiling)은 소프트웨어의 실행 동작을 분석하여 성능을 측정하고 개선하는 기술이다. 성능 프로파일링은 소프트웨어 개발 과정에서 중요한 품질 관리 활동으로, 초기 단계부터 지속적으로 수행하여 효율적이고 최적화된 소프트웨어를 개발하는 데 도움을 준다. 정의와 목적 성능 프로파일링은 소프트웨어의 실행 시 동작과 리소스 사용을 분석하는 과정이다. 주요 목적은 다음과 같다: 코드의 병목 지점 식별 리소스 사용량 분석 (CPU 시간, 메모리 사용 등) 실행 시간이 긴 함수나 코드 섹션 파악 성능 최적화를 위한 개선 지점 도출 프로파일링 단계 계획: 분석 대상과 목표 설정 데이터 수집: 실행 중 성능 데이터 수집 분석: 수집된 데이터 분석 및 병목 지점 식별 최적화: 분석 결과를 바탕으로 코드 개선 검증: 개선 효과 확인 주요 프로파일링 유형 CPU 프로파일링: 함수별 CPU 사용 시간 측정 메모리 프로파일링: 메모리 할당 및 해제 패턴 분석 I/O 프로파일링: 디스크, 네트워크 등 I/O 작업 분석 장점 코드 품질 향상 소프트웨어 효율성 증대 리소스 할당 최적화 사용자 경험 개선 확장성 향상 도구 다양한 성능 프로파일링 도구가 있으며, 대표적인 것들은 다음과 같다: ...

October 29, 2024 · 1 min · Me

Desk Check

데스크 체크(Desk Check) 데스크 체크는 코드를 작성한 개발자가 자신의 “책상에서” 수행하는 자체 검토 활동이다. 이는 마치 작가가 원고의 초안을 검토하는 것과 유사하다. 개발자는 자신이 작성한 코드를 한 줄씩 꼼꼼히 읽어가며 논리적 오류나 잠재적 문제를 찾아낸다. 데스크 체크의 실제 적용 예시: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 // 데스크 체크 과정의 예시 public class PaymentProcessor { public boolean processPayment(double amount, String cardNumber) { // 데스크 체크 포인트 1: 입력값 검증 // - amount가 음수인 경우는 없는지? // - cardNumber가 null이거나 빈 문자열은 아닌지? if (amount <= 0 || cardNumber == null || cardNumber.isEmpty()) { return false; } // 데스크 체크 포인트 2: 카드 번호 형식 검증 // - 숫자로만 구성되어 있는지? // - 길이가 올바른지? if (!validateCardNumber(cardNumber)) { return false; } // 데스크 체크 포인트 3: 결제 처리 로직 // - 예외 처리가 적절한지? // - 트랜잭션 처리가 정확한지? try { return executePayment(amount, cardNumber); } catch (PaymentException e) { logError("Payment failed", e); return false; } } } 데스크 체크 수행 방법 체계적 검토 프로세스 개발자는 다음과 같은 순서로 코드를 검토한다: 코드 구조 검토 논리적 흐름 확인 예외 상황 고려 성능 관련 검토 코드 스타일 확인 체크리스트 활용 효과적인 데스크 체크를 위한 체크리스트 예시: 기본적인 검증 사항들 null 참조 가능성 검사 경계 조건 검사 리소스 관리 확인 보안 관련 검토 문서화 적절성 확인 데스크 체크의 장점과 효과 즉각적인 문제 발견 개발자가 코드를 작성한 직후에 검토함으로써 문제를 빠르게 발견할 수 있다: ...

October 29, 2024 · 3 min · Me