【问题标题】:Boost.Test - problems overriding mainBoost.Test - 覆盖 main 的问题
【发布时间】:2015-09-02 07:39:03
【问题描述】:

我想在使用 Boost.Test 时提供自己的主要功能。所以我包含了以下宏:

#define BOOST_TEST_ALTERNATIVE_INIT_API
#define BOOST_TEST_NO_MAIN

在我的主要功能中,我调用了:

::boost::unit_test::unit_test_main(&registering_all_tests, argc, argv)

但是当使用 Xcode 6 在 OS X 上构建时,这给了我以下错误:

Undefined symbols for architecture x86_64:
  "boost::unit_test::unit_test_main(bool (*)(), int, char**)", referenced from:
      _main in main.o

我发现包括以下文件:

#include <boost/test/included/unit_test.hpp>

解决了这个问题,但我对其中的含义感到困惑。该文件的描述表明它使用包含(相对于链接)版本的单元测试框架。

Boost 入门指南指出:

Boost.Test 可以在“仅头文件”或“单独编译”模式下使用, 虽然建议认真使用单独编译

我已经单独构建了库。

Boost 文档还指出:

将 UTF 直接包含到您的测试模块中

如果您希望避免独立库编译,您可以 要么将构成静态库的所有文件包含在您的 测试模块的 makefile 或将它们作为测试模块的一部分 源文件。为了方便后面的变体,UTF 呈现 单头使用变体。在任何一种情况下都没有特殊的构建选项 或需要将宏定义添加到您的编译中 默认选项列表。但同样的标志可以用于 独立库编译适用于这种情况。尽管, 显然,BOOST_TEST_DYN_LINK 和 BOOST_TEST_NO_LIB 都不是 适用的。从长远来看,这种解决方案可能不是最佳选择, 因为它需要为每个测试模块重新编译 UTF 源代码 您将它与您正在工作的测试模块的每次更改一起使用 在。因此,您的测试周期时间可能会增加。如果变成 烦人,我建议切换到预建库用法之一 变种。

似乎通过选择包含单元测试框架的包含(与链接)版本,我做错了。

有人可以澄清正确的方法吗?覆盖 main 的示例没有提到需要这样做。

【问题讨论】:

    标签: c++ unit-testing boost boost-test


    【解决方案1】:

    Boost.Test documentation 的最新版本比以前的版本更详细地介绍了这个主题。

    通过使用定义的符号BOOST_TEST_NO_MAIN 构建单元测试框架静态库,然后我可以提供我自己的主函数,它手动调用默认测试运行器unit_test_main,默认初始化函数init_unit_test 作为第一个参数:

    int exitCode = ::boost::unit_test::unit_test_main(&init_unit_test_suite, argc, argv);
    

    无需定义BOOST_TEST_ALTERNATIVE_INIT_API

    【讨论】:

    • 但是init_unit_test_suite 函数必须是静态的,你知道是否有任何方法可以调用 unit_test_main 并将引用传递给非静态 init 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多