Modern C++

구글 테스트 툴을 이용한 UnitTest용 CMakefile

basker 2020. 9. 6. 15:05

FetchContent는 Modern CMake에 추가된 기능으로 ExternalProject 를 통해서 이루어지던 방법들을 통해 외부 프로젝트를 설정 시간에 이동 시킬 수 있다. FetchContent를 사용하기 위해서는 include를 통해서 해당 모듈을 추가시키고 FetchContent_Declare를 통해 외부 프로젝트의 저장소를 정의 한다. FetchContent로 설정된 외부 프로젝트의 설정은 FetchContent_Populate()를 통해서 이루어 지고

해당 프로젝트를 add_subdirectory를 통해서 소스 디렉토리와 바이너리 디렉토리를 현재 프로젝트에 추가한다. 

#CMake 에서 FetchContent 모듈을 사용을 위해 include 
include(FetchContent)

#외부 프로젝트인 googletest를 추가하기 위한 저장소 지정 
FetchContent_Declare(
        googletest
        GIT_REPOSITORY https://github.com/google/googletest.git
        GIT_TAG        release-1.10.0
)

project(crypto_algorithm)
set(CMAKE_CXX_STANDARD 17)

#googletest의 프로퍼티를 가져와 현재 프로젝트가 populate 되지 않았으면
#FetchContent_Populate를 통해서 하위 빌드 설정 
FetchContent_GetProperties(googletest)
if(NOT googletest_POPULATED)
	#googletest를 빌드하기위한 sub-build 구성 
    FetchContent_Populate(googletest)
    add_subdirectory(${googletest_SOURCE_DIR} ${googletest_BINARY_DIR})
    include_directories(${gtest_SOURCE_DIR}/include ${gmock_SOURCE_DIR}/include)
endif()

googletest를 사용해 단위 테스트를 위한 CMakefile은 아래와 같이 구성할 수 있다. 

cmake_minimum_required(VERSION 3.17)
include(FetchContent)
FetchContent_Declare(
        googletest
        GIT_REPOSITORY https://github.com/google/googletest.git
        GIT_TAG        release-1.10.0
)
project(crypto_algorithm)
set(CMAKE_CXX_STANDARD 17)

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(test_case utility.h integer_module_test.cpp)
#단위 테스트를 위해 libgtest, libgtest_main 라이브러리 링크 
target_link_libraries(test_case  gtest gtest_main)

utility.h

#include<iostream>

//최대 공약수 함수 
template <typename T, typename std::enable_if<std::is_integral_v<T>>::type * =  nullptr>
T gcd(T a, T b) {
    if (b == 0) return a;
    return gcd( b, a % b);
}

integer_modue_test.cpp

#include <gtest/gtest.h>
#include "utility.h"

TEST(gcd_test_case, gcd_test) {
    EXPECT_EQ(6,  gcd(12, 6));
}


int main(int argc, char **argv) {
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

위 프로젝트 파일을 통해 googletest 를 이용해 유닛 테스트가 어떻게 동작하는 지 확인하고싶다면 프로젝트를위한 폴더를 생성하고 

위의 세 파일을 만든다음 빌드가 동작할 cmake-build-debug 폴더를 생성하고 해당 폴더로 이동 후 ./cmake .. 를 호출하면 된다. 

$ mkdir cmake-build-debug
$ cd cmake-build-debug
$ cmake -DCMAKE_BUILD_TYPE=Debug ../
$ make 
$ ./test_case

또는 수행할 단위 테스트를 필터링 할 수 있음 

$ ./test_case --gtest_filter=gcd_test_case.gcd_test