본문 바로가기

작성중

임베디드 C를 위한 유닛 테스트 1

TDD는 꽤 오래 전부터 알려진 개발 방법론 중에 하나다. 그리고 이 TDD를 실천하기 위한 것 중 하나가 유닛 테스트이다.

웹이나 PC SW를 위한 Test Framework는 매우 다양하고 잘 소개되어 있지만 임베디드 시스템을 위한 유닛 테스트에 대한 정보는 잘 찾기가 힘들다. 그 이유는 대부분의 임베디드 시스템은 하드웨어와 관련이 있고 하드웨어와 관련된 코드들은 유닛 테스트를 진행하기 힘들기 때문이다.

 

하지만 이는 유닛 테스트에 대해 잘못 이해하고 있기 때문이다. 유닛 테스트는 시스템을 테스트하여 개발의 안정성을 찾기 위한 것이 아니다.

특정 함수와 같은 단위를 테스트하여 구현된 단위 코드의 정확도를 높이고 변경 시 오류를 빠르게 알 수 있게 하기 위한 것이다. 따라서 임베디드 시스템을 위한 코드라도 하드웨어와 관련 없는 단순 로직을 위한 코드들에 대해서 유닛 테스트를 만들어 오류를 줄일 수 있다.

 

이를 위한 라이브러리나 프레임워크 중 Unity와 CMock을 소개하고자 한다.

먼저 Unity는 테스트 프레임워크로 C 함수를 위한 테스트 코드를 작성하여 실행하면 전체 테스트 중 실패한 테스트가 몇 개인지 알 수 있게 한다. 이를 통해서 함수가 정상적으로 구현되었는지를 검증할 수 있다.

CMock은 어떤 함수가 내부에서 호출하는 다른 함수에 대한 의존성을 제거해 준다.

예를 들어, Function1이라는 함수가 GetSPIData라는 함수를 내부적으로 호출하여 반환 값을 사용한다고 가정해 보자.

GetSPIData 함수가 SPI 통신을 통해 특정 IC의 데이터를 읽어오는 동작을 수행한다면 이는 임베디드 시스템에서 실행되어야만 GetSPIData함수의 반환 값을 얻을 수 있게 된다.

CMock을 유닛 테스트를 위해 GetSPIData함수의 더미 함수를 만들어 호출 시 정해진 반환 값을 돌려 줄 수 있게 한다.

따라서 하드웨어 의존적인 부분을 분리할 수 있게 한다.

이 두 라이브러리에 대한 자세한 정보는 아래의 URL에서 확인할 수 있다.

http://www.throwtheswitch.org/

 

Throw The Switch

Unit Testing (TDD) Embedded C Code. Making Awesome and Reliable Firmware in C Doesn't Have to Suck.

www.throwtheswitch.org