【问题标题】:Use several test files with Boost.Test and modern CMake使用 Boost.Test 和现代 CMake 的多个测试文件
【发布时间】:2019-09-03 18:34:13
【问题描述】:

我正在尝试将 Boost.Test (v1.69.0) 与现代 CMake (v3.15.0) 一起使用来编写和构建我的单元测试。 主要困难是将我的测试拆分为几个测试文件:在这种情况下,Boost.Test 找不到测试。

我在 Linux (OpenSUSE) 上使用我的包管理器提供的 Boost 发行版,这意味着我有开发头文件和动态库。

我发现的大多数关于 Boost.Test/CMake 交互的文档/教程/示例都涉及旧版本的 CMake (v2),您知道 CMake 的语法和理念在 v2 和 v3 之间发生了多大的演变。 所以我发现的东西不适合我的情况。

这是我的情况的简单 MWE:

project
├── CMakeLists.txt
└── tests
    ├── test_one.cpp # first test file
    ├── test_two.cpp # second test file
    └── test_unit.cpp # main test file

主测试文件,不包含实际测试:

// tests/test_unit.cpp
#define BOOST_TEST_MODULE "Unit Test"
#define BOOST_TEST_DYN_LINK // I use dynamic libraries of Boost
#include <boost/test/unit_test.hpp>

第一个测试文件,包含实际测试:

// tests/test_one.cpp
#define BOOST_TEST_DYN_LINK
#include <boost/test/unit_test.hpp>

BOOST_AUTO_TEST_SUITE(testOne)

BOOST_AUTO_TEST_CASE(testDummy) {
        BOOST_TEST(true);
}

BOOST_AUTO_TEST_SUITE_END() // testOne

第二个测试文件是完全等价的,我就不展示了。 CMake 配置:

# CMakeLists.txt
# cmake version
cmake_minimum_required(VERSION 3.9...3.15 FATAL_ERROR)

# project definition
project(Dummy VERSION 0.0.0 LANGUAGES CXX)

# external libraries
find_package(Boost COMPONENTS unit_test_framework REQUIRED)

# first testing library
add_library(test_one tests/test_one.cpp)

# second testing library
add_library(test_two tests/test_two.cpp)

# test executable
add_executable(test_unit tests/test_unit.cpp)
target_link_libraries(test_unit Boost::unit_test_framework test_one test_two)

# testing command
enable_testing()
add_test(test_unit test_unit)

因此,我将这两个测试文件声明为库,并将它们静态链接到主测试可执行文件。

现在,我可以构建这个 MWE,但二进制文件 test_unit 无法找到测试和输出:

Test setup error: test tree is empty

我不明白为什么。 我发现了两种不令人满意的方法来使它工作:

  1. 我声明这两个库是动态的,例如add_library(test_two SHARED tests/test_two.cpp)。 但这对我来说对与可执行文件位于同一目录中的内容使用动态链接毫无意义。

  2. 我将两个测试文件包含在主测试文件中,并删除了CMakeLists.txt 中的库。 但这很丑。

目前,我不能为 Boost.Test 使用静态链接,因为我的包管理器没有提供静态库。 我尝试使用仅标头的 Boost.Test,但问题是一样的。

我该怎么办?

【问题讨论】:

  • 你真的需要每个测试文件都有一个库吗?
  • 我以前在一个真实项目中看到过它。我还以为……过分了。我可怜的链接器!
  • IIRC,有一些关于这样做的博客......与boost_test 处理创建自己的main() 的方式有关。如果您编写所有测试而没有在任何地方指定它们的主宏,那么这将为您包装它们......但是如果您有一个主文件,您可以将 N 个 cpp 文件堆叠在一个 exe 中。
  • @MarkStorer 这是#include &lt;boost/test/unit_test.hpp&gt; 对您之前定义的各种宏所做的操作。
  • @IanA.B.K.在一个真实的项目中,最好每个特性库有一个测试文件,只测试这个特性库。除了在 CMake 中将这些测试文件声明为库之外,我还有什么其他选择?

标签: c++ cmake boost-test


【解决方案1】:

正如 cmets 中所指出的,每个测试文件不需要是一个库。我实际上只需要可执行文件:

# test executable
add_executable(test_unit
    tests/test_unit.cpp
    tests/test_one.cpp
    tests/test_two.cpp
)
target_link_libraries(test_unit Boost::unit_test_framework)

顺便说一句,我什至可以将测试文件中的#define BOOST_TEST_DYN_LINK 分解为:

target_compile_definitions(test_unit PUBLIC BOOST_TEST_DYN_LINK)

所以一切正常。

【讨论】:

  • 如果它确实是解决方案,您可能应该将您的答案标记为解决方案,以免它最终污染“未解决”类别。
  • 我可以从明天开始做这个……
猜你喜欢
  • 1970-01-01
  • 2021-07-25
  • 2021-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多