개발/개발 환경

[개발 환경] CMake 프로젝트에 Googletest 추가하기

growing-dev 2023. 2. 5. 22:35

Googletest를 사용하기 위해 여러 가지 방법이 있을 수 있다. 나는 VS Code로 셋업 한 CMake 프로젝트에 CMake 명령어를 통해 Googletest를 추가하는 것을 해보겠다.

 

 

CMake 프로젝트에 Googletest 추가하기

  • Googletest를 CMake 프로젝트로 가져오기
  • 테스트 작성 후 빌드하기
  • 실행하기

 

Googletest를 CMake 프로젝트로 가져오기

Googletest를 CMake 프로젝트에서 빌드되게 만드는 것은 크게 2가지가 있을 수 있다. 첫 번째는 적당한 최신 버전을 다운로드해서 프로젝트 디렉터리에 포함한 뒤 함께 CMake로 빌드하고 추가하는 방법이 있다. 두 번째는 Fetch Content 기능을 통해 Goggletest의 repository로부터 당겨와서 빌드하는 방식이다. 첫 번째 방식보다는 두 번째 방식이 최신의 Googletest를 쉽게 당겨올 수 있는 자유도가 크고 프로젝트에 포함하지 않아도 돼서 더 좋은 방식이라고 생각한다. 물론 안정적인 버전을 넣어놓고 웹과 연결 없이 빌드하는 것이 좀 더 안정적일 수는 있겠지만 두 번째 방식이 더 마음에 들어서 그렇게 해보았다. 내 프로젝트 구성은 다음과 같다.

크게 build, inc, src, test로 구성되어 있고 테스트를 위해 factorial.cpp를 src에 추가하고, 해당 함수를 inc에 선언하고 test 디렉터리에 factorialTest.cpp를 작성하였다.

 

CMakeList.txt에 아래 코드를 추가한다. 이는 원하는 Googletest를 fetch해오는 코드 혹은 스크립트라고 할 수 있다.

GIT_TAG 부분에 원하는 버전을 명시할 수 있어서 최신 혹은 예전 버전을 쉽게 사용할 수 있는 것이 장점이다. 굳이 이렇게 할 필요가 없다면 해당 github에서 원하는 버전을 다운로드하여서 CMake에 빌드할 수 있도록 추가해 주면 될 것이다.

include(FetchContent)
FetchContent_Declare(
        googletest
        GIT_REPOSITORY https://github.com/google/googletest.git
        GIT_TAG        release-1.10.0
)
FetchContent_GetProperties(googletest)
if(NOT googletest_POPULATED)
    FetchContent_Populate(googletest)
    add_subdirectory(${googletest_SOURCE_DIR} ${googletest_BINARY_DIR})
    include_directories(${gtest_SOURCE_DIR}/include ${gmock_SOURCE_DIR}/include)
endif()

 

테스트 작성 후 빌드하기

내가 만든 최종 CMake는 다음과 같다. 딱 필요한 수준의 명령어들만 구현하였다.

위에 FetchContent를 포함하여 최종 my_test_project와 factorialTest가 생성될 것이며 factorialTest는 gtest, gtest_main, my_test_project를 link 하도록 하여 factorialTest가 my_test_project에 속한 factorial.cpp의 factorial 함수를 테스트할 수 있도록 하였다.

cmake_minimum_required(VERSION 3.25)

project(my_test_project LANGUAGES CXX)

set(CMAKE_BUILD_TYPE Debug) 

file(GLOB SRC
    "src/*.cpp" "src/*.c")

add_library(my_test_project ${SRC})

target_include_directories(my_test_project PUBLIC ${CMAKE_SOURCE_DIR}/inc)

include(FetchContent)
FetchContent_Declare(
        googletest
        GIT_REPOSITORY https://github.com/google/googletest.git
        GIT_TAG        release-1.10.0
)
FetchContent_GetProperties(googletest)
if(NOT googletest_POPULATED)
    FetchContent_Populate(googletest)
    add_subdirectory(${googletest_SOURCE_DIR} ${googletest_BINARY_DIR})
    include_directories(${gtest_SOURCE_DIR}/include ${gmock_SOURCE_DIR}/include)
endif()

add_executable(factorialTest test/factorialTest.cpp)
target_link_libraries(factorialTest  gtest gtest_main my_test_project)

 

 

아래는 실제 factorialTest.cpp에서 구현한 테스트 케이스 2가지이다.

gtest.h를 추가하여 gtest에서 제공하는 프레임워크를 사용할 수 있도록 한다. 그리고 실제 factorial 함수를 사용하기 위해 factorial 함수가 선언된 factorial.h를 include 한다. 이 때 위에서 target_link_libraries를 통해 link가 되어 있어야 문제없이 추가할 수 있다.

#include "gtest/gtest.h"
#include "factorial.h"

TEST(factorialTest, TestZero){
    EXPECT_EQ(factorial(0),0);
}

TEST(factorialTest, Test3){
    EXPECT_EQ(factorial(3),6);
}

 

 

실행하기

빌드를 수행한 결과 my_test_project 뿐만 아니라 googletest까지 정상적으로 빌드가 되는 것을 볼 수 있다. 체감상 실제 다운받은 바이너리를 빌드하는 것보다는 시간이 좀 더 걸리긴 하는 것 같다.

factorialTest 실행결과 2개의 테스트가 모두 성공적으로 수행되고 Pass된 것을 알 수 있다. 간단한 테스트여서 시간도 얼마 걸리지 않는 것을 확인할 수 있다.

 

결론

Googletest를 포함하여 프로젝트를 구성하는 방법을 알아보았다. Googletest를 활용한다면 쉽게 테스트 케이스를 추가할 수 있는 것 같다. 개발을 하면 할수록 테스트가 중요하다는 것을 뼈저리게 느끼는 중이다. 추후에는 Mocking 기능까지 제대로 활용하여 좀 더 좋은 테스트를 만들 수 있도록 계속 공부해야 할 것 같다.

반응형