티스토리 뷰

소프트웨어 테스팅

정적 테스트

coudeliv 2025. 1. 12. 23:30

Keywords

이상현상(anomaly), 동적 테스트(dynamic testing), 공식 리뷰(formal review), 비공식 리뷰(informal review), 검사(inspection), 리뷰(review), 정적 분석(static analysis), 정적 테스트(static testing), 기술 리뷰(technical review), 워크스루(walkthrough) 

 

정적 테스트


1. 정적 테스트 기본 개념

정적 테스트는 동적 테스트와 달리 테스트 대상 소프트웨어를 실행할 필요가 없다. 코드를 비롯하여 프로세스 명세, 시스템 아키텍처 명세, 기타 작업 산출물을 수동으로 검사(예: 리뷰)하거나 도구(예: 정적 분석)를 사용하여 평가한다.
테스트 목표는 품질을 개선하고, 결함을 감지하며, 가독성, 완전성, 정확성, 테스트 가능성, 일관성과 같은 특성을 평가하는 것이다. 정적 테스트는 검증(verification)과 검증(validation) 모두에 적용할 수 있다.

테스터, 비즈니스 대표, 개발자는 예제 매핑, 협업 사용자 스토리 작성, 백로그 정제 세션 동안 협력하여 사용자 스토리 및 관련 작업 산출물이 정의된 기준(예: 준비 완료 정의(Definition of Ready))을 충족하는지 확인한다.
정적 분석은 동적 테스트 전에 문제를 식별할 수 있으며, 테스트 케이스가 필요하지 않아 더 적은 노력을 요구하는 경우가 많다. 또한, 정적 분석은 지속적 통합(CI) 프레임워크에 통합되어 사용하는 경우가 많다. 주로 코드 결함을 감지하는 데 사용되지만, 유지보수성 및 보안성을 평가하는 데도 활용된다.


1-1. 정적 테스트로 검토할 수 있는 작업 산출물

정적 테스트는 거의 모든 작업 산출물을 검토할 수 있다.

  • 요구사항 명세서, 소스 코드, 테스트 계획, 테스트 케이스
  • 제품 백로그 항목, 테스트 차터, 프로젝트 문서, 계약서, 모델

다만, 정적 분석을 위해서는 산출물이 특정 구조(예: 모델, 코드, 형식적 구문)를 가져야 한다.
정적 테스트에 적합하지 않은 산출물로는 사람이 해석하기 어려운 항목이나 법적 이유로 도구로 분석할 수 없는 제3자 실행 파일 등이 있다.


1-2. 정적 테스트의 가치

정적 테스트는 SDLC 초기 단계에서 결함을 감지할 수 있어 조기 테스트 원칙을 실현한다. 또한 동적 테스트로는 감지할 수 없는 결함(예: 도달 불가능한 코드, 설계 패턴 미준수, 실행 불가능한 작업 산출물의 결함)을 발견할 수 있다.

정적 테스트는 작업 산출물의 품질을 평가하고 신뢰를 구축할 수 있다. 문서화된 요구사항을 검증함으로써 이해관계자들은 해당 요구사항이 실제 요구를 반영하는지 확인할 수 있다.
정적 테스트는 SDLC 초기에 수행될 수 있어 관련 이해관계자 간의 공통 이해를 형성하며, 의사소통을 개선한다. 다양한 이해관계자를 정적 테스트에 참여시키는 것이 권장된다.

리뷰는 초기에는 비용이 많이 들 수 있지만, 결함 수정에 드는 시간과 노력을 줄이기 때문에 프로젝트 전체 비용은 대체로 낮아진다.
정적 분석은 동적 테스트보다 더 효율적으로 코드 결함을 감지할 수 있어 개발 노력과 코드 결함을 줄이는 데 기여한다.


1-3. 정적 테스트와 동적 테스트의 차이점

정적 테스트와 동적 테스트는 상호 보완적이다. 두 방법 모두 결함 감지라는 유사한 목표를 가지지만, 다음과 같은 차이점이 있다.

  • 정적 테스트는 결함을 직접적으로 찾는 반면, 동적 테스트는 실패를 유발하고 이후 분석을 통해 결함을 확인한다.
  • 정적 테스트는 실행 빈도가 낮거나 동적 테스트로 접근하기 어려운 코드 경로에서 결함을 더 쉽게 발견할 수 있다.
  • 정적 테스트는 실행 불가능한 작업 산출물에 적용될 수 있으며, 동적 테스트는 실행 가능한 작업 산출물에만 적용된다.
  • 정적 테스트는 유지보수성 같은 실행 코드와 무관한 품질 특성을 측정할 수 있고, 동적 테스트는 성능 효율성 같은 실행 코드와 관련된 품질 특성을 측정할 수 있다.

정적 테스트로 더 쉽게 발견할 수 있는 결함 유형

  • 요구사항의 결함(예: 불일치, 모호성, 중복)
  • 설계 결함(예: 비효율적인 데이터베이스 구조, 부적절한 모듈화)
  • 특정 코딩 결함(예: 정의되지 않은 변수, 도달 불가능한 코드)
  • 표준 위반(예: 코딩 표준에서의 명명 규칙 위반)
  • 인터페이스 명세 오류(예: 매개변수 개수, 유형, 순서 불일치)
  • 보안 취약점(예: 버퍼 오버플로우)
  • 테스트 베이시스 커버리지의 격차 또는 부정확성(예: 누락된 테스트) 

 

