[SLAM] 10. TDD

happy_quokka·2023년 11월 24일
0

SLAM

목록 보기
11/28

SLAM 엔지니어는 여러 알고리즘을 사용하여 SLAM 시스템을 만든다

TDD

  • Test Driven Development / Test Driven Design (테스트 주도 개발, 디자인)
  • 개발을 하기 전부터 테스트를 먼저 작성한다
  • 그러면 코드, 아키텍서를 디자인 하는 방식이 바뀌게 된다

TDD cycle


1. 실패하는 테스트 작성 (유저들이 어떤 형태로 feature detector를 쓰고 싶을까를 먼저 생각, 클래스?함수?)
2. 테스트가 패스할 수 있는 최소한의 코드 작성 (빈 클래스 생성 등..)
3. refactor
4. 원하는 기능을 다 만들었으면 종료. 아니면 다시 1번으로

실패하는 테스트

  • 테스트의 의미 2가지
    1. 기능상의 테스트
    • 테스트 프레임워크(GTest, Catch2)를 통해 기능상의 테스트할 수 있다
    • GTest 추천
    1. 컴파일러 빌드 테스트
    • 빌드 가능함 증명

테스트가 패스할 수 있는 최소한의 코드

  • 빠르게 / 테스트가 요구하는 기능 충족할 수 있다
  • 기능 개발에 집중

refactoring

  • 클린 코드 만들기
  • 가독성을 높이고, 아키텍처 고려

종합하면...

  • TDD의 장점은 테스트하기 쉬운 코드를 유도하게 된다. 이를 통해 기능의 모듈화나 인터페이스 분리와 같은 점들을 빠르게 고려해서 짜게 되는 점이 굉장히 큰 이점이다. 테스트하기 어려운 코드는 아무래도 좋은 디자인을 가지지 않기 때문에 고치게 된다.
  • 개발을 할 때 테스트는 implemetation test로써 개발의 진척도를 나타내는 지표
  • 개발이 완료되었을 때는 regression test로써 코드의 안정성을 나타내는 지표
  • 테스트하기 쉬운 코드를 짜야한다는 '디자인 압박' -> 테스트하기 좋은 코드, 사용하기 좋은 코드 작성하게 된다!
  • TDD를 통해 개발하면 거의 항상 100%의 coverage를 달성할 수 있다. (모든 코드가 테스트 된다)

GTest

  • EXPECT_EQ : 기대하는 결과
    • EXPECT_EQ(pts3D.allFinite(), true) : pts3D.allFinite() 결과가 true임을 기대한다. -> pts3D.allFinite() 결과가 true인지 확인

코드

  • module 단위로 test하는 것 선호
  • module안에 include, test, resources, src, CMakelists.txt가 있다
  • test : test 파일 만들어 사용
  • resources : test에 필요한 파일들, module을 실행할 때 필요한 것들
  • module1/CMakelists.txt
    • compile options(target_compile_options)
      • compile을 빌드할 때 사용하는 flag로 더욱 안전한 코드를 만들 수 있다.
      • -Wall : 컴파일에서 지정하는 warning을 다 띄우도록
      • -Wextra : 더 체크하면 좋을 것들
      • -Wpedantic : 더 체크하면 좋을 것들
      • -Werror : 모든 warning은 error로 해서 빌드 터지도록

TDD Demo

  • project을 어떻게 구현하는지 보여준다
  • 실사용 예제를 만들고 구현을 하기 때문에 나중에 함수 사용 방법을 알고 싶으면 TEST를 보면 된다
  • 결과
    1. 유저가 원하는대로 코드를 구현했다
    2. 설계 방법도 알려줬다
    3. 코드가 설계한대로 돌아간다 -> 안정성 보장

template 사용법

https://github.com/changh95/programmers_slam_project_template/tree/master

  • thirdparty의 yaml 파일을 보면 필요한 라이브러리들이 다 있다. 빌드를 자동화해주는 부분이다.
  • 터미널에서 ./buildDeps.py를 실행시키면 자동으로 빌드된다
    • argument 안하면 릴리즈로 빌드
    • --d : 디버그, 릴리즈 둘다 빌드
    • --system : thirdparty 폴더에 설치하는 것이 아니고 system에 설치
    • --password 패스워드입력 : sudo 부분들에서 패스워드 입력을 알아서 해준다
    • 나는 ./buildDeps.py --d 로 빌드
  • cmake_files : cmake의 find_package, include directory 이런 것들을 여기 파일들을 include하면 알아서 다 찾아준다

0개의 댓글