40
IoT 개개개개 개개 Embedded C 개개 TDD 개 개개개 nRF51-DK 개개 TDD test result 개개개개

IoT 개발자를 위한 Embedded C에서 TDD를 해보자

Embed Size (px)

Citation preview

Page 1: IoT 개발자를 위한 Embedded C에서 TDD를 해보자

IoT 개발자를 위한Embedded C 에서 TDD 를 해보자

nRF51-DK 에서 TDD test result 추출하기

Page 2: IoT 개발자를 위한 Embedded C에서 TDD를 해보자

• 평범한 학부생이 Embedded C 에서 TDD 를 실천하기 위해 시도했던 경험과 결과물입니다 .

• 정답이 아닐 수도 있지만 , 임베디드 개발을 하면서 느꼈던 폐쇄적인 정보 공유가 조금이라도 개방 되었으면 하는 바람으로 작성하였습니다 .

Page 3: IoT 개발자를 위한 Embedded C에서 TDD를 해보자

• 개발 환경

• Windows 10

• 타깃 보드 : nRF51-DK

• 타깃 시스템 환경

■ SDK version : SDK 10

■ Soft Device version : soft device 110

■ Compiler : arm-none-eabi-gcc 4.9.3

• TDD 를 시작하기에 앞서 타깃 시스템 개발 환경이 구축되어있지 않다면 , 먼저 다른 예제를 통해 환경을 구축하고 시작 하시는 것을 권장합니다 .

• nRF51-DK 환경 구축 (Link1, Link2)

Page 4: IoT 개발자를 위한 Embedded C에서 TDD를 해보자

TDD 실행에 앞서 Embedded C 에서 쓰이는 unit test framework 는 뭐가 있을까요 ?

Page 5: IoT 개발자를 위한 Embedded C에서 TDD를 해보자

TDD Framwork

UNITY사이트

Embedded C 에는 대표적으로 2 가지 unit test framwork 가 있습니다 .

Cpputest

사이트

Page 6: IoT 개발자를 위한 Embedded C에서 TDD를 해보자

TDD Framwork

UNITY

Unity 는 C 언어 기반의 framwork 이고Cpputest 는 C++ 언어 기반의 framwork 입니다 .

C C++Cpputes

t

Page 7: IoT 개발자를 위한 Embedded C에서 TDD를 해보자

TDD Framwork

Cpputest사이트

UNITY사이트

Unity 는 테스트 결과를 확인하기 위해서 4 개의 파일이 필요하고 ,

main.c LedDriver.c

LedDriverTest.c

LedDriverTestRunner.c

Page 8: IoT 개발자를 위한 Embedded C에서 TDD를 해보자

TDD Framwork

UNITY사이트

Cpputest사이트Cpputest 는 3 개의 파일을 만들면 됩니다 .

main.cLedDriver.c

LedDriverTest.c

Page 9: IoT 개발자를 위한 Embedded C에서 TDD를 해보자

TDD Framwork

UNITY

여기서는 Unity 를 사용합니다 .Unity 는 Ceedling 이라는 훌륭한 Bootstrapping tool 을 지원하고

Embedded C 와 호환이 좋기 때문입니다 .

Page 10: IoT 개발자를 위한 Embedded C에서 TDD를 해보자

Bootstrapping Tool 인 Ceedling 이란 무엇일까요 ?

Page 11: IoT 개발자를 위한 Embedded C에서 TDD를 해보자

Ceedling - TDD Bootstrapping tool

• Ceedling 은 명령 프롬프트 창에서 TDD 실행 자동화를 지원합니다 .

• 여기를 참고해서 설치를 완료해주세요.

CEEDLING

Page 12: IoT 개발자를 위한 Embedded C에서 TDD를 해보자

설치를 완료하셨다면 앞으로 “ 30 초” , TDD 테스트 결과를 확인할 수 있습니다 .

Page 13: IoT 개발자를 위한 Embedded C에서 TDD를 해보자

Ceedling - 프로젝트 생성

