CMake:如何设置库的单元测试

CMake: How to setup unit testing of a library

本文关键字:单元测试 设置 何设置 CMake      更新时间:2023-10-16

我在一个kata项目下工作,学习如何用C++编写单元测试(链接到存储库(。该项目中的一个元素是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)

它可以与其他目标(库的客户端(一起查找,但当我试图在同一子目录中添加单元测试时,我遇到了如何定义单元测试目标的问题。例如WordsGraph类。我定义了一个目标:

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/中的文件是私有的,但在这种情况下,如何在没有为链接到它的每个目标实现的情况下测试库内部文件?我应该在每个单元测试中重复编译必要的库文件吗?

add_library(DictionaryPath
        ...
        src/WordsGraph.h
        ...
)
target_include_directories(DictionaryPath PUBLIC
    ...
    PRIVATE src)

WordsGraph.hsrc中,您将src声明为DictionaryPath的私有包含目录。

如果您不想在创建单元测试时只调用target_link_libraries,那么您应该将WordsGraph.h移到include中,或者将src声明为公共目录或接口包含目录。

如果您不想将WordsGraph.h移动到include中,也不想声明src为公共目录或接口包含目录,则应该添加对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)

解决您遇到的问题应该很容易(找不到WordsGraph.h(。您可以使用include_directions或target_include_directions。