‘소프트웨어 테스트’라고 하면 무엇이 떠오르시나요? 아마 대부분은 완성된 프로그램의 버튼을 눌러보고, 값을 입력하며, 기능이 의도대로 동작하는지 또는 에러가 발생하는지 확인하는 모습을 상상할 것입니다.
이처럼 소프트웨어를 직접 ‘실행’하며 테스트하는 방식을 **동적 테스트(Dynamic Testing)**라고 합니다. 이는 가장 일반적이고 직관적인 테스트 방법입니다.
하지만 숙련된 엔지니어들은 코드가 완성되어 실행되기 훨씬 이전 단계부터 버그를 찾아냅니다. 프로그램을 전혀 실행하지 않고도 말이죠. 이 강력한 접근법이 바로 **정적 테스트(Static Testing)**입니다. 이번 글에서는 이 두 가지 근본적인 테스트 접근법의 차이와 중요성에 대해 알아보겠습니다.

동적 테스트 (Dynamic Testing): ‘실행’하며 결함 찾기
동적 테스트는 우리가 지금까지 이야기해 온 대부분의 테스트를 포함합니다. 단위 테스트, 통합 테스트, 시스템 테스트, 그리고 블랙/화이트/그레이박스 테스트 모두 프로그램을 특정 환경에서 실행시켜야만 수행할 수 있습니다.
- 핵심: 소프트웨어를 실제로 구동하여, 실행 중에 발생하는 오작동이나 예상과 다른 결과를 찾아내는 것.
- 목표: 소프트웨어의 ‘실패(Failure)’를 발견하는 것. 즉, 실행 시점에서 드러나는 문제점을 찾는 데 집중합니다.
- 비유: 자동차의 성능을 확인하기 위해 ‘직접 시동을 걸고 도로를 주행하며’ 브레이크, 핸들링, 가속 등을 확인하는 것과 같습니다.
동적 테스트는 실제 사용 환경과 가장 유사한 조건에서 소프트웨어의 전체적인 동작과 성능을 검증하는 데 필수적입니다.
정적 테스트 (Static Testing): ‘실행’ 없이 결함 찾기
정적 테스트는 소프트웨어를 실행하지 않고, 소스 코드, 요구사항 명세서, 설계 문서 등을 사람의 눈으로 검토하거나 자동화된 도구를 이용해 분석하여 결함을 찾아내는 모든 활동을 의미합니다.
- 핵심: 프로그램 실행 없이, 문서나 코드 자체의 논리적 오류, 표준 위반, 잠재적 결함을 찾아내는 것.
- 목표: 소프트웨어의 ‘결함(Defect)’ 또는 ‘오류(Fault)’를 조기에 발견하는 것. 코드가 실행되어 ‘실패’로 이어지기 전에 원인을 제거하는 데 집중합니다.
- 비유: 자동차를 주행하기 ‘전에, 설계도를 꼼꼼히 검토하여’ 부품이 잘못 연결되었거나 규격에 맞지 않는 재료가 사용된 부분을 찾아내는 것과 같습니다.
왜 ‘정적 테스트’가 중요할까?
정적 테스트는 개발 프로세스의 초반에 수행되므로 매우 비용 효율적입니다. ‘Shift Left Testing’이라는 개념처럼, 결함을 개발 주기상 왼쪽(초기 단계)에서 발견할수록 수정 비용과 노력이 기하급수적으로 줄어들기 때문입니다.
- 조기 결함 발견: 요구사항 명세서의 모호한 문장 하나를 수정하는 것은, 나중에 이로 인해 잘못 개발된 기능을 통째로 수정하는 것보다 훨씬 비용이 적게 듭니다.
- 개발 생산성 향상: 초기에 결함을 수정하면, 후반부에 발생할 수 있는 복잡한 디버깅과 재작업 시간을 줄여 개발팀이 새로운 기능 개발에 더 집중할 수 있게 합니다.
- 더 높은 코드 품질: 정적 분석 도구를 통해 코딩 표준을 강제하고, 잠재적인 버그나 안티 패턴을 자동으로 찾아내어 코드의 가독성과 유지보수성을 높일 수 있습니다.
대표적인 정적 테스트 기법들
- 리뷰 (Reviews): 사람이 직접 문서나 코드를 검토하는 활동을 통칭합니다.
- 워크스루 (Walkthrough): 작성자가 주도하여 동료들에게 내용을 설명하고 자유롭게 피드백을 받는 비공식적 검토 회의입니다. 지식 공유와 아이디어 도출에 효과적입니다.
- 인스펙션 (Inspection): 사회자, 검토자 등 역할을 분담하고 체크리스트를 기반으로 진행하는 매우 공식적이고 체계적인 검토 회의입니다. 결함을 찾아내는 데 가장 큰 목적을 둡니다.
- 정적 분석 (Static Analysis): 자동화된 도구가 소스 코드를 분석하여 규칙 위반이나 잠재적 오류를 찾아주는 기법입니다. SonarQube, ESLint, PMD 등이 대표적인 정적 분석 도구입니다.
결론: 품질은 만들어가는 것이다
훌륭한 품질 보증 활동은 동적 테스트와 정적 테스트, 두 개의 바퀴로 굴러갑니다.
동적 테스트를 통해 실제 사용자가 겪게 될 실패를 찾아내는 동시에, 정적 테스트를 통해 애초에 그런 실패를 유발할 수 있는 결함을 설계 및 코딩 단계에서부터 제거해 나가는 것입니다.
소프트웨어 품질은 프로젝트 막바지에 ‘검증’되는 것이 아니라, 프로젝트 시작부터 모든 단계에 걸쳐 ‘만들어가는 것(Built-in Quality)’임을 기억하는 것이 중요합니다.