IAR Workbench 에서 Unity 설정 하기
이전글 임베디드 C를 위한 유닛 테스트 1에서 이야기 했듯이 임베디드 시스템에서 유닛 테스트는 한정적이지만 일부 함수 등에 대해서는 진행할 수 있다고 했다.
오늘은 IAR에서 Unity를 사용하여 유닛 테스트를 설정하는 방법에 대해서 설명하겠다.
우선 언급하고 넘어 갈 부분이 있다.
임베디드 시스템은 호스트PC와는 다른 시스템으로 실행 바이너리가 타켓 시스템에 맞게 크로스 컴파일러로 빌드된다.
따라서 일반적으로 빌드된 바이너리는 타켓 시스템에서 실행되어야 한다.
하지만 오늘 설명할 방법은 Hardware에 의존적인 부분을 모두 제외하고 호스트PC상에서 가상으로 실행하는 방법이다.
1. Unity를 설정하기 위해 소스 코드 다운 받기
아래 URL에서 ZIP 파일로 받거나 GIT을 통해서 받을 수 있다.
http://www.throwtheswitch.org/unity/
ZIP파일을 받아 CubeMX를 통해 생성된 기존 프로젝트에 아래와 같이 "Middlewares/Third_Party/"아래 ZIP 파일 압축을 풀고 Unity로 추가한다.
2. 테스트 파일 생성 및 IAR에 파일 추가하기
Test를 위해 Tests 폴더를 만들고 'AllTest.c'과 'test_failme.c'를 추가한다.
'AllTest.c'는 Unity 실행을 위한 함수를 가진 파일로 아래와 같다.
#include "unity_fixture.h"
void RunAllTests(void)
{
RUN_TEST_GROUP(failMeTest);
}
'test_failme.c'는 테스트 케이스로 케이스에 따라 생성해 주면 된다. 예제로 아래와 같이 생성할 수 있다.
#include <stdio.h>
#include "unity_fixture.h"
#include "snsr_ringqueue.h"
#include "snsr_asc_com.h"
TEST_GROUP(failMeTest);
TEST_SETUP(failMeTest)
{
}
TEST_TEAR_DOWN(failMeTest)
{
}
TEST(failMeTest, failMe)
{
TEST_ASSERT_EQUAL(1, 4);
}
TEST_GROUP_RUNNER(failMeTest)
{
RUN_TEST_CASE( failMeTest, failMe);
}
다음으로 IAR에 Unity 파일들과 테스트 파일들을 추가한다.
'Unity' Group을 만든 후 src 폴더의 3개의 파일들과 extras/fixture/src 폴더의 4개의 파일들을 추가한다.
그리고 'Tests' Group을 만든 후 'AllTest.c'와 'test_failme.c'를 추가한다.
3. IAR 설정 추가
IAR 의 Project 설정에서 우선 Include를 위한 경를 추가해 준다.
4. main.c 수정
TDD를 실행하기 위해 define문으로 분리해 준다.
우선 아래 코드를 main.c에 추가한다.
#ifdef TDD
#include "unity.h"
#include "unity_fixture.h"
extern void RunAllTests(void);
#endif //TDD
그런 다음 main함수를 아래와 같이 수정한다.
//int main(void)
int main(int argc, char const * argv[])
{
/* USER CODE BEGIN 1 */
#ifdef TDD
return UnityMain( argc, argv, RunAllTests);
#else
..정상 로직
#endif
5. IAR Configuration 추가하기
Menu -> Project -> Edit Configurations를 선택 후 New..를 눌러 새로운 Configuration를 추가한다.
팝업 창에서 Name은 TDD, Tool Chain은 기존과 동일하게 하고 Base Configuration은 이전에 있던 Configuration으로 한다.
이렇게 추가하게 되면 IAR의 Workspace에서 TDD Configuration을 선택할 수 있다.
6. TDD 설정 변경
TDD Configuration으로 변경 후 다시 Project Option 창을 연다.
'C/C++ Compiler' 의 Preprocessor에서 Defined sybols에 TDD를 추가한다.
7. Library low-level interface implementation 변경
General Options의 Library Configuration에서 Semihosted와 Via semihosting을 선택한다.
8. Debugger 설정 변경
Debugger를 다음처럼 Simulator로 변경한다.
9. Build & Run
TDD Configuration 상에서 빌드 후 Debugging을 실행 한다.
Terminal I/O 창을 열고 F5를 눌러 Go한다.
그럼 아래 처럼 출력 되는 것을 확인할 수 있다.
** 정상적인 펌웨어 생성을 위해서는 Workspace의 configuration을 다시 바꿔야 한다.