您只需要构建一次 googletest 库吗?

Do you only need to build the googletest library once?

所以首先,我是测试框架的新手,也是 C++ 的新手,但我正试图全神贯注于 Google测试。我正在 Windows 机器上工作,运行ning "Git for Windows" (MSYS) 和 MinGW,同时使用 Sublime Text 作为我的代码编辑器。我正在使用 make 作为我的构建工具,尽管我对 cmake 及其跨平台关注的了解越多,我就越想知道我是否应该切换为让 cmake 为我创建 makefile。 (这可能是另一个问题)

我很难理解的是Google测试源包的确切用途。我意识到我需要将源构建到库中,然后在编译我的测试时包括它,但我应该如何去做呢? Google 包含一个 cmake 构建脚本,该脚本生成 env/compilier 个用于构建的特定 makefile。我应该使用这个吗?我觉得如果我这样做并且它盲目地起作用,那么引擎盖下发生的很多事情都会让我头疼。自述文件并没有解决我的问题,因为它暗示每次我希望 运行 它们时我都应该构建库和我的测试。图书馆不应该是一个只需要编译一次的独立档案吗?我很困惑,我确定这是我的错,但如果有人为我阐明这个过程,我将不胜感激。

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

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

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

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 的自定义目标,它在我的单元测试中 运行s 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 编译时没有测试。