【问题标题】:C++ Boost Test, package structure, and Eclipse project settingsC++ Boost 测试、包结构和 Eclipse 项目设置
【发布时间】:2017-12-01 00:08:56
【问题描述】:

我使用的是 C++98,除了标准库之外,我只能访问旧版本的 Boost(幸好有 Boost Test)。文档虽然令人生畏,冗长,我只是不知道从哪里开始。

我有一些在 Java 中进行单元测试的经验(我正在寻找 C++ 中的单元测试),并且我看到了包含与 src 包分开的单元测试代码的 test 包,我还看到了Where do you put your unit test? 和Unit Testing with Boost and Eclipse。他们的建议各不相同,并提出了将测试代码与生产代码分开或将它们放在一起的不同封装结构的推理。

在我开始研究 Boost Test 之前,我在 Eclipse 中创建了这个结构(可能是错误的):

-- ProjectName
   |-- Debug
   |-- src
   |-- test

我写了另一个运行测试函数的主要方法。 Eclipse 不喜欢这样,因为我在同一个项目中有两个主要方法。我在项目属性中摸索,并没有发现任何有用的东西可以在构建时将我的生产代码与测试代码分开(实际上是链接)。我的临时解决方法是在终端中使用 g++ 并临时编译我的“测试”代码。

我在Boost::Test -- generation of Main()? 上发现了一些暗示 Boost 实际上生成了自己的 main 方法,所以这是我目前针对单元测试的攻击计划,特别是对于已经有一个可用的测试工具库。

  • 为 C++ 组织单元测试的传统方法是什么?
  • 如何开始使用 Boost 测试? (已安装 Boost)
  • 我是否需要在 Eclipse 中进行任何更改才能在 IDE 中独立于生产代码运行我的 Boost 单元测试? (IntelliJ 与 Java 的优点之一是它可以通过单击自动运行您喜欢的任何主要方法)——这里的目标是能够在 Eclipse 中构建和运行我的测试。
  • 我的测试应该在一个单独的 Eclipse 项目中吗? (这是在我链接的第二个 SO 问题的答案中提出的)

编辑:我发现 this 文章介绍了 Boost Test,但它没有讨论如何在 IDE 设置中处理它。

【问题讨论】:

    标签: eclipse packages main c++98 boost-test


    【解决方案1】:

    我自己想出了如何做到这一点,我将记录我的解决方案,以供那些刚开始使用 C++ 并需要对其代码进行测试的其他人使用。目前在我能找到的任何地方都没有好的介绍。以下是我使用过的资源(并且发现很有用):

    用于测试的 C++ 约定与其他编码语言一样,只需将测试写入项目下名为 test 的目录中即可。使用 Boost Test 需要您链接单元测试框架:-l boost_unit_test_framework,在 Eclipse 中:

    右击你的项目,进入Properties,C/C++ Build,Settings,Tool Settings,GCC C++ Linker,Libraries,添加库名称boost_unit_test_framework(如果需要多线程,请在名称中添加-mt;此外,一旦存在测试构建配置,您可以返回并仅选择该配置来链接库 - 它会减少您的其他构建的可执行文件的大小。

    为了能够在 Eclipse 中独立于您的 main 方法运行单元测试,我们需要建立一个新的构建配置。这样,Eclipse 就知道在您执行测试时使用 main 方法排除您的源文件。

    单击 Project、Build Configurations、Manage...,然后选择 New... 并将其命名为 Test(或 test 以外的名称)。选择您现有的配置,以便我们从生产版本继承属性。

    接下来,我们需要区分构建配置,以便在构建它们时,它们实际上对应于生产和测试构建。

    右键单击test、资源配置、从构建中排除...,然后选择代表您的生产构建的构建(即调试和/或发布)。完成后,使用 main 方法右键单击源文件,然后将其从测试构建中排除。

    我们仍然需要改变一些事情。我们还没有任何测试代码,但我们仍然无法运行我们的测试构建,我们的测试构建也不知道src 中存在的资源,因为 Eclipse 不会自动包含这些源文件。它们对test 中的测试代码几乎是不可见的。

    右击你的项目,进入Properties,C/C++ Build,Settings,Tool Settings,GCC C++ Compiler,Includes,添加路径/.../workspace/ProjectName。

    现在为了能够在 Eclipse 中运行您的测试构建,它需要知道您希望 IDE 运行什么可执行文件。

    单击运行、运行配置...,然后查看您当前的运行配置,合并这些设置,例如,将调试构建命名为“Debug Build”,将 C/C++ 应用程序命名为“Debug/Artifact_Name” ,以及构建配置“调试”。接下来,创建一个新的运行配置,并将其命名为“Test Build”,将 C/C++ Application 设置为“Test/Artifact_Name”,并确保构建配置为 Test。

    现在您可以通过选择“活动”构建配置或运行正确的运行配置来在运行生产代码和测试代码之间切换。

    最后,这是一个在所有这些都设置好后使用 Boost Test 进行单元测试的示例:

    //unit_tests.cpp
    #define BOOST_TEST_DYN_LINK
    #define BOOST_TEST_MODULE someModuleName
    #include <boost/test/unit_test.hpp>
    #include <src/some_object.h>
    
    struct template_objects {
        some_object x;
        template_objects() {
            BOOST_TEST_MESSAGE("Setting up testing objects");
        }
        ~template_objects() {
            BOOST_TEST_MESSAGE("Tearing down testing objects");
        }
    }
    
    BOOST_FIXTURE_TEST_SUITE(testSuiteName, template_objects)
    
    BOOST_AUTO_TEST_CASE(testCase1) {
        x.update();
        BOOST_CHECK(x.is_up_to_date());
    }
    BOOST_AUTO_TEST_CASE(testCase2) {
        BOOST_CHECK(x.is_not_up_to_date());
    }
    
    BOOST_AUTO_TEST_SUITE_END()
    

    这展示了有关使用 Boost Test 的一些关键事项:

    • 推荐定义BOOST_TEST_DYN_LINK;在包含 Boost 的任何库之前,您需要定义一种链接测试框架的方式
    • 你必须为“模块”命名,不必是文件名
    • 为了在进入测试用例之前自动设置和拆卸对象,Boost Test 有 fixtures,它允许您多次调用对象的预先存在状态
    • struct 是这些固定装置的分组对象,这意味着您的对象应该有一个明确定义的构造函数和析构函数用于自动作用域(如果您没有调用new,则不需要delete拆解)
    • 测试套件只是对测试用例进行逻辑分组的一种方式(我尚未对其进行测试,但您可能可以将套件分解为多个文件以实现更好的逻辑分离)

    其他花絮:要使 Boost Test 更详细,请转到测试构建的运行配置,并添加参数 --log_level=test_suite。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多