• 명령 프롬프트 창에서 프로젝트를 관리하는 임의의 폴더로 이동한 뒤 ,• $ceedling new TDD

Page 14: IoT 개발자를 위한 Embedded C에서 TDD를 해보자

Ceedling – TDDModule 모듈 생성

• $cd TDD• $rake module:create[TDDModule/TDDModule]

Page 15: IoT 개발자를 위한 Embedded C에서 TDD를 해보자

Ceedling - 테스트

● $rake test:all

Page 16: IoT 개발자를 위한 Embedded C에서 TDD를 해보자

이제 호스트 시스템 (PC) 에서 테스트 결과를 확인할 수 있습니다 !앞에서 사용한 Ceedling 에 대해 조금 더 설명을 드리자면 ,

Page 17: IoT 개발자를 위한 Embedded C에서 TDD를 해보자

Ceedling - 명령어 도움말

• $rake -T

Page 18: IoT 개발자를 위한 Embedded C에서 TDD를 해보자

Ceedling - 테스트

• 테스트 코드 입니다 .• ..../TDD/test/test_LedDriver.c

Page 19: IoT 개발자를 위한 Embedded C에서 TDD를 해보자

Ceedling - TDD

• ..../TDD/test/support 에 테스트에 필요한 파일을 추가 해주면 별도의 경로 지정 없이 code 내에서 include 가능합니다 .

• Assert 함수는 ..../TDD/vendor/ceedling/vendor/unity/src/unity.h 에서 확인 가능합니다 .

• SUT 와 Test code 를 수정하면서 TDD 를 진행하면 됩니다 .

• Ceedling의 자세한 사용법은 여기를 참고해주세요.

Page 20: IoT 개발자를 위한 Embedded C에서 TDD를 해보자

Ceedling 은 프로젝트 생성 , 모듈 추가 그리고 테스트 환경 구축까지 빠른 주기로 실행 가능한 강력한 Bootstrapping Tool 입니다 .

Page 21: IoT 개발자를 위한 Embedded C에서 TDD를 해보자

그렇다면 , 호스트 시스템 (PC) 이 아닌 타깃 시스템 (nRF51-DK) 에서 실행되는 테스트 코드는 어떻게 실행 결과를 확인할 수 있을까요 ?

Page 22: IoT 개발자를 위한 Embedded C에서 TDD를 해보자

타깃 시스템 - Unity framework

• 복잡한 동작 방식과는 관계없이 최종적으로 Unity framework 는 출력 함수 putchar() 를 통해 테스트 결과를 출력하는 기능을 가지고 있습니다 .

UNITY

Page 23: IoT 개발자를 위한 Embedded C에서 TDD를 해보자

타깃 시스템 - 출력 함수

• 그렇기 때문에 , 테스트 결과를 PC 에서 출력하는 방법은 간단합니다 .• 타깃 시스템이 putchar() 함수를 지원하도록 하거나 ,

• Unity framwork 에서 출력 함수 putchar() 를 타깃 시스템이 지원하는 출력 함수로 대체 합니다 .

UNITYputchar(

)write()

Page 24: IoT 개발자를 위한 Embedded C에서 TDD를 해보자

타깃 시스템 - nRF51-DK

• nRF51-DK 는 <stdio.h> 파일을 include 하여 putchar() 함수를 지원합니다 .

putchar()

Page 25: IoT 개발자를 위한 Embedded C에서 TDD를 해보자

nRF51-DK 에서 putchar() 함수로 출력 되는 테스트 결과를 어떻게 PC 에서 확인하면 될까요 ?

Page 26: IoT 개발자를 위한 Embedded C에서 TDD를 해보자

• putchar() 함수를 통해 출력 되는 결과는 UART 통신을 통해 호스트 시스템(PC) 에서 확인이 가능하게 됩니다 .

UART 통신

UNITY

Page 27: IoT 개발자를 위한 Embedded C에서 TDD를 해보자

시리얼 터미널

• 시리얼 통신이 가능한 프로그램을 자유롭게 설치해주세요 .

• 여기서는 Teraterm을 사용하도록 하겠습니다 .

