【问题标题】:How to make BOOST unit tests run when building a project构建项目时如何让 BOOST 单元测试运行
【发布时间】:2021-07-31 06:48:25
【问题描述】:

我正在开发一个按如下方式组织成库的 C++ 项目:

├── Lib_1
│   ├──  ...
│   └──  CMakeLists.txt
├── Lib_2
│   ├──  ...
│   └──  CMakeLists.txt
│   ...
├── Lib_N
│   ├──  ...
│   └──  CMakeLists.txt
├── Main.cpp
└── CMakeLists.txt

文件夹结构之外的主要可执行文件。主要的CMakeLists有以下内容:

cmake_minimum_required(VERSION 3.10)

project(MyConsoleApp VERSION 1.0)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)

add_subdirectory(Lib_1)
add_subdirectory(Lib_2)
...
add_subdirectory(Lib_N)

add_executable(${PROJECT_NAME} Main.cpp)

target_link_libraries(${PROJECT_NAME}
    Lib_1
    Lib_2
    ...
    Lib_N
)

和子文件夹中的 CMakeLists:

set(Lib_k_Src  # k = 1,2,...,N
    src1.h
    src1.cpp
    ...
)
add_library(Lib_k ${Lib_k_Src})

我想为每个库组件附加一个 BOOST(或任何其他)单元测试套件,并确保它在每次构建组件时运行。或者,或者,生成带有测试套件的可执行文件,这些可执行文件可以与主执行程序分开运行。

到目前为止,我在将 Boost 和 CppUnit 与主可执行文件集成时的所有尝试都失败了,导致在附加第三方单元测试库时出现链接器错误(通常是 LNK1104)。我为 boost include 和 lib 目录创建了 Windows 环境变量,并尝试了一些 available examples with CMake,但这些甚至不会在 CMakeGUI 中配置。我唯一的运气是在单独的解决方案中使用 CppUnit,没有 CMake 生成的包装器,在运行时通过 Main.cpp 使用 CppTestRunner。

知道如何解决这个问题吗?

我花了几天时间试图解决这个问题,甚至考虑实现我自己的断言宏进行测试,以便可以在运行时从 main 调用它们。

我的 Boost 设置可以在 here 找到。目前,我已经生成了一个测试库 Symplekt_GeometryBase_Tests 到 Symplekt_GeometryBase 作为原型。 感谢您提供任何有用的见解。

【问题讨论】:

    标签: c++ unit-testing boost cmake cmake-gui


    【解决方案1】:

    你错过了很多东西。请务必重新阅读 Boost 的 extensive documentation,了解在构建期间可以使用单元测试库的不同使用变体。

    • 在 CMake 配置期间使用 find_package(Boost REQUIRED) 到 find Boost。根据您是使用仅标头版本还是库版本,在后一种情况下,您需要添加 unit_test_framework 作为 find 调用所需的组件。您可能希望在顶级CMakeLists.txt 中执行此操作。如果这无法自动找到 Boost,请尝试将 Boost_ROOT 环境变量设置为您机器上 Boost 的安装目录,或者在 StackOverflow 上查看许多其他答案,以使用 CMake 查找 Boost。 (提示:如果没有明显的原因一直失败,那么您可能没有正确构建/安装 Boost)。
    • 通过调用target_link_libraries(mytest PUBLIC Boost::boost) 让您的测试可执行目标将Boost 作为依赖项引入。同样,如果您不使用仅标头设置,您还需要以相同方式链接到Boost::unit_test_framework。摆脱您当前使用的所有 ${BOOST_WHATEVER} 变量,您将不再需要这些变量。
    • 您需要致电enable_testing。这应该在包含任何测试之前在根 CMakeLists 中完成一次 ideally。
    • 使用add_test 向CMake 的测试机制注册测试目标。看来您已经在这样做了。

    您的单元测试现在将在 CMake 的测试运行程序中注册,并且可以通过构建相应的 CMake 元目标(如 RUN_TESTS)或通过 ctest 执行。

    您可以在构建期间通过adding a custom build step that invokes the test runner 自动执行测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-09
      • 2011-03-29
      • 1970-01-01
      相关资源
      最近更新 更多