27. 테스트 커버리지
(1) 테스트 커버리지
1️⃣ 테스트 커버리지 종류
종류 | 설명 |
기능 기반 | 어플리케이션 전체 기능을 모수로 설정하고, 실제 테스트가 수행된 기능의 수를 측정 |
Line Coverage | 라인 단위 |
Code Coverage | 소스 코드 구문, 조건, 결정 등 |
Statement Coverage | 코드 구조 내의 모든 구문에 대해 한 번 이상 수행 |
Condition Coverage | 결정 포인트 내 모든 개별 조건식에 대해 |
Decision Coverage | 결정 포인트 내 모든 분기문에 대해 |
Modified Contidion / Decision Coverage | 조건과 결정을 복합적으로 고려한 측정 방법 독립적으로 전체 조건식의 결과에 영향을 주는 테스트 커버리지 |
(2) 테스트 자동화
1️⃣ 테스트 자동화 도구 유형
유형 | 설명 | |
정적 분석 도구 | ❶ 프로그램 실행하지 않고 소스 코드 분석을 통해 결함을 발견 ❷ 코딩 표준, 코딩 스타일, 코딩 복잡도, 남은 결함 등을 발견하기 위해 사용 |
|
테스트 실행 도구 | 스크립터 언어를 사용하여 테스트를 실행 | |
성능 테스트 도구 ⭐️ | 어플리케이션의 처리량, 응답시간, 경과 시간, 자원 사용률에 대해 가상 사용자를 생성한 후 테스트를 수행하여, 성능 목표를 달성했는지 확인하는 테스트 자동화 도구 |
|
테스트 통제 도구 | 테스트 계획 및 관리, 수행, 결함 관리 등을 수행 | |
테스트 하네스 도구 | 컴포넌트의 테스트를 가능하게 하거나, 빠진 컴포넌트의 기능을 대신 하거나, 실행 결과와 예상 결과를 비교하기 위해 사용하는 도구 |
2️⃣ 테스트 하네스 도구 구성 요소 ⭐️
구성 요소 | 설명 |
테스트 드라이버 ⭐️ | ❶ 하위 > 상위 모듈로 통합 테스트 / 상향식 테스트에 사용 ❷ 테스트 대상을 제어하고 동작 시키는데 사용되는 도구 ❸ 시험을 지원하는 목적하에 생성된 코드와 데이터 |
테스트 스텁 ⭐️ | ❶ 상위 > 하위 모듈로 통합 테스트 / 하향식 테스트에 사용 ❷ 하위 시스템 컴포넌트 개발 완료 x 때, 테스트 진행을 위해 생성된 더미 컴포넌트 스텁은 몽땅 연필이라는 의미 |
테스트 슈트 | 일정한 순서에 의해 수행 |
테스트 케이스 | 테스트 할 입력과 예상 결과를 정의 |
테스트 스크립트 | ❶ 테스트 케이스를 수행하여 결과를 보고할 목적 ❷ 명령어 / 이벤트 중심의 스크립트 언어로 작성한 파일 |
목 오브젝트 | 테스트를 위해 미리 입력해둔 데이터를 수행하는 객체 |
3️⃣ 테스트 수행 단계별 테스트 자동화 도구
단계 | 설명 |
테스트 계획 단계 | 요구사항 관리 도구 |
테스트 분석 및 설계 단계 | 테스트 케이스 생성 도구 |
테스트 수행 단계 | 테스트 자동화 / 정적 분석 / 동적 분석 / 성능 테스트 / 모니터링 도구 |
테스트 관리 단계 | 커버리지 분석 / 형상 관리 / 결함 추적 및 관리 도구 |
[관련 기출 문제]
28. 통합 테스트
(1) 통합 테스트
1️⃣ 통합 테스트
각 모듈 간을 결합하여 시스템을 완성시키는 과정에서 오류 및 결함을 찾아 해결하기 위한 테스트 기법
비 점진적 통합 방식 (빅뱅 통합) |
점진적 통합 방식 (상향식 / 하향식) |
❶ 모든 모듈이 결합된 프로그램 전체를 대상으로 테스트 ❷ 작은 규모의 소프트웨어에 적합 ❸ 오류 발견 / 장애 위치 파악 또는 수정이 어렵 |
❶ 단계적으로 통합하여 테스트 ❷ 오류 수정 용이 ❸ 인터페이스 관련 오류 테스트 가능 |
(2) 통합 방식
1️⃣ 통합 방식
통합 방식 | 설명 |
하향식 통합 | ❶ 상위 컴포넌트 테스트하고 점증적으로 하위 컴포넌트 검사 ❷ 하위 컴포넌트 개발이 완료되지 않은 경우 스텁 사용 ❸ 종류 : 우선 통합법, 깊이 우선 통합법, 너비 우선 통합법 ❹ 하위 레벨 모듈들은 특정한 소프트웨어 부가 기능을 수행하는 클러스트들에 결합 |
상향식 통합 | ❶ 하위 모듈을 구성하고 상위 모듈 방향으로 통합하며 검사 ❷ 스텁이 필요 없으나, 주요 제어 모듈과 관련된 종속 모듈 그룹인 클러스터가 필요 ❸ 드라이버를 사용 |
빅뱅 통합 | Driver나 Stub 없이 실제 모듈들로 테스트 진행 (한방에 끝) 장애 확인이 어렵다 |
샌드위치 통합 | 상향식 + 하향식 장점을 이용 |
[관련 기출 문제]
29. 결함 관리
(1) 결함 관리
1️⃣ 결함
심각도별 분류
치명적 결함, 주요 결함, 보통 결함, 경미한 결함, 단순 결함
결함 우선순위
결정적, 높음, 보통, 낮음 또는 즉시 해결, 주의 요망, 대기, 개선 권고 순으로 표시
결함의 심각도가 높다 해서 우선 순위가 높은 것은 아님
결함관리 프로세스
결함 관리 계획 - 결함 기록 - 결함 검토 - 결함 수정 - 결함 재확인 - 결함 상태 추적 및 모니터링 - 최종 결함 분석 및 보고서 작성
(2) 결함 관리 도구 및 용어
1️⃣ 결함 관리 도 구
종류 | 설명 |
Mantis | 단위별 작업 내용 기록 가능한 오픈 소스 도구 |
Trac | 결함 추적 및 통합 관리를 지원하는 오픈 소스 도구 |
Bugzilla | 심각도와 우선순위를 지정하는 오픈 소스 도구 |
Redmine | 프로젝트 관리 및 결함 추적 도구 |
JIRA | PHP로 개발된 결함 상태 관리 도구 |
Test Collab | 인터페이스 제공, 버그 추적 도구와 완벽한 통합 지원 |
2️⃣ 결함 관련 용어
용어 | 설명 |
에러 | ❶ 개발 중 발생한 부정확한 결과 ❷ 개발자의 실수로 발생한 오타, 개발 명세서의 잘못된 이해, 서브루틴 기능 오해 |
오류 | ❶ 프로그램 코드상 존재하는 것 ❷ 프로그램 버전 간 차이로 발생 ❸ 잘못된 연산자 사용시, 에러 리턴 검검하는 코드가 누락된 것 |
실패 | ❶ 실행 결과의 차이 ❷ 실제 실행 결과를 개발 명세서에 정의된 예상 결과와 비교하여 발견 |
결함 | 버그, 에러, 오류, 실패, 프로그램 실행에 대한 문제점 등 전체를 포괄하는 용어 |
3️⃣ 결함 내성
❶ 결함 또는 고장이 있어도 기능을 수행할 수 있는 내성
❷ 고장 허용성
[관련 기출 문제3
30. 애플리케이션 성능개선
(1) 애플리케이션 성능개선
1️⃣ 성능 측정 지표
지표 | 설명 |
처리량 (Throughput) | 주어진 시간에 처리할 수 있는 프로세스 처리 수 |
응답시간 (Response Time) | 데이터 입력 완료시부터 응답 출력이 개시될 때까지의 시간 |
경과 시간 (Tunraroung Time) | 입력한 시점부터 그 결과의 출력이 완료할 때까지 걸리는 시간 |
자원사용률 (Resource Usage) | 프로세스 처리 중 사용하는 CPU 사용량, 메모리 사용량, 네트워크 사용량 |
2️⃣ 유형별 성능 분석 도구
❶ 성능/부하/스트레스 점검 도구
❷ 모니터링 도구
(2) 애플리케이션 성능 저하 원인
1️⃣ DB 연결 및 쿼리 실행시 발생되는 성능 저하
분류 | 설명 |
DB Lock | ❶ 과도한 데이터 조회/수정/인덱스 생성 시 발생 ❷ Lock 해제까지 대기하거나 처리하지 못하고 종료 |
불필요한 DB Fetch | ❶ 필요한 데이터보다 많은 데이터 요청이 들어올 경우 ㅂ발생 ❷ 결과 세트에서 마지막 위치로 커서를 옮기는 작업이 빈번한 경우 응답시간 저하 현상 발생 |
연결 누수 | DB 연결과 관련한 JDBC 객체를 사용 후 종료하지 않을 경우 발생 |
부적절한 Connection Pool Size | 커넥션 풀 크기가 작거나 크게 설정한 경우 |
기타 | ❶ 트랜잭션이 커밋되지 않고 커넥션 풀에 반환 ❷ 잘못 작성된 코드로 불필요한 커밋이 자주 발생하는 경우 |
(3) 알고리즘
1️⃣ 알고리즘
❶ 주어진 과제를 해결하기 위한 방법과 절차를 의미
❷ 자연어, 의사코드, 순서도, 프로그래밍 언어를 이용하여 표현 가능
- 의사코드 : 일반적인 언어 코드를 흉내내어 알고리즘을 쓴 코드
2️⃣ 알고리즘 설계 기법⭐️
기법 | 설명 | |
분할 정복법 (Divide & Conquer) |
❶ 제시된 문제를 분할이 불가할 때까지 나누기 ❷ 각 과제를 풀면서 다시 병합 ❸ Top - Down 방식 |
|
분할 (Divide) | 분할이 가능한 부분까지 분할 | |
정복 (Conquer) | 분할된 하위 과제를 해결(정복) | |
결합 (Combine) | 정복된 해답을 결합 | |
종류 | 퀵 정렬 알고리즘, 병합(합병) 정렬 알고리즘 | |
동적 계획법 (Dynamic Programming) |
❶ 부분 문제애 대한 답을 계속 활용하는 Bottom - Up 방 ❷ 저장소 필요 |
|
과정 | ❶ 부분 문제로 분리 ❷ 가장 낮은 단계의 부분 문제 해답 계산 ❸ 부분 문제의 해답을 이용해 상위 부분 문제 해결 |
|
종류 | 플로이드 알고리즘, 피보나치 수열 알고리즘 | |
탐욕법 (Greedy Method) |
국소적인 관점에서 최적의 해결 방법을 구함 | |
종류 | 크루스칼 알고리즘, 다익스트라 알고리즘 | |
퇴각 검색법 (Back-tracking) |
❶ 모든 가능성을 찾아가는 방법 ❷ N-Queen 문제 해결시 응용 ❸ 저장소 필요 |
|
분기 한정법 (Branch & Bound) |
범위를 벗어나는 값들은 가지치기 하며 결과 값을 추적하는 방식 | |
종류 | 최적 우선 탐색 알고리즘, A* 알고리즘 | |
근사 해법 (Approximation Algorithm) |
❶ 복잡도가 높은 문제에 대해 가장 근사치의 값을 구함 ❷ NP-Hard 문제해결을 위해 가장 가까운 답을 찾는 결정성 알고리즘을 구하는 기법 ❸ 시간 복잡도, 공간 복잡도, 정밀도를 척도로 평가 |
|
종류 | 근사 알고리즘 |
[관련 기출 문제]
3️⃣ 시간 복잡도에 따른 알고리즘
: 알고리즘이 문제를 해결하기 위한 시간의 횟수
시간 복잡도 Big-O 표기법
표기법 | 설명 |
O(1) | ❶ 상수 시간의 복잡도 ❷ 입력값이 주어졌을 때, 문제 해결하는데 한 단계만 거침 ❸ 해시 함수 |
O(log₂n) | ❶ 로그 시간 복잡도 ❷ 문제를 해결하는데 필요한 단계들이 연산마다 특정 요인에 의해 줄어듦 ❸ 이진탐색 |
O(Nlog₂n) ⭐️ | ❶ 선형 로그 시간 복잡도 ❷ 문제 해결을 위한 단계 수는 Nlog₂n번의 수행 시간을 가짐 ❸ 퀵 정렬, 병합(합병)정렬 |
(4) Mccabe 순환 복잡도 (Cyclomatic)
1️⃣ 순환복잡도
❶ 프로그램 이해 난이도나 제어 흐름 난이도의 복잡도에 따라 결정
❷ 복잡도를 싸이클로메틱 개수에 의해 산정
❸ 최대 10을 넘지 않도록 하며, 넘으면 분해
❹ 싸이클로메틱의 개수와 원시프로그램 오류의 개수는 밀접한 관계가 있다.
2️⃣ 복잡도 계산 방식 ⭐️
공식 | |
복잡도 = 화살표 수(E) - 노드수(N) + 2 |
제어 흐름 그래프를 통해 파악 |
복잡도 = 영역 수(폐 구간) + 1 | 제어 흐름 그래프를 통해 파악 |
복잡도 = 의사 결정 수 + 조건 수 + 1 | 프로그램 코드 상에서 파악 |
3️⃣ 해싱 함수의 종류
종류 | 설명 | |
제산 방법 | Division Method | 나머지 연산자(%)를 사용하여 테이블 주소를 계산 |
중간 제곱 방법 | Mid-Square Method | 레코드 키 값을 제곱한 후, 결과 값 중간에 있는 몇 비트를 선택하여 해시 테이블의 홈주소로 사용 |
중첩 방법 | Folding Method, 폴딩 | 해싱 함수 중 레코드 키를 여러 부분으로 나누고, 나눈 부분의 각 숫자를 더하거나, XOR한 값을 홈주소로 사용 |
기수 변환 방법 | Redix Conversion Method | 레코드 키를 구성하는 수들이 자리별로 어떤 분포인지 조사하여 비교적 고른 분포를 나타내는 자릿수를 필요한 만큼 선택하여 레코드의 홈주소로 사용 |
동의어 | Synonym | 해싱에서 동일한 홈주소로 인해 충돌이 일어난 레코드 집합 |
무작위 방법 | Random Method | 난수를 발생 시킨 후 난수를 이용해 각 키의 홈 주소를 산출 |
계수 분석 방법 | Digit Analysis Method | ? |
[관련 기출 문제]
31. 소스 코드 최적화
(1) 소스 코드 최적화
1️⃣ 소스 코드 최적화
구분 | 설명 |
나쁜 코드 | ❶ 이해하기 어려운 코드 ❷ 변수/메소드에 대한 명칭을 알 수 없는 코드 ❸ 중복된 코드 ❹ 스파게티 코드라고 불린다 |
클린 코드 ⭐️ | ❶ 깔끔하게 정리된 코드 ❷ 중복 코드 제거 ❸ 높은 가독성 ❹ 클린코드로 인해 버그 찾기가 쉬워짐 ❺ 클린코드 최적화 원칙 : 가독성 / 단순성 / 의존성 배제 / 중복 최소화 / 추상화 |
외계인 코드 ⭐️ | 오래되거나 참고 문서 또는 개발자가 없어 유지보수가 어려운 코드 |
2️⃣ 클린코드 작성 원칙 ⭐️
원칙 | 설명 |
가독성 | 이해하기 쉬운 용어 사용, 들여쓰기 활용 |
단순성 | 최소 단위로 분리해 한 번에 한 가지 기능만 처리 |
의존성 배제 | 다른 모듈에 미치는 영향 최소화 |
중복 최소화 | 중복된 코드 삭제 |
추상화 | 상위는 애플리케이션의 특성, 하위에서 상세 내용 구현 |
3️⃣ 코드의 간결성 유지 지침 ⭐️
❶ 공백을 이용해, 실행 그룹과 주석을 명확히 구분
❷ 복잡한 논리식과 산술식은 괄호와 들여쓰기(Indentation)으로 구분
❸ 빈 줄을 사용해 선언부와 구현부 구별
❹ 한줄에 되도록 적은 문장을 코딩
(2) 소스 코드 품질 분석
1️⃣ 소스코드 품질 분석 도구 ⭐️
구분 | 설명 | |
정적 분석 도구 ⭐️ | 개발 초기의 결함을 찾을 때 사용 | |
기법 | ❶ 소스코드 검증 : 검증 가이드라인 ❷ 코드 리뷰 ❸ 리버스 엔지니어링 : 구조 분석을 통해 기술 원리를 발견 |
|
종류 | pmd, cppcheck, SonarQube, checkstyle, ccm, cobertura 등 | |
동적 분석 도구 | 실행 과정에서 다양한 입출력 데이터 변화 및 사용자 상호작용에 따른 변화를 점검 | |
기법 | ❶ 디버깅 ❷ 스트레스 테스트 ❸ 모의 해킹 ❹ 리버스 엔지니어링 |
|
종류 | Avalanche, Valgrind, valMeter 등 |
정적 분석과 동적 분석 기술 비교
분류 | 정적 분석 | 동적 분석 |
대상 | 소스 코드 | 실제 애플리케이션 |
평가 기술 | 오염 분석, 패턴 비교 | 애플리케이션 실제 실행 |
단계 | 애플리케이션 개발 단계 | 애플리케이션 개발 완료 단계 |
[관련 기출 문제]
32. 인터페이스 구현
(1) 인터페이스 기능 확인
1️⃣ 인터페이스 설계서
❶ 인터페이스 현황을 한눈에 확인하기 위해 데이터 교환과 처리를 위해 사용되는 데이터 등에 관한 내용을 기술한 문서
❷ 인터페이스 설계서의 외부 및 내부 모듈 기능 확인
(2) 모듈 연계
1️⃣ EAI (EnterPrice Application Integration) 유형
유형 | 기능 | |
Point-to-Point | ![]() |
미들웨어 없이 point to point로 연결하는 통합방식 |
Hub & Spoke | ![]() |
❶ 단일 접점인 허브 시스템을 통해 데이터 전송하는 중앙 집중형 방식 ❷ 허브에 장애 발생 시 시스템 전체에 영향 |
Message Bus | ![]() |
❶ 미들웨어를 배치하여 처리하는 방식 ❷ 대용량 데이터 처리에 유리 |
Hybrid ⭐️ | ![]() |
❶ Hub&Spoke와 Message Bus의 혼합 형태 ❷ 그룹 내 : Hub&Spoke 그룹 간 : Message Bus ❸ 데이터 병목 현상 최소화 |
2️⃣ ESB (Enterprice Service Bus)
❶ 애플리케이션 간 데이터 변환 및 연계 지원을 제공하는 인터페이스 제공 솔루션
❷ EAI와 유사하나, 서비스 중심으로 통합한다는 점에서 다름 : 인터페이스 통합도구
3️⃣ 데이터 표준 확인
❶ 내/외부 모듈간 데이터 교환 시 데이터 표준을 정의하고 관리하여야 함
❷ JSON, DB, XML 등 다양한 표준으로 인터페이스 모듈 표현
[관련 기출 문제]
(3) 인터페이스 기능 정의
1️⃣ 인터페이스 기능 정의 순서
1 | 컴포넌트 명세서 확인 |
2 | 인터페이스 명세서 확인 |
3 | 일관된 인터페이스 기능 구현 정의 |
4 | 정의된 인터페이스 기능 구현 정형화 |
2️⃣ 모듈 세부 설계서
구분 | 설명 |
컴포넌트 명세서 | ❶ 내부 클래스 동작, 컴포넌트 개요 ❷ 인터페이스를 통해 외부와 통신하는 명세를 정의 ❸ 구성 : 컴포넌트 ID, 컴포넌트명, 컴포넌트 개요, 내부 클래스, 인퍼테스 클래스, 인터페이스명 등 |
인터페이스 명세서 | ❶ 컴포넌트 명세서 항목 중 인터페이스 클래스의 세부 조건 및 기능을 정의 ❷ 구성 : 인터페이스 ID, 인터페이스명, 오퍼레이션명, 오퍼레이션 개요 등 |
(4) 인터페이스 구현
1️⃣ 데이터 통신을 위해 사용하는 규정
AJAX (Asynchronous Javascript And Xml) ⭐️
❶ JavaScript를 이용한 비동기 통신 기술
❷ 클라이언트와 서버 간 XML 데이터를 주고 받음
JSON (JavaScript Object Notation) ⭐️
❶ 데이터 객체를 속성/값의 키(쌍)형태로 표현
❷ 자바스크립트 토대로 개발
❸ 웹 상에서 용량이 적은 데이터를 교환하기 위함
(5) 인터페이스 구현 검증
1️⃣ 인터페이스 구현 검증 도구의 종류
: 단위 기능 및 시나리오에 기반한 통합 테스트가 필요
구분 | 설명 |
Watir | ❶ Ruby 기반 웹 애플리케이션 테스트 프레임워크 ❷ 모든 언어 기반의 웹 애플리케이션 테스트와 브라우저 호환성 테스트 가능 |
xUnit | Java(JUnit), C++ (Cppunit), .Net(NUnit)등 다양한 언어의 단위 테스트 프레임워크 |
FitNesse | 웹 기반 테스트 케이스를 지원하는 테스트 프레임워크 |
STAF | 서비스 호출, 컴포넌트 재사용 등 다양한 환경을 지원 데몬을 사용 |
NTAF Naver |
테스트 자동화 프레임웤, STAF와 FitNesse를 통합 |
Selenium | 다양한 브라우저 및 언어를 지원하는 웹 애플리케이션 테스트 프레임워크 |
2️⃣ 인터페이스 구현 감시 도구
❶ APM (Application Perfomance Management)를 사용하여 동작 상태 감시
❷ 예시 ) 스카우터, 제니퍼
[관련 기출 문제]
33. 인터페이스 보안
(1) 인터페이스 보안
1️⃣ 인터페이스 보안
데이터 통신 시 데이터 탈취 위협 | ❶ 스니핑 (sniffing) : 네트워크 주변을 지나다니는 패킷을 엿봄 (킁킁) ❷ 스푸핑 (spoofing) : 통신 정보를 크래커의 사이트를 통하게 함 (흉내) |
데이터 베이스 암호화 | 대칭키, 해시, 비대칭키 알고리즘 사용 |
시큐어 코딩 | OWASP를 참고해 KISA에서 SW 보안 약점 가이드 발표 |
2️⃣ 네트워크 보안 적용 ⭐️
❶ 인터페이스 송/수신 간 중간자에 의해 데이터 탈취/위변조를 방지하기 위해 네트워크 트래픽에 대한 암호화 적용
❷ 네트워크 구간의 암호화를 위해 인터페이스 아키텍처에 따라 다양한 방식으로 보안기능 적용
네트워크 구간 보안 기능 적용 시 고려사항
단계 | 고려사항 | 보안 기능 적용 |
Transport Layer Network 보안 | 상대방 인증 적용 | ❶ IPsec AH 적용 ❷ IKE 프로토콜 적용 |
데이터 기밀성 보장 필요 | IPSec ESP 적용 | |
End-to-End 보안 적용 | IPSec Tranport Mode 적용 | |
Application Layer Network 보안 | 서버만 공개키 인증서를 가지고 통신 | SSL의 서버 인증 상태를 운영 |
연결 단위외 메시지 단위로도 인증 및 암호화가 필요 |
S-HTTP 적용하여 메시지를 암호화 |
IPSec : 통신 세션의 각 IP 패킷을 암호화하고 인증하는 프로토콜
AH : 메시지 체크섬을 활용한 데이터 인증과 비연결형 무결성을 보장해주는 프로토콜
(2) 데이터베이스 보안
1️⃣ 데이터 베이스 암호화 알고리즘
구분 | 종류 |
대칭키 알고리즘 | ARIA 128/129/256, SEED |
해시 알고리즘 | SHA-256/384/512, HAS-160 |
비대칭 키 알고리즘 | RSA, ECDSA, ECC |
2️⃣ 데이터베이스 암호화 기법
구분 | 설명 |
API 방식 | 애플리케이션 레벨에서 암호 모듈을 적용 |
Filter(Plug-in) 방식 | 데이터베이스 레빌의 확정성 프로시저 기능을 이용해 DBMS 에 Plugin 또는 Snap-in 모듈 형식으로 작성 |
Hybird 방식 | API/Filter 방식을 결합하거나 Filter 방식에 추가로 SQL 문에 대한 최적화를 대행해주는 어플라이언스를 제공하는 방식 |
(3) 인터페이스 연계 테스트
1️⃣ 연계 테스트 분류
❶ 소프트웨어 연계 테스트 구간
❷ 소프트웨어 연계 단위 테스트
❸ 소프트웨어 연계 통합 테스트
[관련 기출 문제]
[참고 영상]
[정보처리기사 필기 절대족보] 핵심이론 2과목(소프트웨어 개발)