본문 바로가기

카테고리 없음

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

지난 번 임베디드 C를 위한 유닛 테스트 2에 이어 CMOCK에 대한 IAR 설정을 설명하도록 한다.

 

먼저 CMOCK에 대해서 간단히 설명하면 테스트를 하려는 유닛(함수) 내부에서 다른 함수를 호출한다면 의존성이 생기고 그에 따라 동작이 달라지게 된다. 유닛 테스트에서 이런 의존성은 정확한 테스트를 어렵게 하고 특히 임베디드 시스템에서는 하드웨어 의존적인 함수의 경우 가상으로 테스트를 할 수 없게 한다.

 

CMOCK을 이용하면 의존성을 가지는 함수에 대해서 대체할 수 있는 함수를 만들어 실행할 수 있게 해 준다.

예를 들어, A함수가 내부에서 B함수를 호출하는데 B함수는 하드웨어 의존적인 기능을 가지고 있다면 테스트를 진행하기 어려움으로 CMOCK은 B함수에 대해서 MOCK_B함수를 만들어 A함수에서 B함수를 호출 시 대신 호출 될 수 있게 해 준다. 이를 통해 의존성을 제거하고 A함수에 대해서만 테스트 할 수 있게 만들어 준다.

 

1. Ruby 설치

CMOCK의 경우 Ruby를 이용하여 MOCK함수들을 생성할 수 있는 스크립트를 제공해 준다.

따라서 윈도우에 먼저 Ruby를 설치해야 한다. 아래의 경로에서 다운 받아 설치하면 된다.

https://rubyinstaller.org/downloads/

 

Downloads

Which version to download? If you don’t know what version to install and you’re getting started with Ruby, we recommend you use Ruby+Devkit 2.5.X (x64) installer. It provides the biggest number of compatible gems and installs MSYS2-Devkit alongside Ruby, s

rubyinstaller.org

2. CMOCK 소스 코드 다운로드

아래의 URL에서 ZIP파일을 받거나 GIT으로 소스코드를 다운 받을 수 있다.

http://www.throwtheswitch.org/cmock

 

CMock — Throw The Switch

In this case, our silly little test passes. If we had instead returned 0 as our ID when ParseStuff_ExpectAndReturn was called, we would be able to verify that HandleStupidFeatures is called instead. Whenever CMock comes across a mismatch in what was called

www.throwtheswitch.org

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

CMock path

 

3. 테스트 MOCK 파일 생성 및 IAR에 파일 추가하기

CMOCK은 Ruby 스크립트를 통해 Mock 파일을 자동으로 생성해 준다.

먼저 앞서 만든 Tests폴더 하위에 Mocks폴더를 하나 생성해 준다.

아래는 스크립트 실행 명령어 이다.

 

ruby Middlewares\Third_Party\CMock\lib\cmock.rb --mock_path=Tests\Mocks Inc/snsr_calculation.h

'--mock_path=xx'부분은 Mock파일들이 생성된 위치이고 맨 뒤의 Inc/snsr_calculation.h는 MOCK 파일을 생성할 함수의 헤더파일이다.

이를 실행 하면 Tests\Mocks 경로에 'Mocksnsr_calculation.h'과 'Mocksnsr_calculation.c'파일이 생성된다.

 

다음으로 IAR에 CMock Group을 만들고 src폴더의 3개 파일들을 추가한다.

그리고 Tests 하위에 Mocks Group을 만들어 위에서 생성된 두 파일을 추가한다.

4. IAR 설정 추가

TDD Configuration의 Project Option에서 C/C++ Compiler에 Include 경로를 추가해 준다.

 

5. 파일 수정

TDD를 빌드 시 MOCK 함수와 원래 함수가 같이 존재하면 링크에러가 발생하므로 원래 함수를 아래의 코드로 감싸준다.

#ifndef TDD
// 원래 함수
#endif

6. 테스트 수정

앞서 Unity에서 만든 TEST에 Mock이 받는 입력인자와 그에 따른 반환 값을 지정하고 테스트 함수를 호출하여 결과를 확인한다.

예를 들어, 아래와 같이 Calculate라는 함수가 다음과 같이 내부에서 Add라는 함수를 호출한다면 

int Calculate(int a, int b)
{
	int result = Add(a, b);
    return result*3;
}

위의 3번 과정을 거쳐 생성된 Mock파일의 Add_ExpectAndReturn 이라는 매크로를 이용하여 다음과 같이 a, b 그리고 반환값 a+b 값을 인자로 주어 선언하고 테스트하려는 Calculate함수를 호출하여 예상되는 값이 맞는지 테스트 할 수 있다.

int a = 10;
int b = 20;
int returvalue = 30;
Add_ExpectAndReturn( a, b, returvalue);
TEST_ASSERT_EQUAL( 90, Calculate( a, b));