동적 검증: 단위 테스트

VectorCAST, 안전이 중요한 임베디드 코드의 단위 테스트를 자동화합니다

동적 검증은 정의된 테스트 케이스에 따라 소프트웨어를 실행하고 실제 런타임 동작을 측정합니다. 이 검증은 정상 조건, 경계 사례, 오류 상태에서 함수가 올바른 결과를 반환하는지 확인하고, ISO 26262, DO-178C, IEC 61508, IEC 62304에서 검증 증적으로 요구하는 구조적 커버리지 데이터를 생성합니다. 

단위 테스트는 이 프로세스의 시작점입니다. 통합 작업이 시작되기 전에 각 함수, 모듈, 클래스, 구성 요소는 사양에 따라 개별적으로 검증됩니다. 이 단계에서 발견된 결함은 통합 단계나 필드 운영 중에 발견되는 결함보다 해결 비용이 훨씬 낮으며, 이때 생성되는 추적성 기록은 규정 준수 근거의 기반이 됩니다. 

검증 워크플로우

안전이 중요한 개발 분야에서 동적 검증 워크플로우는 정해진 순서에 따라 진행됩니다. 테스트를 시작하기 전에 요구사항을 가져와 테스트 케이스와 연결함으로써 해당 표준에서 요구하는 추적성 기준을 확립합니다. 테스트 환경에서는 사용할 수 없는 종속성을 대체하기 위해 스텁과 모크를 사용하여 Software Under Test를 격리합니다. 테스트는 호스트, 타겟 시스템 또는 두 환경 모두에서 실행되며, 이 과정에서 커버리지가 측정됩니다. 테스트 결과는 요구사항 관리 시스템으로 다시 반영되어 감사 담당자가 검토할 수 있는 양방향 기록을 완성합니다.

단위 테스트가 검증하는 항목

철저한 단위 테스트 모음은 예상되는 입력값 이상의 경우를 모두 검증합니다. 각 테스트 케이스는 특정 요구사항에 맞춰 작성되며 다음 사항을 다룹니다:

• 정상 입력 및 예상 출력 
• 경계 조건 및 off-by-one 사례 
• 오류 입력 및 유효하지 않은 상태 
• 관련 데이터 유형에 따른 오버플로우 및 언더플로우 조건 
• 종속성이 예상치 못한 값을 반환할 때의 동작 

안전이 중요한 개발에서는 각 테스트 케이스가 검증 대상으로 설계된 특정 요구사항까지 추적될 수 있어야 합니다. 요구사항에서 테스트 케이스, 결과로 이어지는 양방향 추적성은 DO-178C 및 ISO 26262에 따라 필수 검증 증적으로 요구됩니다. 

요구사항 추적성

ISO 26262, DO-178C, IEC 61508, IEC 62304 표준에 따라 요구사항 기반 테스트는 필수입니다. 각 테스트 케이스는 검증 대상으로 설계된 특정 요구사항까지 추적될 수 있어야 하며, 테스트 결과는 해당 요구사항과 양방향으로 연결되어야 합니다. 이 기록은 모든 요구사항이 테스트되었음을 입증하고, 요구사항과 연결되지 않은 테스트가 없음을 보여줍니다.

VectorCAST의 Requirements Gateway는 외부 요구사항 관리 시스템과 연동하여 요구사항을 테스트 환경으로 가져오고, 테스트 케이스를 해당 요구사항에 직접 연결할 수 있도록 지원합니다. 테스트 실행 후에는 결과와 커버리지 지표를 요구사항 관리 도구로 다시 내보낼 수 있습니다. 이를 통해 테스트 커버리지가 없는 요구사항연결된 요구사항이 없는 테스트 케이스를 즉시 식별하여 요구사항과 테스트 간 추적성을 효과적으로 검증할 수 있습니다.

테스트 환경 구축

테스트 대상 임베디드 소프트웨어는 일반적으로 하드웨어 인터페이스, 운영체제 서비스 또는 기타 소프트웨어 컴포넌트에 의존합니다. 그러나 단위 테스트 중에는 이러한 요소를 사용할 수 없거나 호출하기 어려운 경우가 많습니다. 스텁은 이러한 종속성을 대체하여 테스트 대상 단위를 독립적으로 실행할 수 있게 하고, 각 종속성이 반환하는 값을 완전히 제어할 수 있도록 합니다.

VectorCAST는 테스트 환경을 구축할 때 모든 종속성에 대한 스텁을 자동으로 생성합니다. 스텁은 테스트 케이스별로 활성화하거나 비활성화할 수 있으며, 특정 값을 반환하도록 구성할 수도 있습니다. 프로브 포인트는 이러한 제어 기능을 확장하여 테스트 대상 단위의 어느 지점에서든 값을 주입할 수 있게 합니다. 이를 통해 특정 하드웨어 조건이나 오류 상태가 발생해야만 실행되는 코드 경로에도 접근할 수 있습니다. 또한 VectorCAST는 템플릿 클래스 구성 변수의 명시적·암시적 인스턴스화를 포함한 템플릿 함수 인스턴스화의 스터빙을 지원하며, 이는 이러한 패턴이 자주 사용되는 C++ 코드베이스에서 중요합니다. 