1-4. 정적 테스트의 도구와 기법

정적 테스트에서는 여러 도구와 기법을 활용하여 산출물의 결함을 탐지하고 품질을 평가한다.

  1. 리뷰(Review)
    • 비공식 리뷰(Informal Review): 비공식적이고 간단한 리뷰로, 소규모 팀에서 이메일, 채팅, 비공식 회의 등을 통해 수행된다.
    • 공식 리뷰(Formal Review): 사전 계획, 역할 할당, 문서화된 출력물을 포함하는 구조화된 리뷰 방식이다. 공식 리뷰는 효율적인 결함 탐지를 위해 철저히 계획된다.
    • 워크스루(Walkthrough): 작성자가 산출물을 검토팀과 함께 단계적으로 살펴보는 기법으로, 주로 교육 목적으로 사용된다.
    • 기술 리뷰(Technical Review): 기술적인 산출물을 중심으로 전문가 그룹이 수행하는 리뷰로, 주로 설계 문서나 소스 코드를 검토한다.
    • 검사(Inspection): 가장 엄격한 형태의 리뷰로, 결함을 철저히 탐지하고 개선점을 문서화하는 과정이 포함된다.
  2. 정적 분석(Static Analysis)
    • 코드 분석 도구: SonarQube, Coverity, Pylint와 같은 도구를 사용하여 코딩 표준 위반, 보안 취약점, 성능 문제 등을 자동으로 분석한다.
    • 보안 분석: OWASP ZAP이나 Fortify와 같은 도구를 사용하여 잠재적인 보안 취약점을 식별한다.
    • 유지보수성 평가: Cyclomatic Complexity와 같은 메트릭을 사용해 코드의 복잡도를 측정하고 유지보수성을 평가한다.

1-5. 정적 테스트의 실제 적용 사례

정적 테스트는 다양한 상황에서 활용될 수 있다.

  1. 요구사항 검토
    • 프로젝트 초기 단계에서 요구사항 명세서를 리뷰하여 모호성, 불일치, 중복 등을 조기에 발견한다.
    • 예: 사용자 스토리와 제품 백로그 항목이 Definition of Ready를 충족하는지 확인.
  2. 코드 품질 평가
    • 코드 리뷰와 정적 분석 도구를 활용하여 표준 준수 여부를 검토하고, 도달 불가능한 코드나 비효율적인 설계 패턴을 탐지한다.
    • 예: 정적 분석을 통해 정의되지 않은 변수를 감지하거나, 명명 규칙 위반을 수정.
  3. 보안 테스트
    • 정적 분석 도구를 사용해 소스 코드 내 보안 취약점을 탐지한다.
    • 예: SQL 인젝션, 버퍼 오버플로우 등과 같은 보안 이슈를 사전에 발견.

1-6. 정적 테스트 도입 시 고려사항

정적 테스트를 효과적으로 수행하기 위해서는 몇 가지 중요한 요소를 고려해야 한다.

  1. 산출물의 명확성과 구조화
    • 정적 테스트는 구조화된 산출물을 대상으로 수행되므로, 요구사항 명세서, 코드, 설계 문서 등이 명확하고 일관된 형식을 갖추고 있어야 한다.
  2. 팀원의 역할과 책임
    • 리뷰와 정적 분석 과정에서 개발자, 테스터, 비즈니스 분석가 등 각 이해관계자의 역할과 책임을 명확히 정의한다.
    • 예: 검토자는 결함을 식별하고, 작성자는 결함에 대한 수정 방안을 제시하며, 관리자는 리뷰 프로세스를 모니터링.
  3. 도구와 프로세스의 정합성
    • 프로젝트 환경에 적합한 정적 분석 도구를 선택하고, 정적 테스트 프로세스를 CI/CD 파이프라인에 통합하여 자동화를 극대화한다.
  4. 적시 수행
    • 정적 테스트는 SDLC 초기 단계에서 수행하는 것이 가장 효과적이다. 설계 단계에서 결함을 조기에 발견하면 수정 비용을 최소화할 수 있다.

1-7. 정적 테스트와 동적 테스트의 상호 보완성

정적 테스트와 동적 테스트는 상호 보완적으로 사용되어야 한다.

  1. 조기 결함 탐지
    • 정적 테스트는 SDLC 초기 단계에서 결함을 조기에 발견하여 수정 비용을 줄이고 프로젝트 위험을 감소시킨다.
    • 동적 테스트는 정적 테스트에서 발견되지 않은 런타임 오류와 성능 문제를 식별한다.
  2. 테스트 전략 통합
    • 정적 테스트와 동적 테스트를 결합하여 테스트 커버리지를 극대화하고, 시스템 전반의 품질을 보증한다.
    • 예: 요구사항 리뷰에서 발견된 문제를 기반으로 테스트 케이스를 작성하고, 이후 동적 테스트에서 이를 실행하여 검증.