중요한 것 정리

소프트웨어 테스트(정적, 동적 등), 테스트 오라클, 테스트 레벨(단위, 통합, 시스템, 인수), 테스트 자동화, 커버리지, 애플리케이션 성능

애플리케이션 테스트

소프트웨어 테스트

개념

오류 발견, 예방, 품질 향상을 위해 수행하는 테스트로, 애플리케이션이 사용자의 요구사항을 만족하는지 확인하고 결함을 찾아내는 활동이다.

기본 원칙

완존초집 정살오

  • 완벽한 테스팅은 불가능
  • 테스팅은 결함이 존재함을 밝히는 것, 줄이는 활동
  • 개발 초기에 테스팅 시작
  • 결함집중(파레토 법칙, 80대 20)
  • 테스팅은 정황에 의존적
  • 살충제 패러독스
  • 오류-부재의 궤변

프로세스

테스트 계획 → 테스트 분석 및 디자인 → 테스트 케이스 및 시나리오 작성 → 테스트 수행 → 테스트 결과 평가 및 리포팅

산출물

테스트 계획서, 테스트 베이시스(요구사항 명세서 등 기준 문서), 테스트 케이스, 테스트 슈트(테스트 케이스의 집합), 테스트 시나리오(테스트 상황), 테스트 스크립트(테스트 실행 순서), 테스트 결과서

테스트 케이스 작성 절차

테스트 계획 검토 및 자료 확보 → 위험평가 및 우선순위 결정 → 테스트 요구사항 정의 → 테스트 구조 설계 및 방법 결정 → 테스트케이스 정의 → 테스트 케이스 타당성 확인 및 유지보수

테스트 유형

  • 프로그램 실행 여부에 따라 정적 테스트와 동적 테스트로 나뉨
  • 테스트 종류에 따라 명세 기반, 구조 기반, 경험 기반 테스트로 나뉨
  • 테스트 시각에 따라 검증과 확인으로 나뉨
  • 테스트 목적에 따라 회복, 안전, 성능, 구조, 회귀, 병행 테스트로 나뉨

정적 테스트

정적 분석(Static Analysis)

개념

자동화된 도구를 이용해 오류를 판별하거나 복잡도를 측정하는 테스트 방식.

유형

  • 코딩 표준
  • 복잡도 측정
  • 자료 흐름 분석

리뷰(Review)

개념

전문가 혹은 개발자에 의해 수행되는 테스트로, 사람이 직접 보며 오류를 검출하거나 진행 상황을 점검하는 방식.

유형

  • 인스펙션(Inspection)
    • 동료 검토(Peer Review)라고도 함.
    • 코드 저작자 외의 제3자가 검사하는 방식.
  • 워크스루(Walk Through)
    • 회의 전 검토 자료를 나눠준 뒤, 짧은 시간 동안 회의를 하며 검토하는 방식.
  • 감사(Audit)
    • 표준, 규제, 가이드라인 등을 준수하는지 평가하며, 제3기관이 수행.
  • 관리 리뷰(Management Review)
    • 프로젝트 전반에 대한 검토, 리뷰
  • 기술 리뷰(Technical Review)
    • 기술적으로 잘 구현되고 있는지, 표준은 지키고 있는지 등에 대한 검토, 리뷰

동적 테스트

화이트박스(White-Box Test)

개념

내부 구조와 동작을 검사하는 테스트로, 코드를 최소 한 번씩 모두 수행해보며 반복문, 제어문 등의 논리 경로를 확인하는 행위.

구조 기반 테스트, 코드 기반 테스트, 로직 기반 테스트, 글래스 박스 테스트라고도 불린다.

유형

  • 구문/문장 커버리지(Statement Coverage)
    • 모든 명령문을 한번 이상씩 수행하는 것. 조건문의 실행 개수로 계산
  • 결정/선택/분기 커버리지(Decision/Branch Coverage)
    • 전체 조건식이 적어도 한 번은 참/거짓의 결과를 수행하는 것.
  • 조건 커버리지(Condition Coverage)
    • 개별 조건식이 적어도 한 번은 참/거짓의 결과를 수행하는 것.
  • 조건/결정 커버리지(Condition/Decision Coverage)
    • 전체&개별 조건식이 적어도 한 번은 참/거짓의 결과를 수행하는 것.
  • 변경 조건/결정 커버리지(Modified Condition/Decision Coverage)
    • 개별 조건식이 다른 개별 조건식과 무관하게 독립적으로 전체 조건식에 영향을 미치는지 확인하는 것.
  • 다중 조건 커버리지(Multiple Condition Coverage)
    • 결정 조건 안의 모든 개별 조건식들의 가능한 조합을 보장하는 것.
  • 기본 경로 커버리지(Base Path Coverage)
    • 가능한 모든 경로를 테스트하는 것. 멕케이브(McCabe)의 순환복잡도
  • 제어 흐름 테스트(Control Flow Testing)
    • 제어 구조를 그래프 형태로 만들어 로직을 테스트하는 것.
  • 데이터 흐름 테스트(Data Flow Testing)
    • 제어 흐름 그래프 + 사용 현황 ⇒ 그래프로 만들어 테스트하는 것.
  • 반복 구조(루프) 테스트
    • 반복 구조에 초점을 맞추어 테스트하는 것.