Page 28: IoT 개발자를 위한 Embedded C에서 TDD를 해보자

시리얼 터미널

• nRF51-DK 를 연결하고 ,• Teraterm 메뉴에서 설정 - 시리얼 포트를 클릭 한 뒤에 위와 같이

설정합니다 .• 포트는 동일하지 않을 수 있습니다 .

Page 29: IoT 개발자를 위한 Embedded C에서 TDD를 해보자

이제 nRF51-DK 에서 구동 가능한 프로젝트 구성을 하고 ,최종적으로 nRF51-DK 를 통해 테스트 결과를 PC 에서 확인해보도록 하겠습니다 .

Page 30: IoT 개발자를 위한 Embedded C에서 TDD를 해보자

프로젝트 구성

• https://github.com/KimmTY/nRF51_Unit_Testing 에서 repository 를 다운 받거나 ,

• 명령 프롬프트창에서 원하는 폴더로 이동 후 ,

• git clone https://github.com/KimmTY/nRF51_Unit_Testing.git 입력합니다 .

Page 31: IoT 개발자를 위한 Embedded C에서 TDD를 해보자

프로젝트 구성 - 환경구축

• https://github.com/KimmTY/nRF51_Unit_Testing 에서 Need section 은 모두 충족 시켜주세요 .

Page 32: IoT 개발자를 위한 Embedded C에서 TDD를 해보자

nRF51-DK 에서 TDD 를 해보자 - Compile• nRF51-DK 를 연결한 상태에서 ,

• 명령 프롬프트 창을 실행하고 ,

• $cd nRF51_Unit_Testing

• $make all

Page 33: IoT 개발자를 위한 Embedded C에서 TDD를 해보자

nRF51-DK 에서 TDD 를 해보자 - Soft Device• $make flash_softdevice

Page 34: IoT 개발자를 위한 Embedded C에서 TDD를 해보자

nRF51-DK 에서 TDD 를 해보자 - Application• $make flash nrf51422_xxac_s110

Page 35: IoT 개발자를 위한 Embedded C에서 TDD를 해보자

Application 까지 Flash 하고 Teraterm 터미널을 확인해보면 ,

Page 36: IoT 개발자를 위한 Embedded C에서 TDD를 해보자

테스트 결과

Page 37: IoT 개발자를 위한 Embedded C에서 TDD를 해보자

마지막 절차인 타깃 시스템이 보낸 테스트 결과를 시리얼 터미널로 확인 가능하게 되었습니다 !이제는 하드웨어에 의존적인 부분까지도 TDD 를 실천할 수 있습니다 .

Text color, 출력 옵션 , Test code 추가 등 TDD 를 진행하면서 궁금한 점은 여기를

참고해주세요 .

Page 38: IoT 개발자를 위한 Embedded C에서 TDD를 해보자

임베디드 시스템에서 TDD 를 실천하는 것은 도전적이라고 생각합니다 .

열악한 디버깅 환경에서

SW 로부터 발생하는 문제인지 ,HW 로부터 발생하는 문제인지 ,

확인조차 되지 않는 일이 매일 같이 발생합니다 .

TDD 를 실천함으로써 HW 와 SW 경계가 명확해지고 ,설계는 더욱 개선됩니다 .

이 자료가 정답이 아닐 수도 있지만 ,조금이라도 도움이 되어 즐거운 TDD 라이프가 만들어지면 좋겠습니다 .

Page 39: IoT 개발자를 위한 Embedded C에서 TDD를 해보자

또한 , 임베디드 개발자는 컴파일러 , 타깃 시스템 등 특성을 많이 타고범용적이지 않은 상황을 자주 마주하게 됩니다 .

그때마다 서로의 경험을 공유하고 지식을 나눈다면 ,더 많은 임베디드 개발자분들이 더 신뢰가 가고 안정적인 프로젝트를 만들지 않을까 싶습니다 .

Page 40: IoT 개발자를 위한 Embedded C에서 TDD를 해보자

감사합니다 .김태엽

[email protected]