동적 검증: 단위 테스트

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

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

단위 테스트는 이 프로세스의 시작점입니다. 통합 작업이 시작되기 전에 각 함수, 모듈, 클래스 및 구성 요소는 사양에 따라 개별적으로 평가됩니다. 이 단계에서 발견된 결함은 통합 단계나 필드 운영 중에 발견되는 결함에 비해 해결 비용이 훨씬 적게 들며, 여기서 생성된 추적성 기록은 규정 준수 사례의 기초를 형성합니다.

평가 워크플로우

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

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

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

  • 정상 입력 및 예상 출력
  • 경계 조건 및 오프-바이-원(off-by-one) 사례
  • 오류 입력 및 무효 상태
  • 관련 데이터 유형에 따른 오버플로우 및 언더플로우 조건
  • 의존성이 예상치 못한 값을 반환할 때의 행동

     

안전이 중요한 개발에서는 각 test 케이스가 검증 대상으로 설계된 특정 요구사항으로 거슬러 올라갈 수 있어야 합니다. 요구사항에서 test 케이스를 거쳐 결과까지의 양방향 추적성은 DO-178C 및 ISO 26262에 따라 필수적인 증거입니다.

요구사항 추적성

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

VectorCAST의 Requirements Gateway는 외부 요구사항 데이터베이스에 연결하여 요구사항을 테스트 환경으로 가져오고, 테스트 케이스를 해당 요구사항에 직접 연결할 수 있게 해줍니다. 실행 후, 결과 및 커버리지 지표는 요구사항 관리 도구로 다시 내보내집니다. 테스트 커버리지가 없는 요구사항과 연결된 요구사항이 없는 테스트 케이스는 즉시 확인 가능합니다.

평가 환경 구축

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

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

코드 커버리지

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

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

VectorCAST는 이러한 모든 커버리지 유형을 측정하며, 주어진 표준 및 안전 무결성 수준에 맞는 올바른 커버리지 기준을 자동으로 고르는 ‘산업 모드(Industry Modes)’를 포함합니다. 커버리지 결과는 TÜV의 인증을 받았습니다.

호스트 및 대상 평가

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

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

자동화된 테스트 생성

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

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

VectorCAST

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

주요 기능은 다음과 포함합니다:

  • 생성된 스텁, 모크 및 테스트 하네스를 활용한 자동 테스트 환경 설치 초기 설정
  • 소스 코드에서 직접 초기 test 케이스를 생성하는 자동 테스트 생성(ATG)
  • GoogleTest 문법과 호환되는 xUnit 스타일 테스트 작성을 위한 코드 기반 테스트
  • 외부 요구사항 databases와의 양방향 추적성을 지원하는 요구사항 게이트웨이
  • 코드 변경의 영향을 받는 테스트만 재실행하는 변경 기반 시험
  • Visual Studio Code용 VectorCAST Test Explorer 확장 프로그램
  • Jenkins, Azure DevOps 및 GitLab을 포함한 CI/CD 통합
다음: 통합 평가
개별 구성 요소가 검증되면, 통합 테스트를 통해 각 구성 요소 간의 경계에서 올바르게 상호작용하는지 확인합니다. VectorCAST는 DO-178C 및 관련 표준에서 요구하는 바에 따라 데이터 및 제어 결합 커버리지를 측정합니다.