cf) 순환복잡도(Cyclomatic Complexity) : 프로그램 복잡도. 분기 수와 노드 수에 따라 달라짐.

V(G) = E - N + 2 (E = Edge, N = Node)

V(G) = P + 1 (P = 분기)

블랙박스 테스트(Black-Box Test)

개념

명세 테스트라고도 불리며, 프로그램의 기능 및 동작 위주로 사용자 요구사항 명세를 보면서 테스트를 수행한다.

유형

  • 동등분할 테스트(Equivalence Partitioning Testing, 동치 분할 테스트, 균등 분할 테스트, 동치 클래스 분해 테스트)
    • 유사한 도메인으로 유효/무효값을 그룹지어 대푯값 테스트 케이스를 도출하고 테스트하는 것.
  • 경곗값 분석 테스트(Boundary Value Analysis Testing)
    • 최솟값과 최댓값과 같은 경곗값, 그리고 그 근처의 입력값을 테스트 케이스로 테스트하는 것.
  • 결정 테이블 테스트(Decision Table Testing)
    • 요구사항의 조건, 논리 등을 테이블로 만들어 모든 경우의 수를 테스트하는 것.
  • 상태 전이 테스트(State Transition Testing)
    • 객체의 상태가 이벤트에 의해 어떻게 변화하는지 상태 전이도를 통해 따져 테스트하는 것.
  • 유스케이스 테스트(Use Case Testing)
    • 실제 사용될 유스케이스에 따라 테스트를 수행하는 것.
  • 분류 트리 테스트(Classification Tree Method Testing)
    • 소프트웨어의 일부 또는 전체를 트리 구조로 만들어 설계하고 테스트하는 것.
  • 페어와이즈 테스트(Pairwise Testing)
    • 테스트 데이터값을 최소한 한번씩 조합하는 방식으로, 상대적으로 적은 양의 테스트를 구성할 때 사용.
  • 원인-결과 그래프 테스트(Cause-Effect Graphing Testing)
    • 그래프를 통해 효용성이 높은 입력 데이터 테스트케이스를 활용하는 것.
  • 비교 테스트(Comparison Testing)
    • 여러 버전에 같은 입력값을 넣어 같은 결과가 나오는지 테스트하는 것.

종류에 따른 분류

명세 기반 테스트

요구사항 명세서를 기반으로 함.

블랙박스 테스트(동등 분할, 경곗값 분석, 결정 테이블, 상태 전이, 유스케이스, 분류 트리, 페어와이즈, 원인-결과 그래프, 비교 테스트)

구조 기반 테스트

내부 논리 흐름을 기반으로 함.

화이트박스 테스트(구문, 결정, 조건, 조건/결정, 변경 조건/결정, 다중 조건, 기본 경로 커버리지, 제어 흐름, 데이터 흐름 테스트)

경험 기반 테스트

유사한 테스트에서 얻은 경험과 직감을 기반으로 함.

블랙박스 테스트(탐색적, 오류추정, 체크리스트, 특성 테스트)

  • 탐색적 테스트(Explaratory Test) : 경험에 바탕을 두고 탐색적으로 기능 수행해보며 테스트
  • 오류 추정(Error Guessing) : 경험과 직관을 바탕으로 개발자가 할법한 실수 추정. 다른 테스트와 병행
  • 체크리스트(Checklist) : 목록화, 재사용 목적으로 평가 내용과 경험 나열
  • 특성테스트(Characteristic Test) : 품질 특성을 기반으로 경험적으로 테스트

목적에 따른 분류

  • 회복 테스트(Recovery Testing) : 고의로 오류 → 정상 복귀하는지 테스트
  • 안전 테스트(Security Testing) : 보안 결함 미리 테스트
  • 성능 테스트(Performance Testing) : 응답 시간, 반응 속도, 업무량 등의 성능 테스트
    • 부하 테스트(임계점 찾기), 스트레스 테스트, 스파이크 테스트(짧은 시간에 몰릴 때), 내구성 테스트
  • 구조 테스트(Structure Testing) : 내부 논리, 소스코드 복잡도 평가하는 테스트
  • 회귀 테스트(Regression Testing) : 오류 확인, 제거, 수정을 반복하는 테스트
  • 병행 테스트(Parallel Testing) : 동일 데이터 입력 후 결과 비교하는 테스트

테스트 오라클

개념

테스트의 결과가 참인지 거짓인지 판별하기 위해 사전에 정의된 참값을 입력해 비교하는 기법.

종류

  • 참(True) 오라클 : 모든 입력값에 대한 결과 생성, 오류 전체 검출
  • 샘플링(Sampling) 오라클 : 특정 몇 개의 입력값에 대한 결과 생성
  • 휴리스틱(Heuristic) 오라클 : 샘플링 개선. 특정 몇 개에 대해선 참인 결과, 나머지에 대해선 추정처리
  • 일관성 검사(Consistent) 오라클 : 변경 전과 후의 결괏값이 동일한지 확인

