정보처리기사

[정보처리기사] 소프트웨어 구축 (6)

hminor 2023. 7. 5. 19:09

애플리케이션 테스트케이스 설계

  • 소프트웨어 테스트
    • 개념
      • 구현된 소프트웨어의 동작과 성능, 사용성, 안정성 등을 만족하기 위해 소프트웨어의 결함을 찾아내는 활동
    • 소프트웨어 테스트 필요성
      • 오류 발견 관점
      • 오류 예방 관점
      • 품질 향상 관점
    • 스포트웨어 테스크의 기본 원칙
      • 테스팅은 결함이 존재함을 밝히는 활동
      • 완벽한 테스팅은 불가능하다
      • 테스팅은 개발 초기에 시작해야 한다.
      • 결함 집중(Defect Clustering)
        • 애플리케이션 결함의 대부분은 소수의 특정한 모듈에 집중되어 존재한다
        • 파레토 법칙: 전체 결과의 80%가 전체 원인의 20%에서 일어나는 현상
      • 살충제 패러독스(Presticide Paradox)
        • 동일한 테스트 케이스로 반복 실행하면 결함을 발견할 수 없으므로 주기적으로 테스트케이스를 리뷰하고 개선해야 한다.
      • 테스팅은 정황(Context)에 의존한다.
        • 정황과 비즈니스 도메인에 따라 테스트를 다르게 수행해야 한다.
      • 오류 부재의 궤변(Absence of Errors Fallacy)
        • 사용자의 요구사항을 만족하지 못하는 오류를 발견하고 그 오류를 제거하였다 해도, 해당 애플리케이션의 품질이 높다고 말할 수 없다.
  • 테스트 오라클
    • 개념
      • 테스트의 결과가 참인지 거짓인지를 사전에 정의된 참 갑을 입력하여 비교하는 기법
    • 테스트 오라클의 유형
      • 참 오라클
        • 항상 참이 되어야 하는 테스트
        • 모든 테스트 케이스 입력값의 기대 결과를 확인
        • 항공기, 임베디드, 발전소 소프트웨어 등 크리티컬한 업무
      • 샘플링 오라클
        • 특정한 몇 개의 입력 값에 대해서만 기대하는 결과를 제공해 주는 오라클
        • 일반, 업무용, 게임, 오락 등의 일반적인 업무
      • 휴리스틱 오라클
        • 샘플링 오라클을 개선한 오라클
        • 특정 입력 값에 대해 올바른 결과를 제공하고, 나머지 값들에 대해서는 휴리스틱(추정)으로 처리하는 오라클
      • 일관성 검사 오라클
        • 어플리케이션 변경이 있을 때, 수행 전과 후의 결과 값이 동일한지 확인하는 오라클
  • V 모델 (테스트 레벨)
    • 단위 테스트
      • 정적 테스트: 시스템 소스 코드 내부를 보며 테스트
      • 동적 테스트: 시스템 소스 코드의 동작을 보며 테스트
    • 통합 테스트
      • 하향식 테스트
        • 스텁
      • 상향식 테스트
        • 드라이버
      • 빅뱅 테스트
      • 백본 테스트
    • 시스템 테스트
      • 기능 테스트
      • 인수 테스트
    • 인수 테스트
      • 알파 테스트
      • 베타 테스트
  • 프로그램 실행 여부
    • 정적 테스트
      • 소프트웨어의 실행 없이 소스코드의 구조를 분석하여 논리적으로 검증하는 테스트
    • 동적 테스트
      • 소프트웨어를 실행하여 실제 발생하는 오류를 발견하여 문제를 해결하는 분석 기법
  • 테스트 기법
    • 화이트박스 테스트
      • 개념
        • 소프트웨어의 내부 구조와 동작을 검사하는 테스트 방식
        • 소스 코드 내부를 보는 테스트
      • 기법
        • 문장 검증: 프로그램의 모든 문장을 한 번 수행하여 검증
        • 선택 검증: 선택하는 부분만 검증
        • 경로 검증: 수행 가능한 모든 경로 검증
        • 조건 검증: 조건이나 반복문 내 조건식을 검사
      • 기초 경로 검사
        • McCabe가 제안한 것으로 대표적인 화이트박스 테스트 기법
        • 값 구하는 방법: 변으로 둘러싸여 있는 면의 개수 + 1
    • 블랙박스 테스트
      • 개념
        • 프로그램의 요구사항 명세를 보면서 테스트**, 주로 구현된 기능을 테스트**
        • 동작 상태를 보며 테스트
      • 기능
        • 동등 분할 기법
          • 입력 자료에 초점을 맞춰 테스트 케이스를 만들어 검사하는 방법
          • ex) 90 ~ 100 =⇒ 95
        • 경계값 분석 기법
          • 입력 값의 중간값보다 경계값에서 오류가 발생할 확률이 높다는 점을 이용
          • ex) 90 ~ 100
            • 89,90,91, 99, 100, 101
        • 원인 효과 기법
          • 입력 데이터 간의 관계와 출력에 영향을 미치는 상황을 체계적으로 분석한 다음 효용성이 높은 테스트 케이스를 선정하여 검사하는 기법
        • 오류 예측 검사
          • 과거의 경험이나 테스터의 감각으로 테스트하는 기법
        • 비교 검사 기법
          • 여러 버전의 프로그램에 동일한 테스트 자료를 제공하여 동일한 결과가 출력되는지 테스트하는 기법
    • 테스트에 대한 시각
      • 검증(Verification)
        • 소프트웨어의 개발 과정을 테스트
        • 개발자
      • 확인(Validation)
        • 완성된 소프트웨어의 결과를 테스트
        • 사용자
    • 테스트 목적
      • 회복 테스트
        • 시스템에 고의로 실패를 유도하고 시스템이 정상적으로 복귀하는지 테스트
      • 안전 테스트
        • 불법적인 소프트웨어가 접근하여 시스템을 파괴하지 못하도록 소스 코드 내의 보안적인 결함을 미리 점검하는 테스트
      • 강도 테스트
        • 시스템에 과다 정보량을 부과하여 과부하 시에도 시스템이 정상적으로 작동되는지 검증하는 테스트
      • 성능 테스트
        • 시스템의 응답하는 시간, 처리량, 반응속도 등을 테스트
      • 구조 테스트
        • 시스템의 내부 논리 경로, 소스코드 복잡도를 평가하는 테스트
      • 회귀 테스트
        • 변경 또는 수정된 코드에 대해 새로운 결함 발견 여부를 평가하는 테스트
      • 병행 테스트
        • 변경된 시스템과 기존 시스템에 동일한 데이터를 입력 후 결과를 비교하는 테스트
      • A/B 테스트
        • 기존 서비스 A와 새로 적용하고 싶은 B 서비스를 통계적인 방법으로 비교해 새로운 서비스가 기존 서비스에 비해 정말 효과가 있는지 알아보는 테스트
      • 스모크 테스트
        • 본격적인 테스트 수행에 앞서 테스트 환경의 테스트가 가능한지 여부를 판단하기 위해 간단하게 테스트
    • 테스트 종류
      • 명세 기반 테스트
        • 주어진 명세를 빠짐없이 테스트 케이스로 구현하고 있는지 확인하는 테스트
      • 구조 기반 테스트
        • 소프트웨어 내부 논리 흐름에 따라 테스트 케이스를 작성하고 확인하는 테스트
      • 경험 기반 테스트(QA)
        • 경험이 많은 테스터의 직관과 기술 능력을 기반으로 수행하는 테스트
  • 테스트 커버리지
    • 개념
      • 테스트를 얼마나 수행했는지 측정하는 기준
    • 테스트 커버리지 유형
      • 기능 기반 커버리지
        • 애플리케이션의 전체 기능을 모수로 설정하고, 테스트가 수행된 기능의 수를 측정.
      • 라인 커버리지
        • 애플리케이션 전체 소스코드의 Line수를 모수로 설정하고, 테스트가 수행된 소스코드의 Line 수를 측정
      • 코드 커버리지
        • 소스코드의 구문, 조건, 결정 등의 코드 구조 자체가 얼마나 테스트되었는지를 측정하는 방법
        • 유형
          • 구문 커버리지
            • 코드 구조 내의 모든 구문에 대해 한 번 이상 수행하는 테스트 커버리지
            • 예를 들어 모든 구문이 있고 조건이 맞지 않아 내부 코드로 들어가지 못할 경우 해당 구문을 빼고 수행을 한 구문만 카운팅
          • 조건 커버리지
            • 결정 포인트 내의 모든 개별 조건식에 대해 수행하는 테스트 커버리지
            • 개별 조건식에 각각 True, False이며 때 결정 포인트의 값이 어떠하든 상관 없다.
            • 결정 포인트: if 안의 문이 참이 나올지 거짓이 나올지
            • 개별 조건식: if 의 조건 각각에 대한 것
          • 결정 커버리지
            • 결정 포인트 내의 모든 분기문에 대해 수행하는 테스트 커버리지
            • 개별 조건식은 상관 없이, 결정 포인트만 True, False가 나오면 된다.
          • 조건/결정 커버리지
            • 결정 포인트, 개별 조건식 각각 모두 True, False가 나와야 한다.
          • 변경 조건/결정 커버리지
            • 모든 결정 포인트 내의 개별 조건식은 적어도 한 번 T/F를 가져야 한다.
            • 조건/결정 커버리지처럼 결정 포인트, 개별 조건식 각각 모두 True, False가 나와야 하는데 적어도 한번만 나오면 된다.
          • 다중 조건 커버리지
            • 결정 포인트 내 모든 조건식의 가능한 조합을 100% 보장해야 한다.
  • 결함관리 도구
    • 개념
      • 각 단계별 테스트 수행 후 발생한 결함의 재발 방지를 위해, 유사 결함 발견 시 처리 시간 단축을 위해 결함을 추적하고 관리할 수 있게 해주는 도구
    • 결함관리 프로세스
      • 에러 발견
      • 에러 등록
      • 에러 분석
      • 결함 확정
      • 결함 할당
      • 결함 조치
      • 결함 조치 검토 및 승인
  • 테스트 자동화 도구
    • 개념
      • 테스트 작업을 스크립트 형태로 구현하여 테스트를 반복 수행
    • 테스트 자동화 도구 유형
      • 정적 분석 도구
        • 애플리케이션을 실행하지 않고 분석하는 도구
        • 코딩 표준, 코딩 스타일, 복잡도 및 남은 결함을 발견하기 위하여 사용
      • 테스트 실행 도구
        • 테스트를 위해 작성된 스크립트를 실행
      • 성능 테스트 도구
        • 많은 수의 가상의 사용자를 생성해서 부하를 테스트
      • 테스트 통제 도구
        • 테스트 관리 도구: 테스트 계획 및 관리
        • 형상 관리 도구: 테스트 수행에 필요한 데이터와 도구를 관리
        • 결함 추적/관리 도구: 테스트에서 발생한 결함에 대해 관리하거나 협업을 지원
      • 테스트 장치(Test Harness)
        • 개념
          • 애플리케이션 컴포넌트 및 모듈을 테스트하는 환경의 일부분
          • 테스트를 지원하기 위한 코드와 데이터
        • 구성요소
          • 테스트 드라이버: 상향식 테스트
          • 테스트 스텁: 하향식 테스트
          • 테스트 슈트: 테스트 케이스의 집합
          • 테스트 케이스: 입력 값, 실행 조건, 기대 결과 등의 집합
          • 테스트 스크립트: 자동화된 테스트 실행 절차에 대한 명세
          • 목 오브젝트
            • 사용자의 행위를 조건부로 사전에 입력해 두면, 그 상황에 예정된 행위를 수행하는 객체
            • 목만 있다고 생각하면 결과는 없지만 조건에 맞는 행위를 수행할 수 있다.
  • 통합 테스트
    • 개념
      • 단위테스트가 끝난 모듈을 통합하는 과정에서 발생할 수 있는 오류를 찾는 테스트 기법
    • 통합 테스트 수행 방법의 분류
      • 점증적 방식
        • 상향식 테스트 통합 테스트
        • 하향식 테스트 통합 테스트
      • 비 점증적 방식
        • 빅뱅 테스트 통합 테스트

