소프트웨어 공학 Lecture #9: 테스팅 최은만 저 6차 개정판 1
학습 목표 테스팅 기초와 원리 블랙박스 테스팅 화이트 박스 테스팅 객체지향 테스팅 통합 테스팅 시스템 및 인수 테스팅 테스트 자동화 도구
9.1 테스팅 기초 소프트웨어의 정확성을 확증하는 과정 좋은 테스트란 숨어있는 오류를 잘 발견하는 것 결함이나 원치 않는 동작을 찾는 것 요구와 제약에 맞는지 검증 좋은 테스트란 숨어있는 오류를 잘 발견하는 것
테스팅 용어 오류(error) 결함(fault) 고장(failure) 프로그램 실행 결과가 예상결과와 다른 경우 결함 및 고장을 일으키게 한 인간의 실수 결함(fault) 버그(bug) 소프트웨어 오작동의 원인 고장(failure) 명세로 작성된 요구와 기능을 제대로 수행할 수 없는 경우 모든 결함이 고장을 발생하는 것은 아님
테스팅 원리 테스팅은 오류를 발견하려고 프로그램을 실행시키는 것 완벽한 테스팅을 불가능 테스팅은 창조적이면서 어려운 작업 테스팅은 오류의 유입을 방지 테스팅은 구현과 관계없는 독립된 팀에 의해 수행되야함
테스팅 과정
개발 단계별 테스트
테스트 케이스 시험 대상 단위 별로 묶음
9.2 블랙박스 테스팅 프로그램 구조를 고려하지 않음 테스트 케이스는 프로그램이나 모듈의 요구나 명세를 기초로 결정 입력과 출력에 대해 알아야 함 기능테스트(functional testing) 가능한 모든 기능을 전부 테스트 하는 것이 좋음
동치 클래스 프로그램에서 같은 부분을 구동시키고 결과를 확인하는 값들의 대푯값 정상적인 동치클래스 비정상적인 동치클래스 모든 대표 값을 찾아내어 각 클래스에서 하나의 값으로 프로그램을 실행시킨다면 전수 테스트와 같음 <예> 입력 범위 조건 0 ≤ count ≤ Max 의 동치 클래스 정상 0 ≤ count ≤ Max 비정상 count < 0, count > Max
경계값 분석 동치 클래스의 경계에서 문제를 발생하는 특수한 값이 존재 동치 클래스 경계에 있는 값을 가진 테스트 케이스는 높은 효율을 가짐 동치클래스의 경계에 있는 값을 테스트 입력으로 선택 <예> 하나의 입력 값 X에 대한 테스트 케이스 입력값 조건: min ≤ X ≤ max 케이스: min-1, min, min+1, max-1, max, max+1
경계값 분석 <예> 두개의 입력 값 X, Y에 대한 테스트 케이스 입력값 조건: min ≤ X ≤ max min ≤ Y≤ max
원인과 결과 그래프(1) 입력 조건의 조합을 체계적으로 선택하는 테스트 기법 노드와 기호로 표시 노드: 원인(입력조건), 결과(출력 조건) 기호: ∧(and), ∨(or), ~(not) <예>
원인과 결과 그래프(2) 각각의 결과들에 대하여 조건의 조합을 나열 <예> x: don’t care 0: false 1: true
9.3 화이트박스 테스팅 모듈의 논리적인 구조를 체계적으로 점검하는 구조적 테스팅 여러가지 프로그램 구조를 기반으로 테스트 논리 흐름도(logic-flow diagram)을 이용 노드: 모듈내의 모든 세그먼트 간선: 제어 흐름
기본 경로 테스팅 기본경로(basis path) 독립적인 논리 흐름을 검사하는 테스트 케이스를 생성 시작 노드에서 종료 노드까지의 서로 다른 경로로써 싸이클은 최대 한번만 지나야 함 <예> Remove 함수에 대한 논리흐름 그래프와 테스트 케이스 1. S-1-2-E: 빈 리스트 2. S-1-2-3-4-9-10-2-E: 한 개의 요소를 가진 리스트 3. S-1-2-3-4-5-6-8-4-9-10-2-E: 중복 요소를 가진 리스트 4. S-1-2-3-4-5-7-8-4-9-10-2-E: 중복 요소가 없는 리스트
싸이클로매틱 복잡도 기본 경로의 수를 결정하는 이론 싸이클로매틱 복잡도 계산 3가지 방법 3가지 방법의 값이 같아야 함 폐쇄 영역의 수 +1 : 논리 흐름 그래프는 이차원 평면을 여러 영역으로 나누며, 이 중 폐쇄된 영역의 수 에 1을 더한 값 노드와 간선의 수 : 간선의 수에서 노드의 수를 빼고 2를 더한 값 단일 조건의 수 +1 : 참과 거짓으로 판별되는 원자적 조건의 수에 1을 더한 값 3가지 방법의 값이 같아야 함
테스트 커버리지 테스트를 어느 정도 완벽히 수행할 것인가의 기준 노드 커버리지 간선 커버리지 기본 경로 커버리지 논리 흐름 그래프의 각 노드가 테스트 케이스에 의하여 적어도 한 번씩 방문되어야 하는 검증기준 프로그램 문장 100% 커버 간선 커버리지 논리 흐름 그래프의 각 간선이 테스트 케이스에 의하여 적어도 한 번씩 방문되어야 하는 검증기준 모든 분기점 테스트(Branch coverage) 기본 경로 커버리지 모든 기본 경로가 적어도 한 번씩 방문되어야 하는 검증기준 간선 커버리지의 50% 모든 경로 커버리지 모든 가능한 경로를 적어도 한 번씩 테스트하는 검증기준 현실적으로 불가능
반복문의 테스팅(1) Beizer 반복구조 분류 단순 반복 경계값 분석 방법 이용 반복 구조를 들어가지 않고 생략 반복 구조 안에서 한 번 반복 반복 구조 안에서 두 번 반복 일정한 횟수의 반복 반복 최대 횟수 − 1 만큼 반복 반복 최대 횟수만큼 반복 반복 최대 횟수 +1 만큼 반복
반복문의 테스팅(2) 중첩된 반복 가장 내부에 있는 반복 구조부터 테스트 (단, 외부 반복 구조는 최소 반복횟수로 지정) 최소 횟수의 반복 최소 횟수보다 하나 많은 반복 범위 내 임의의 횟수 반복 최대 횟수보다 하나 적은 반복 최대 횟수의 반복 외부로 향하여 다음 반복구조를 테스트
반복문의 테스팅(3) 연속된 반복 비구조화 반복 반복구조가 서로 독립적이면 ‘단순반복’ 반복구조가 어느 한쪽이 포함된 관계라면 ‘중첩된 반복’ 비구조화 반복 구조적 반복 형태로 변경하여 테스트
9.4 객체지향 테스팅 객체지향 방식의 프로그램에 적용 사용사례 기반 테스팅 상태 기반 테스팅
사용 사례 기반 테스팅 사용 사례 명세로부터 테스트 케이스 추출 액터의 입력과 액션을 파악 <예> 사용자 등록 사용 사례로부터 입력요소 추출
사용 사례 기반 테스팅 입력 값을 결정 정상/비정상/예외 값 분류 <예> 파악된 입력 요소의 값 결정
사용 사례 기반 테스팅 테스트 케이스 생성 입력 값 조합 규칙 테스트 조합이 프로그램 기능과 동작의 정확성을 가진다면 선택 테스트 조합이 오류를 발견할 가능성이 있다면 선택 테스트 조합이 선택된 다른 테스트 조합에 의해 포함될 수 있다면 삭제(중복제거), 유지할지 삭제할지 불분명한 것은 선택
상태 기반 테스팅 같은 입력에 대해 같은 동작을 보이며 동일한 결과를 생성하는 시스템(state-less system)을 대상 배치 처리 시스템 계산 중심 시스템 하드웨어로 구성된 회로 시스템의 동작은 시스템의 상태에 의해 좌우됨 상태 모델 구성요소 상태 – 시스템의 과거 입력에 대한 영향을 표시 트랜지션 – 이벤트에 대한 반응으로 시스템이 하나의 상태에서 다른 상태로 어떻게 변해가는지를 나타냄 이벤트 – 시스템에 대한 입력 액션 – 이벤트에 대한 출력
상태 기반 테스팅 <예> 예금 계좌의 상태 모델 예시
상태 기반 테스팅 검증 기준(coverage) 모든 트랜지션 모든 트랜지션 쌍 트랜지션 트리 테스트 케이스 집합이 상태 그래프의 모든 트랜지션을 점검 모든 트랜지션 쌍 테스트 케이스 집합이 모든 이웃 트랜지션의 쌍을 점검 유입(incoming)과 방출(outgoing) 트랜지션 쌍을 의미 트랜지션 트리 테스트 케이스 집합이 모든 단순 경로를 만족시키는 기준
9.5 통합 테스팅 모듈의 인터페이스 결합을 테스트 모듈의 결합 순서에 따라 방법이 다름 용어 여러 개발 팀에서 개발한 각각의 단위 모듈을 대상 모듈-모듈 간의 결합을 테스트 모듈의 결합 순서에 따라 방법이 다름 빅뱅(big-bang) 하향식(top-down) 상향식(bottom-up) 연쇄식(threads) 용어 드라이버 시험 대상 모듈을 호출하는 간이 소프트웨어 스텁 시험 대상 모듈이 호출하는 또 다른 모듈
빅뱅 통합 한 번에 모든 모듈을 모아 통합 장점 단점 고도의 신뢰도가 요구되는 시스템의 경우 중요 부분을 먼저 구현하기 때문에 의뢰자에게 신뢰감을 줄 수 있음. 중요 부분을 먼저 구현함으로써 여러 번 테스트가 반복되어 완고한 개발이 가능함 단점 오류의 위치와 원인을 찾기 어려움 단위 테스트에 많은 시간과 노력이 듬 준비해야 할 드라이버/스텁 수가 많음 개발 진도를 예측하기 어려움
하향식 통합 시스템 구조상 최상위에 있는 모듈부터 통합 장점 단점 중요한 모듈의 인터페이스를 조기에 테스트 중요한 모듈의 인터페이스를 조기에 테스트 스텁을 이용하여 시스템 모습을 일찍 구현가능 개발자 입장에서 용이함 단점 입출력 모듈이 상대적으로 하위에 있음 테스트 케이스 작성 및 실행이 어려움 중요 기능이 마지막에 구현됨
상향식 통합 시스템 구조상 최하위에 있는 모듈부터 통합 장점 단점 점증적 통합 방식 하위층 모듈을 상위층보다 더 많이 테스트 오류 발견이 쉬움 하드웨어 사용 분산 하위층 모듈을 상위층보다 더 많이 테스트 단점 초기에 시스템의 뼈대가 갖추어 지지 않음 상위층의 중요한 인터페이스가 마지막에 가서야 확인 가능 의뢰자에게 시스템을 시험해 볼 기회를 충분히 제공하지 못함
연쇄식 통합 특정 기능을 수행하는 모듈의 최소 단위(thread)로 부터 시작 상대적으로 중요한 모듈부터 개발 장점 입력, 출력 어느 정도의 기본 기능을 수행하는 모듈 상대적으로 중요한 모듈부터 개발 장점 초기에 시스템의 골격이 형성 사용자 의견을 빨리 확인 가능 시스템을 나누어 개발 하기 쉽다
9.6 시스템 및 인수 테스팅 컴포넌트 통합 후 수행하는 테스트 기법 테스트 종류 기능 테스트 성능 테스트 보안 테스트 사용성 테스트 인수 테스트 설치 테스트
기능 테스트 기능적 요구와 시스템의 차이를 발견하기 위한 테스트 사용자와 관련되어 있으며 오류를 유발할 가능성이 많은 테스트를 선정 사용사례 모델을 검토하고 오류를 일으킬만한 사용사례 인스턴스를 찾아낸다. 테스트 케이스 일반적인 사례 예외적인 사례
기능 테스트 기능 테스트 케이스 작성 과정
성능 테스트 시스템의 여러 측면 테스트 작업 부하(workload) 처리량(throughput) 시스템이 처리하고 생성하는 작업의 양 처리량(throughput) 트랜잭션 의 수 시간 당 처리하는 메일 수 반응 시간(response time) 시스템 요구를 처리하는 데 걸리는 총 시간 효율성 주어진 작업 처리를 위한 CPU시간과 메모리 같은 자원의 량의 비율 자원 효율성
성능 테스트 테스트 방법 스트레스 테스팅 성능 테스팅 보안 테스팅 시스템 처리능력의 몇 배의 작업부하를 처리하고 견딜 수 있는지 측정 성능 테스팅 정상적인 사용 환경에서 시스템의 성능을 측정하는데 사용 시뮬레이션을 이용한 테스팅 가능 보안 테스팅 시스템의 보안 취약점을 찾아내려는 목적
사용자 인터페이스 테스트 기능, 성능, 보안 테스트와 목적이 다름 테스트 목적 인간 공학적인 목적 보고 느끼는 UI에 대한 결함 데이터 입력과 출력 디스플레이에 대한 결함 액터-시스템 사이의 동작 결함 오류 처리에 대한 결함 문서와 도움말에 대한 결함
인수 테스트 시스템을 당장 사용할 수 있도록 모든 준비가 되어 있는지 확인 개발자를 제외한 의뢰자 또는 대리인이 테스트 수행 시스템 요구 분석서를 기반으로 한 테스트 수행 실제 업무 절차를 따라 테스트 수행 테스트 유형 알파 테스트 선택된 사용자가 개발 환경에서 시험하는 것 베타 테스트 선택된 사용자가 외부 환경에서 시험하는 것(필드 테스팅)
9.7 테스트 도구 테스트 작업을 자동화 도구 종류 코드 분석 도구 테스트 케이스 생성 도구 테스트 케이스 실행 도구 단위 테스트 도구
코드 분석 도구 정적 분석 도구 프로그램을 실행하지 않고 분석 코드 분석 도구 구조 검사 도구 데이터 분석 도구 원시 코드의 문법 검사 구조 검사 도구 원시코드의 그래프를 이용한 구조적인 결함 확인 데이터 분석 도구 원시코드를 검사하여 잘못된 링크나 데이터 정의의 충돌, 잘못된 데이터의 사용을 발견 순서 검사 도구 이벤트 순서가 올바른지 체크
코드 분석 도구 동적 분석 도구 프로그램을 실행하면서 분석 프로그램이 수행되는 동안 이벤트의 상태 파악을 위한 특정한 변수나 조건의 스냅샷(snapshot)을 생성 시스템의 성능 또는 기능에 영향을 주는 분기점(breakpoint) 파악에 도움 모듈의 호출 횟수나 수행된 문장 번호를 리스트로 만들어 줌 테스트 만족도를 평가하는 지표
테스트 케이스 생성 도구 테스트 케이스를 자동으로 생성 도구 유형 자료 흐름도 기능 테스트 방법 입력 도메인 분석 랜덤 테스트 자료 흐름도를 이용하여 define-use 관계를 찾음 기능 테스트 방법 주어진 기능을 구동시키는 모든 가능한 상태를 파악하여 이에 대한 입력을 작성 입력 도메인 분석 원시코드의 내부를 참조하지 않고 입력 변수가 가질 수 있는 값의 도메인을 분석 랜덤 테스트 입력 값을 무작위로 추출하여 테스트
테스트 케이스 실행 도구 테스트 작업 수행이나 계획을 도와줌 도구 유형 캡처 및 리플레이 스텁과 드라이버 자동 테스트 환경 미리 입력된 입력 값을 이용하여 실행하고 결과를 캡처하여 비교 스텁과 드라이버 자동으로 스텁, 드라이버를 생성 자동 테스트 환경 통합된 테스트 환경
단위 테스트 도구 XUnit 등 다양한 언어로 작성된 프로그램의 단위 테스트와 리그레션 테스트를 지원 테스트 케이스와 테스트 결과의 체크를 한데 묶은 패키지 테스트 케이스의 반복 실행가능(리그레션 테스트)
Questions?