ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 구글 테스트 툴을 이용한 UnitTest용 CMakefile
    Modern C++ 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

    'Modern C++' 카테고리의 다른 글

    RSA 인증  (0) 2020.09.06

    댓글

Designed by Tistory.