본문 바로가기

카테고리 없음

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

IAR Workbench 에서 Unity 설정 하기

 

이전글 임베디드 C를 위한 유닛 테스트 1에서 이야기 했듯이 임베디드 시스템에서 유닛 테스트는 한정적이지만 일부 함수 등에 대해서는 진행할 수 있다고 했다.

오늘은 IAR에서 Unity를 사용하여 유닛 테스트를 설정하는 방법에 대해서 설명하겠다.

 

우선 언급하고 넘어 갈 부분이 있다.

임베디드 시스템은 호스트PC와는 다른 시스템으로 실행 바이너리가 타켓 시스템에 맞게 크로스 컴파일러로 빌드된다.

따라서 일반적으로 빌드된 바이너리는 타켓 시스템에서 실행되어야 한다.

하지만 오늘 설명할 방법은 Hardware에 의존적인 부분을 모두 제외하고 호스트PC상에서 가상으로 실행하는 방법이다.

 

1. Unity를 설정하기 위해 소스 코드 다운 받기

아래 URL에서 ZIP 파일로 받거나 GIT을 통해서 받을 수 있다.

http://www.throwtheswitch.org/unity/

 

Unity — Throw The Switch

Getting Started Let's do this! First, you need to download your tools. Very likely, you'll start with just Unity. But you may choose to use Ceedling or CMock too. If you're not sure, maybe you want to start by using our Decide-O-Tron 3000. If you opted for

www.throwtheswitch.org

ZIP파일을 받아 CubeMX를 통해 생성된 기존 프로젝트에 아래와 같이 "Middlewares/Third_Party/"아래 ZIP 파일 압축을 풀고  Unity로 추가한다.

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'를 추가한다.

IAR Project 파일 추가

3. IAR 설정 추가

IAR 의 Project 설정에서 우선 Include를 위한 경를 추가해 준다.

 

Project Include Path

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을 선택할 수 있다.

 

TDD Configuration

6. TDD 설정 변경

TDD Configuration으로 변경 후 다시 Project Option 창을 연다.

'C/C++ Compiler' 의 Preprocessor에서 Defined sybols에 TDD를 추가한다.

IAR symbol 추가

 

7. Library low-level interface implementation 변경

General Options의 Library Configuration에서 Semihosted와 Via semihosting을 선택한다.

 

8. Debugger 설정 변경

Debugger를 다음처럼 Simulator로 변경한다.

IAR Debugger

9. Build & Run

TDD Configuration 상에서 빌드 후 Debugging을 실행 한다.

Terminal I/O 창을 열고 F5를 눌러 Go한다.

그럼 아래 처럼 출력 되는 것을 확인할 수 있다.

 

Terminal I/O

** 정상적인 펌웨어 생성을 위해서는 Workspace의 configuration을 다시 바꿔야 한다.