你只需要建立一次googletest图书馆吗?

时间:2015-06-03 13:47:25

标签: c++ cmake makefile static-libraries googletest

首先,我是测试框架的新手,而且是C ++的新手,但我正试图围绕GoogleTest。我正在使用Windows机器,运行" Git for Windows" (MSYS)和MinGW,同时使用Sublime Text作为我的代码编辑器。我使用make作为我的构建工具,虽然我对cmake及其跨平台焦点的了解越多,我就会想知道是否应该切换到让cmake为我创建makefile。 (那可能是另一个问题)

我努力理解的是与GoogleTest源代码包有什么关系。我意识到我需要将源代码构建到库中,然后在编译我的测试时包含它,但是我应该怎么做呢? Google包含一个cmake构建脚本,可生成用于构建的env / compilier特定makefile。我应该用这个吗?我觉得如果我这样做,它会盲目地工作,很多发生在幕后的事情会让我头脑发热。自述文件并不能解决我的问题,因为这意味着每次我希望运行它时我都应该构建库和我的测试。库不应该是一个只需要编译一次的独立存档吗?我很困惑,我确信这是我的错,但如果有人为我解释这个过程,我会很感激。

1 个答案:

答案 0 :(得分:1)

您应该记住,如果您没有更改gtest源代码中的任何内容, make 将不会重建 gtest

以下是我使用cmake和gtest进行单元测试的方法。

您可以通过在根CMakeLists.txt文件中将其添加为子目录来添加gtest源代码。

add_subdirectory(${CMAKE_SOURCE_DIR}/thirdparty/gtest ${CMAKE_CURRENT_BINARY_DIR}/gtest)
include_directories(${CMAKE_SOURCE_DIR}/thirdparty/gtest/include ${CMAKE_SOURCE_DIR}/thirdparty/gtest)

我的应用程序包含单个模块,其中包含用于单元测试的测试文件夹我有以下样板循环将每个测试添加到全局范围。

file(GLOB TEST_SRC_FILES *.cpp) 
foreach(TEST_SRC_PATH ${TEST_SRC_FILES})
 #get filename of your test without extension
 get_filename_component(TEST_NAME ${TEST_SRC_PATH} NAME_WE)

 add_executable(${TEST_NAME} ${TEST_NAME})

 #here you link the test executable with gtest
 target_link_libraries(${TEST_NAME} gtest  gtest_main)

 #-----------------------------
 # you can link here your test to external libraries
 #-----------------------------

 add_test(${TEST_NAME} ${TEST_NAME})

 #this is a list of all tests
 set(PROJECT_TEST_NAMES ${PROJECT_TEST_NAMES} ${TEST_NAME})  
endforeach()

 #This assigns the list of tests to a property. This make the list available from the root scope.
 get_property(UNIT_TESTS GLOBAL PROPERTY UNIT_TESTS)
 set(UNIT_TESTS ${UNIT_TESTS} ${PROJECT_TEST_NAMES})
 set_property(GLOBAL PROPERTY UNIT_TESTS ${UNIT_TESTS} )

最后,在根范围中,我添加了一个名为 check 的自定义目标,它在我的单元测试中运行ctest。

#-----------------------------
# Running unit tests
#-----------------------------
get_property(UNIT_TESTS GLOBAL PROPERTY UNIT_TESTS)
if(DEFINED UNIT_TESTS)
    add_custom_target(check COMMAND ctest -VV
                             DEPENDS ${UNIT_TESTS})
endif()

当我运行make check时,它会从所有模块运行单元测试,而make在没有测试的情况下编译。