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