테스트 레벨

개념

개발 단계와 대응하는 테스트의 집합

종류

단위, 통합, 시스템, 인수 테스트

단위 테스트

⇒ 개발 중에 수행

  • 단위 모듈, 서브 루틴, 컴포넌트 등 테스트.
  • 주로 구조 기반 테스트(화이트박스), 명세 기반 테스트(블랙박스)도 함.
  • 객체지향 프로그래밍에서 컴포넌트 테스트 수행 시 ‘목 객체’ 필요
    • 더미 객체(객체만 필요하고 기능은 필요없을때), 테스트 스텁(Stub, 기능 단순히 수행), 테스트 드라이버(Driver, 하위 모듈 호출, 파라미터 전달, 결과 도출), 테스트 스파이(Spy, 출력 검증), 가짜 객체(Fake, 실제 기능 전체 혹은 일부 단순하게 구현)

통합 테스트

⇒ 설계

  • 모듈간 인터페이스, 컴포넌트 간 상호작용 테스트.
  • 빅뱅 테스트, 샌드위치 테스트, 상향식 테스트, 하향식 테스트
    • 하향식(Top Down) : 메인에서 아래로 내려가면서. DFS, BFS. 최하위 모듈 = 스텁(Stub)
    • 상향식(Bottom Up) : 최하위에서 위로. 하위 모듈 = 드라이버(Driver)
    • 샌드위치 : 상 + 하. 병렬테스트 가능. 스텁과 드라이버 필요성 높음. 그래서 비쌈.

시스템 테스트

⇒ 기계 명세 분석

  • 통합된 기능이 시스템에서 잘 수행되는지 테스트.
  • 기능/비기능 요구사항 테스트

인수 테스트

⇒ 요구사항 분석

  • 요구사항에 만족하는지 테스트
  • 계약 인수, 규정 인수, 사용자 인수, 알파테스트(개발자 통제 환경, 사용자와 개발자 함께 테스트), 베타 테스트(사용자가 테스트하고 피드백 받음)

테스트 자동화

정적 분석 도구(Static Analysis Tools)

  • 실행X 분석O
  • 소스코드 코딩 표준, 스타일, 코드 복잡도 등에 대한 분석
  • 구조 검사 도구 / 데이터 분석 도구 / 순서 검사 도구
  • pmd, cppcheck, SonarQube, checkstyle, ccm, cobertura (↔ 동적 분석 도구 : Avalanche, Valgrind)

테스트 실행 도구(Test Execution Tools)

  • 테스트 방법이 담긴 스크립트 실행
  • 데이터 주도 접근 방식, 키워드 주도 접근 방식

성능 테스트 도구(Performance Test Tools)

  • 가상의 사용자 생성, 처리량, 응답 시간, 경과 시간, 자원 사용률 등에 대한 추적.
  • 성능 목표 달성했는지 확인

테스트 통제 도구(Test Control Tools)

  • 테스트에 필요한 이것저것,,,

테스트 하네스(Test Harness)

  • 컴포넌트 및 모듈 테스트하는 환경. 테스트 지원을 위한 코드와 데이터.
  • 단위/모듈 테스트 시 개발자가 생성해 사용.
  • 테스트 드라이버(Driver), 테스트 스텁(Stub), 테스트 슈트(Suites), 테스트 케이스, 테스트 스크립트, 목 오브젝트(Mock Object)

테스트 커버리지

개념

테스트의 정확성과 신뢰성 향상을 목적으로 테스트 범위를 측정하는 품질 측정 기준.

유형

  • 기능 기반 커버리지 : 실제 수행된 기능의 수
  • 라인 커버리지 : 수행된 코드 라인 수
  • 코드 커버리지 : 총체적으로 얼마나 테스트됐는지
    • 구문 커버리지, 결정 커버리지, 조건 커버리지, 조건/결정 커버리지 변경 조건/결정 커버리지, 다중 조건 커버리지 ⇒ 화이트박스 테스트

애플리케이션 성능

지표

처리량, 응답 시간, 경과 시간, 자원 사용률

성능 테스트 수행 절차

성능 테스트 도구 설치 → 테스트 환경 설정 → 시나리오 생성 → 성능 테스트 실행 및 모니터링

애플리케이션 성능 개선

배드 코드(Bad Code)

  • 외계인 코드 - 아주 오래되거나 문서/개발자가 없어 유지보수 어려운 코드
  • 스파게티 코드 - 작동은 하지만 내부 코드를 이해하기 어려운 코드
  • 로직 중복, 알 수 없는 변수 명 등

클린 코드(Clean Code)

  • 가독성, 단순성, 의존성 최소, 중복성 제거, 추상화
  • 의미 있는 이름, 간결하고 명확한 주석, 보기 좋은 배치, 작은 함수, 오류 처리, 클래스 분할 배치, 느슨한 결합 등

리팩토링(Refactoring)

  • 복잡한 코드의 단순화, 유지보수성 향상, 유언한 시스템, 생산성 향상, 품질 향상

참고

수제비 2021 정보처리기사 실기

댓글남기기