코드 커버리지

코드 커버리지는 테스트 스위트가 실행 가능한 코드 중 어느 범위까지 실행했는지를 측정합니다. 안전 표준은 개발 중인 소프트웨어의 중요도에 따라 최소 커버리지 수준을 규정합니다. 

• 문장 커버리지는 실행 가능한 모든 코드 라인이 적어도 한 번 실행되었는지 확인합니다. 
• 분기 커버리지는 모든 결정 지점에서 가능한 모든 결과가 발생했는지 확인합니다. 
• MC/DC(수정 조건/결정 커버리지)는 결정 내 각 Boolean 조건이 결과에 독립적으로 영향을 미친다는 것을 입증합니다. 이는 가장 엄격한 구조적 기준이며, DO-178C Level A 및 ISO 26262 ASIL D 소프트웨어의 필수 요구사항입니다. 

VectorCAST는 이러한 모든 커버리지 유형을 측정하며, 적용 표준과 안전 무결성 수준에 맞는 올바른 커버리지 기준을 자동으로 선택하는 Industry Modes를 제공합니다. 커버리지 결과는 TÜV 인증을 받았습니다.

호스트 및 대상 평가

단위 테스트는 일반적으로 속도와 제어 편의성을 위해 호스트 머신에서 먼저 개발하고 실행합니다. 빠른 반복 작업, 즉각적인 피드백, 손쉬운 디버깅이 가능하므로 호스트는 테스트 스위트를 구축하고 개선하기에 적합한 환경입니다. 다만 호스트 테스트에서는 타겟 컴파일러가 사용되지 않으므로, 컴파일러별 동작은 타겟 환경에서 별도로 검증해야 합니다.

VectorCAST를 사용하면 타겟 하드웨어에서 동일한 테스트 케이스를 간편하게 실행할 수 있습니다. 테스트 환경은 호스트에서 개발되며, 다양한 크로스 컴파일러와 실시간 운영체제에서 사용할 수 있는 런타임 지원 패키지(RSP)를 통해 타겟 시스템에서 실행됩니다. 커버리지 측정, 추적성, 보고 기능은 두 환경에서 동일하게 적용됩니다. 

자동화된 테스트 생성

대규모 임베디드 코드베이스에 대한 테스트 케이스를 수동으로 작성하는 작업은 시간이 많이 소요될 뿐 아니라 누락 위험도 높습니다. VectorCAST의 자동 테스트 생성(ATG) 기능은 소스 코드에서 초기 테스트 케이스 세트를 직접 생성하며, 수동 작성 시 놓치기 쉬운 경계 조건과 코드 경로를 대상으로 합니다. 엔지니어는 테스트를 처음부터 작성하는 대신 생성된 테스트를 검토하고 확장할 수 있습니다.

테스트 코드를 직접 작성하는 방식을 선호하는 팀은 ‘코딩된 테스트(Coded Tests)’를 사용할 수 있습니다. 이 기능은 GoogleTest 호환 문법을 사용하여 xUnit 스타일의 테스트 작성을 지원하면서도, VectorCAST의 커버리지 측정, 추적성, CI/CD 통합 기능을 계속 활용할 수 있도록 합니다. 

VectorCAST

VectorCAST는 임베디드 C, C++, Ada 소프트웨어를 위한 Vector의 동적 테스트 및 테스트 자동화 플랫폼입니다. 이 플랫폼은 테스트 환경 구축을 자동화하고, 테스트 케이스를 생성 및 관리하며, 호스트와 타겟에서 테스트를 실행하고, 구조적 커버리지를 측정하며, 감사 가능한 보고서를 생성합니다.

주요 기능은 다음과 같습니다. 
• 생성된 스텁, 모크, 테스트 하네스를 활용한 자동 테스트 환경 초기 설정 
• 소스 코드에서 직접 초기 테스트 케이스를 생성하는 자동 테스트 생성(ATG) 
• GoogleTest 문법과 호환되는 xUnit 스타일 테스트 작성을 위한 코드 기반 테스트 
• 외부 요구사항 데이터베이스와의 양방향 추적성을 지원하는 Requirements Gateway 
• 코드 변경의 영향을 받는 테스트만 재실행하는 변경 기반 테스트 
• Visual Studio Code용 VectorCAST Test Explorer 확장 프로그램 
• Jenkins, Azure DevOps, GitLab을 포함한 CI/CD 통합 

다음: 통합 테스트
개별 구성 요소가 검증되면 통합 테스트를 통해 각 구성 요소 간 경계에서 올바르게 상호작용하는지 확인합니다. VectorCAST는 DO-178C 및 관련 표준에서 요구하는 데이터 및 제어 결합 커버리지를 측정합니다