CMake:如何设置库的单元测试
CMake: How to setup unit testing of a library
我在一个 kata 项目下工作,学习如何用 C++ 编写单元测试 (link to the repository)。该项目中的元素之一是 DictionaryPath 库。它被放置在一个单独的目录中,带有专用 CMakeFile.txt
:
cmake_minimum_required(VERSION 3.6 FATAL_ERROR)
add_library(DictionaryPath
include/DictionaryPath/Dictionary.h
src/Dictionary.cpp
include/DictionaryPath/DictionaryPath.h
src/DictionaryPath.cpp
src/WordsGraph.cpp
src/WordsGraph.h
src/DijkstraAlgorithmImpl.cpp
src/DijkstraAlgorithmImpl.h
src/Path.cpp
src/Path.h
src/Graph.h
src/ShortestPathAlgorithm.h
src/DijkstraAlgorithm.h)
target_include_directories(DictionaryPath PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
PRIVATE src)
它可以与其他目标(库的客户端)一起使用,但是当我尝试在同一子目录中添加单元测试时,我遇到了如何定义单元测试目标的问题。 E.q。 WordsGraph
class。我定义了一个目标:
add_executable(WordsGraphTest test/WordsGraphTest.cpp)
target_link_libraries(WordsGraphTest GTest::main DictionaryPath)
add_test(NAME WordsGraphTest COMMAND WordsGraphTest)
但是如果我想参考 WordsGraph
头文件,我有:
test/WordsGraphTest.cpp:9:10: fatal error: 'WordsGraph.h' file not found
我理解一个原因 - src/
中的文件是私有的,但在这种情况下如何测试库内部文件而不为链接到它的每个目标实现?我是否应该在每个单元测试中重复编译必要的库文件?
你遇到的问题应该很容易解决(WordsGraph.h没找到)。您可以使用 include_directories 或 target_include_directories.
add_library(DictionaryPath
...
src/WordsGraph.h
...
)
target_include_directories(DictionaryPath PUBLIC
...
PRIVATE src)
WordsGraph.h
在 src
中,您将 src
声明为 DictionaryPath
.
的私有包含目录
如果您在创建单元测试时除了调用 target_link_libraries
之外不想做更多的事情,您应该将 WordsGraph.h
移动到 include
,或者声明 src
作为 public 或接口包含目录。
如果您不想将 WordsGraph.h
移动到 include
,也不想将 src
声明为 public 或接口包含目录,您应该添加对target_include_directories
:
add_executable(WordsGraphTest test/WordsGraphTest.cpp)
target_link_libraries(WordsGraphTest GTest::main DictionaryPath)
target_include_directories(WordsGraphTest PRIVATE src)
add_test(NAME WordsGraphTest COMMAND WordsGraphTest)
我在一个 kata 项目下工作,学习如何用 C++ 编写单元测试 (link to the repository)。该项目中的元素之一是 DictionaryPath 库。它被放置在一个单独的目录中,带有专用 CMakeFile.txt
:
cmake_minimum_required(VERSION 3.6 FATAL_ERROR)
add_library(DictionaryPath
include/DictionaryPath/Dictionary.h
src/Dictionary.cpp
include/DictionaryPath/DictionaryPath.h
src/DictionaryPath.cpp
src/WordsGraph.cpp
src/WordsGraph.h
src/DijkstraAlgorithmImpl.cpp
src/DijkstraAlgorithmImpl.h
src/Path.cpp
src/Path.h
src/Graph.h
src/ShortestPathAlgorithm.h
src/DijkstraAlgorithm.h)
target_include_directories(DictionaryPath PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
PRIVATE src)
它可以与其他目标(库的客户端)一起使用,但是当我尝试在同一子目录中添加单元测试时,我遇到了如何定义单元测试目标的问题。 E.q。 WordsGraph
class。我定义了一个目标:
add_executable(WordsGraphTest test/WordsGraphTest.cpp)
target_link_libraries(WordsGraphTest GTest::main DictionaryPath)
add_test(NAME WordsGraphTest COMMAND WordsGraphTest)
但是如果我想参考 WordsGraph
头文件,我有:
test/WordsGraphTest.cpp:9:10: fatal error: 'WordsGraph.h' file not found
我理解一个原因 - src/
中的文件是私有的,但在这种情况下如何测试库内部文件而不为链接到它的每个目标实现?我是否应该在每个单元测试中重复编译必要的库文件?
你遇到的问题应该很容易解决(WordsGraph.h没找到)。您可以使用 include_directories 或 target_include_directories.
add_library(DictionaryPath
...
src/WordsGraph.h
...
)
target_include_directories(DictionaryPath PUBLIC
...
PRIVATE src)
WordsGraph.h
在 src
中,您将 src
声明为 DictionaryPath
.
如果您在创建单元测试时除了调用 target_link_libraries
之外不想做更多的事情,您应该将 WordsGraph.h
移动到 include
,或者声明 src
作为 public 或接口包含目录。
如果您不想将 WordsGraph.h
移动到 include
,也不想将 src
声明为 public 或接口包含目录,您应该添加对target_include_directories
:
add_executable(WordsGraphTest test/WordsGraphTest.cpp)
target_link_libraries(WordsGraphTest GTest::main DictionaryPath)
target_include_directories(WordsGraphTest PRIVATE src)
add_test(NAME WordsGraphTest COMMAND WordsGraphTest)