C++ 将几个测试文件与Boost.test和modern CMake一起使用

C++ 将几个测试文件与Boost.test和modern CMake一起使用,c++,cmake,boost-test,C++,Cmake,Boost Test,我正在尝试使用Boost.Test(v1.69.0)和现代CMake(v3.15.0)来编写和构建我的单元测试。 主要的困难是将我的测试分成几个测试文件:在本例中,Boost.test无法找到测试 我使用Linux上的包管理器(OpenSUSE)提供的Boost发行版,这意味着我有开发头和动态库 我找到的关于Boost.Test/CMake交互的大多数文档/教程/示例都涉及到CMake(v2)的旧版本,您知道CMake的语法和原理在v2和v3之间有多大的发展。 所以我的发现不适合我的情况 以下是

我正在尝试使用Boost.Test(v1.69.0)和现代CMake(v3.15.0)来编写和构建我的单元测试。 主要的困难是将我的测试分成几个测试文件:在本例中,Boost.test无法找到测试

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

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

以下是我的简单情况:

项目
├── CMakeLists.txt
└── 测验
├── test_one.cpp#第一个测试文件
├── test_two.cpp#第二个测试文件
└── test_unit.cpp#主测试文件
不包含实际测试的主测试文件:

// 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
//测试/test\u unit.cpp
#定义升压测试模块“单元测试”
#定义BOOST\u TEST\u DYN\u LINK//我使用BOOST的动态库
#包括
第一个测试文件,其中包含实际测试:

// 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
因此,我将这两个测试文件声明为库,并将它们静态链接到主测试可执行文件

现在,我可以构建这个MWE,但是二进制
test\u单元
无法找到测试和输出:

测试设置错误:测试树为空
我不明白为什么。 我发现有两种方法不能令人满意:

  • 我声明这两个库是动态的,例如
    add\u库(test\u two SHARED tests/test\u two.cpp)
    。 但对我来说,对与可执行文件位于同一目录中的内容使用动态链接没有什么意义

  • 我将两个测试文件包括在主测试文件中,并删除
    CMakeLists.txt
    中的库。 但这很难看

  • 目前,我无法将静态链接用于Boost.Test,因为我的包管理器不提供静态库。 我试着只使用header-only-Boost.Test,但问题是一样的


    我应该怎么做?

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

    # 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\u TEST\u DYN\u链接
    分解为:

    target_compile_definitions(test_unit PUBLIC BOOST_TEST_DYN_LINK)
    

    所以一切都正常。

    您真的需要每个测试文件都有一个库吗?我以前在实际项目中见过这样做的。我以为是。。。过度的。我可怜的链接器!IIRC,有个博客是这样写的。。。这与
    boost\u test
    处理创建自己的
    main()
    的方式有关。如果您在编写所有测试时没有在任何地方指定它们的主宏,那么这将为您包装它们。。。但是如果您有一个main,您可以将N个cpp文件堆叠在一个exe中。@MarkStorer这是
    #include
    对您以前可能定义的各种宏所做的。@IanA.B.K。在实际项目中,最好每个功能库有一个只测试此功能库的测试文件。除了在CMake中将这些测试文件声明为库之外,我还有什么其他选择呢?如果答案实际上是解决方案,那么您可能应该将其标记为解决方案,这样就不会污染“未解决”类别。我可以从明天开始做这件事…