임베디드 소프트웨어 테스트는 개발 단계와 시스템 복잡도에 따라 다양한 테스트 유형으로 분류되며,
각 테스트는 명확한 목적, 실행 시점, 기법, 도구를 기반으로 수행되어야 한다.
[표 1. 기준별 테스트 종류]
[표2. 정적 테스트와 동적 테스트의 차이점]
○ 단위 테스트 (Unit Test)
* 개요
단위 테스트는 소프트웨어의 가장 작은 실행 단위(함수, 메소드, 모듈 등)를 독립적으로 검증하는 테스트이다.
구현 초기 단계에서 수행되며, 조기 결함 발견, 회귀 방지, 코드 품질 확보의 역할을 한다.
* 전략
- 테스트 커버리지 확보 (statement, branch, MC/DC 등)
- Mock/Stubbing을 통한 의존성 분리
- 자동화 중심 수행 (CI 연동 가능)
- 코드 변경 시 회귀 테스트 자동 실행
* 기법
- 경계값 분석 (Boundary Value Analysis)
- 조건/판단 분기 테스트
- 데이터 주도 테스트 (Data-driven Test)
* 도구 예시
- Ceedling + Unity + CMock (C)
- GoogleTest / GoogleMock (C++)
- Parasoft C/C++test, VectorCAST, Tessy (상용)
○ 통합 테스트 (Integration Test)
* 개요
통합 테스트는 여러 모듈이 상호작용할 때 데이터 흐름, 인터페이스, 통신이 예상대로 동작하는지를 확인하는 단계이다.
* 전략
- Top-down / Bottom-up / Big Bang 방식 선택
- 모듈 간 계약(Interface Contract)에 기반한 검증
- 정상 흐름 + 예외 흐름 테스트 병행
* 기법
- 인터페이스 데이터 검증
- 상태 전이 기반 시나리오 테스트
- 비정상 연결 조건 (null, CRC 오류 등) 처리 테스트
* 도구 예시
- CMock, Google Mock (단위 기반 확장)
- VectorCANoe, Simulink Test, Tessy
○ 시스템 테스트 (System Test)
* 개요
시스템 테스트는 전체 시스템이 통합된 후, 실제 요구사항 기반으로 기능과 비기능을 검증하는 단계다.
실기기 또는 시뮬레이션 환경에서 수행된다.
* 전략
- 사용자 시나리오 기반 테스트
- 기능 + 비기능 요구 사항 테스트
- 명세 기반 테스트 (Black Box)
- 요구 사항 추적 매트릭스(RTM) 기반 커버리지 점검
* 기법
- Use Case 기반 시나리오 테스트
- 상태 기반(State Diagram) 테스트
- 조합 기반 테스트 (Pairwise)
- 장시간 테스트 (Burn-in Test)
* 도구 예시
- TestComplete, National Instruments TestStand
- Robot Framework
- 자동화 스크립트 (Python + PySerial 등)
○ 회귀 테스트 (Regression Test)
* 개요
소프트웨어 변경(코드 수정, 버그 수정, 리팩토링 등) 이후 기존 기능이 영향을 받지 않았는지 확인하는 테스트이다.
* 전략
- 자동화 우선 적용
- 변경 범위 기반 영향 분석 후 테스트 선별
- 변경 전/후 결과 비교
* 기법
- 스냅샷 기반 비교
- 커버리지 변화 분석
- 이력 기반 리스크 우선순위 적용
* 도구 예시
- Jenkins + Ceedling, GitLab CI, Python 자동화 스크립트
○ HIL (Hardware-in-the-Loop) 테스트
* 개요
HIL 테스트는 실제 하드웨어를 제어하거나 시뮬레이션 하드웨어 환경에서 소프트웨어의 동작을 테스트하는 것으로 필수적인 최종 테스트 단계이다.
* 전략
- 센서/액추에이터 시뮬레이션 활용
- 시나리오 자동 재현 (Fault Injection 포함)
- 환경적 조건 변화(온도, 전압 등) 테스트 포함
* 기법
- 입력 신호 시뮬레이션 및 출력 검증
- 실시간 응답 검증 (타이밍 분석)
- 고장 조건 시나리오 주입 (Open/Short, Out-of-range 등)
* 도구 예시
- dSPACE, NI PXI, Vector VT System
- Simulink Real-Time, CANoe, ETAS LABCAR
[표 3. 테스트 전략별 비교표]
○ 비기능 테스트
비기능 테스트는 소프트웨어의 기능 수행 여부와는 별도로, 시스템의 품질 특성을 평가하는 테스트 활동이다.
성능, 보안성, 사용성, 호환성 등 다양한 품질 요구사항을 검증하여, 시스템의 신뢰성, 확장성, 사용자 만족도, 운영 효율성을 확보하는 것이 목적이다.
▮ 성능 테스트 (Performance Testing)
* 정의: 시스템이 정의된 조건하에서 응답 시간, 처리량, 자원 사용률 등의 성능 지표를 얼마나 안정적으로 충족 하는지 평가
* 주요 목적:
① 다수의 사용자 또는 요청이 동시에 발생하는 상황에서 성능 병목 식별
② 시스템이 정상 부하(Load)와 과부하(Stress) 조건에서도 안정적으로 동작하는지 검증
* 세부 유형:
① 부하 테스트 (Load Test): 정상 트래픽 수준에서의 성능 측정
② 스트레스 테스트 (Stress Test): 허용 임계치를 초과하는 조건에서의 반응 관찰
③ 지속성 테스트 (Soak Test): 장시간 운영 시 자원 누수나 성능 저하 여부 평가
* 사용 도구: Apache JMeter, LoadRunner, Gatling 등
▮ 보안 테스트 (Security Testing)
* 정의: 소프트웨어 및 시스템 내 보안 취약점을 식별하고, 데이터 보호, 접근 제어, 인증 메커니즘이 정상적으로 작동하는지 확인
* 주요 목적:
① 외부 및 내부 위협으로부터 시스템을 보호하기 위한 설계/구현상의 결함 탐지
② 침투 테스트 (Penetration Testing) 및 취약점 스캐닝(Vulnerability Scanning)을 통한 공격 시뮬레이션
* 평가 항목:
① 인증(Authentication) 및 권한 부여(Authorization) 절차
② 데이터 암호화, 세션 관리, 보안 로그 감사 기능
③ OWASP Top 10 취약점 대응 여부
* 사용 도구: OWASP ZAP, Burp Suite, Nessus, Fortify 등
▮ 사용성 테스트 (Usability Testing)
* 정의: 최종 사용자가 시스템을 얼마나 직관적이고 효율적으로 사용할 수 있는지 평가
* 주요 목적:
① 사용 흐름, UI 구성, 반응 시간 등에 대한 사용자 관점의 개선 사항 도출
② 장애 요소, 복잡성, 실수 유발 포인트 등을 정성적·정량적으로 식별
* 방법론:
① 사용자 시나리오 기반 실사용 테스트 (Think-aloud Protocol)
② A/B 테스트, 설문조사, 클릭 추적 및 사용자 행동 분석 등
* 평가 기준: 학습 용이성, 효율성, 오류율, 만족도, 접근성
* 사용 도구: Figma, Maze, Hotjar, UserTesting 등
▮ 호환성 테스트 (Compatibility Testing)
* 정의: 소프트웨어가 다양한 환경(운영체제, 브라우저, 디바이스, 네트워크 조건)에서 일관된 기능과 UI/UX를 제공하는지 확인
* 주요 목적:
① 사용자의 플랫폼 다양성으로 인한 환경 종속 이슈 사전 검출
② 제품 배포 전 예상치 못한 충돌, 해상도 깨짐, 기능 오류 등을 방지
* 세부 유형:
① 크로스 브라우저 테스트 (예: Chrome, Edge, Firefox 등)
② 기기 간 테스트 (모바일/PC/태블릿)
③ OS 및 버전별 테스트 (Windows, iOS, Android 등)
④ 네트워크 조건 테스트 (저속/고속 네트워크 환경, 지연/패킷 손실 등)
⑤ 사용 도구: BrowserStack, Sauce Labs, Kobiton, Perfecto 등
“비기능 테스트는 단순히 보조적인 검증 과정이 아니라, 품질을 수치화하고 리스크를 제어하기 위한 핵심 활동.”
기능 요구사항만 충족한 시스템이라 하더라도, 성능 저하, 보안 취약점, UI 불편 등이 존재할 경우 사용자에게 부정적인 영향을 줄 수 있다.
따라서, 비기능 요구사항에 대한 명확한 정의와 이를 검증하는 정형화된 테스트 프로세스가 필요하다.