모든 공학에서는 각자 자신들만의 테스트 기법을 가지고 있습니다.
수백 층에 달하는 건물을 지을 때도, 손톱만한 전자 회로를 만들 때도 결과물이 설계를 얼마나 정확히 반영하고 있는지를 테스트 합니다. 테스트 기법이야 말로 해당 분야가 얼마나 발달되어 잘 가다듬어져 있다는 증거일 것입니다. 테스트에 있어 이렇다 할 정답이 없는 우리는 아직 미개한 세계에서 살고 있는 것입니다. 본 글에서는 정적 분석과 동적 분석이 어떤 차이가 있으며 이들의 핵심을 관통하는 원리가 무엇인지 짚어봅니다.
소프트웨어를 테스트하는 여러 가지 새로운 방법들이 수십 년에 걸쳐 끊임없이 등장하고 있지만 이것이 정답이라고 확신을 갖고 말하는 이는 없을 것입니다. 이 같은 어려움은 소프트웨어의 두 가지 특징에 기인합니다. 첫번째는 우리 눈에 보이지 않는다는 것이고 두번째는 끊임없이 변화하는 물건이라는 점입니다.
소프트웨어를 테스트한다는 것
소프트웨어는 어떻게 테스트 할까요?
보는 시각이나 단계별 또는 유형별로 다양하게 나뉠 수 있지만, 여기서는 소프트웨어에 여러 가지 입력을 주며 실행 시킨 결과를 토대로 판단을 내리는 동적 분석(Dynamic analysis)과 프로그램을 실행시키지 않고 소스 코드 등의 내용을 기반으로 판단하는 정적 분석(Static analysis)으로 분류해 보고 그 두 가지의 차이점은 무엇인지 알아보도록 하겠습니다. 동적 분석과 정적 분석은 각각 오랜 역사를 가지고 있습니다. 동적 분석이 프로그램 개발과 그 역사를 함께 하는 반면, 정적 분석은 비교적 최근에야 주목을 받기 시작했습니다. 사실 정적 분석은 컴파일러 최적화와 요약해석 이론의 발달과 함께 1970년대에 이미 그 틀이 완성 되었으나 컴퓨팅 파워의 발전과 함께 2000년대 들어 관련 연구가 급증하면서 산업계에서 활용할 수 있을 만큼 무르익은 것입니다.
정적 분석
정적 분석에서는 실제 제품(코드)가 구현되기 전에 기획서, 요구사항 정의서, 설계서 및 소스코드 등 개발 산출물을 실행 없이 테스트하는 기법으로 결함 원인을 찾는 테스트가 중심입니다. 정적 분석의 주요 목표는 개발 초기에 오류를 찾아 소프트웨어 제품의 품질을 향상시키 는 것이므로, 테스트 초기 단계에서 수행됩니다.
▪ 정적 분석 기법 ▪
▫ 비공식 검토(Informal Reviews) : 문서에서 오류를 찾기 위해 프로세스를 따르지 않는 검토 유형 중 하나입니다. 이 기술에서는 문서를 검토하고 비공식적인 의견을 제공하기만 하면 됩니다.
▫ 기술적 검토(Technical Reviews) : 동료로 구성된 팀은 소프트웨어 제품의 기술 사양을 검토하고 프로젝트에 적합한지 확인합니다. 뒤따르는 사양과 표준에서 불일치를 찾는데 주력합니다. 이 검토에서는 주로 테스트 전략, 테스트 계획 및 요구사항 사양 문서와 같은 소프트웨어 관련 기술 문서에 중점을 둡니다.
▫ 워크쓰루(Walkthrough) : 작업 산출물 작성자는 자신의 팀에 제품에 대한 설명을 합니다. 참가자는 질문이 있을 경우 질문할 수 있고, 회의는 작성자에 의해 주도됩니다. 기록자는 검토 의견을 기록합니다.
▫ 인스펙션(Inspection) : 주목적은 결함의 발견이며 공식화된 절차와 훈련된 조정자(Moderator)에 의해 주도됩니다. 공식화된 일정에 맞추어 보고서를 작성하고 평가합니다. 시작과 종료 기준(Entry & exit criteria)을 가진 규칙과 체크리스트에 기반한 형식적인 프로세스입니다.
동적 분석
동적 분석에서는 코드를 실행 시켜 소프트웨어 시스템의 기능적 동작, 메모리/CPU 사용량 및 시스템의 전반적인 성능 등을 점검합니다. 동적 분석의 주요 목표는 소프트웨어 제품이 비즈니스 요구사항에 따라 작동하는지 확인하는 것입니다. 동적 분석은 소프트웨어를 실행하고 예상 결과로 출력을 검증합니다. 동적 분석은 모든 수준의 테스트에서 수행되며 블랙박스 또는 화이트박스 테스트라는 분류도 존재하는데, 소스 코드와 같은 프로그램 내부를 들여다보지 않는 테스트를 블랙박스 테스트, 소스 코드와 함께 테스트하는 것을 화이트박스 테스트라고 합니다.
▪ 동적 분석 기법 ▪
▫ 단위 테스트(Unit Testing): 단위 테스트에서 개발자는 개별 단위 또는 모듈을 테스트합니다. 일반적으로 개발자가 소스 코드를 테스트합니다.
▫ 통합 테스트(Integration Testing): 개별 모듈은 개발자가 그룹화하고 테스트 합니다. 통합된 모듈이 예상대로 작동하는지 확인하는 것을 목적으로 합니다.
▫ 시스템 테스트(System Testing): 시스템 또는 응용 프로그램이 요구사항 사양 문서를 충족하는지 확인하여 전체 시스템에서 수행됩니다. 또한 성능 테스트, 보안 테스트와 같은 비기능 테스트는 동적 테스트의 범주에 속합니다.
정적 분석과 동적 분석의 차이점
▪ 주요 차이점 정리 ▪
▫ 정적 분석은 소프트웨어를 실행하지 않고 수행되지만 동적 분석은 소프트웨어를 실행하여 수행됩니다.
▫ 정적 분석은 코드, 요구사항 문서 및 설계서에서 오류를 확인하는 반면, 동적 분석은 소프트웨어 시스템의 기능적 동작, 메모리/CPU 사용 및 시스템의 전체 성능을 확인합니다.
▫ 정적 분석은 결함 방지에 관한 것이며 동적 분석은 결함을 찾아 수정하는 것입니다.
▫ 정적 분석은 확인(Verification) 프로세스를 수행하고 동적 분석은 검증(Validation) 프로세스를 수행합니다.
▫ 정적 분석은 컴파일 전에 수행되는 반면 동적 분석은 컴파일 후에 수행됩니다. - 정적 분석은 구조적이며 코드 커버리지를 확인하는 반면, 동적 분석 기법은 경계값 분석 및 동치분할 등 입니다.