애플리케이션 성능 개선

  • 애플리케이션 성능 저하 원인
    • 데이터베이스 관련 성능 저하
      • 데이터베이스 락(DB Lock)
        • 대량의 데이터 조회, 과도한 업데이트 시 발생하며, Lock 해제 시까지 대기하거나 타임아웃 된다.
      • 불필요한 패치(DB Fetch)
        • 결과 세트에서 커서를 옮기는 작업이 빈번할 때 발생
      • 연결 누수(Connection Leack)
        • DB Connection 사용 후 반환하지 않을 경우 발생
        • Connection Pool 크기가 너무 작거나 크게 설정된 경우 발생
  • 애플리케이션 성능 분석
    • 애플리케이션 성능 분석 지표
      • 처리량
      • 응답 시간
      • 반환 시간
      • 자원 사용률
    • 성능 분석 도구
      • JMeter
        • HTTP, FTP(File Transfer Protocol) 등 다양한 프로토콜을 지원하는 부하 테스트 도구
      • LoadUI
        • 웹 서비스의 로드 테스트
        • 테스트 형태에 따른 분산 UI 제공
        • UI를 통하여 동시 및 별도의 결과보고 제공 가능
      • OpenSTA
        • HTTP, HTTPS 프로토콜에 대한 부하 테스트 및 생산품 모니터링 도구
    • 모니터링 도구
      • Scouter
        • 단일 뷰 통합/실시간 모니터링
      • NMon
        • 리눅스 서버 자원에 대한 모니터링 도구
      • Zabbix
        • 웹기반 서버, 서비스, 애플리케이션 모니터링 도구
      • Jeniffer
        • 애플리케이션에서 서버로 유입되는 트랜잭션 수량, 처리시간, 응답시간, 자원 활용률 등을 모니터링
  • 정형 기술 검토회의(FTR, Formal Technical Review)
    • 개념
      • 소프트웨어 엔지니어가 수행하는 소프트웨어 품질보증 활동
    • 목적
      • 산출물 요구사항 일치여부
      • 소프트웨어가 미리 정한 기준에 따라 표현되었는가를 확인
      • 소프트웨어의 표현에 대한 기능, 논리적 오류
      • 프로젝트를 보다 관리하기 쉽게 만든다.
  • 소스 코드 품질 분석
    • 개념
      • 소스 코드 품질 분석을 통해 리팩토링이 이루어진다.
    • 종류
      • 동료검토
      • 워크스루
      • 인스펙션
    • 소스코드 품질 분석 도구 종류
      • 정적 분석 도구
        • PMD
        • CppCheck
        • SonarQube
        • Checkstyle
        • ccm
        • cobertura
      • 동적 분석 도구
        • Avalanche
        • Valgrind