C++;Boost测试、包结构和Eclipse项目设置

C++;Boost测试、包结构和Eclipse项目设置,eclipse,packages,main,c++98,boost-test,Eclipse,Packages,Main,C++98,Boost Test,我使用的是C++98,除了标准库之外,我只能访问旧版本的Boost(谢天谢地,它有Boost测试)。尽管文档很冗长,但我不知道从哪里开始 我有一些在Java中进行单元测试的经验(我正在寻找C++中的单元测试),我见过test包,其中包含独立于src包的单元测试代码,我也见过。他们的建议各不相同,并且针对不同的封装结构提出了将测试代码与生产代码分离或将它们放在一起的理由 在我开始研究Boost测试之前,我在Eclipse中创建了这个结构(可能是错误的): 我还编写了另一个主要方法来运行测试函数。E

我使用的是C++98,除了标准库之外,我只能访问旧版本的Boost(谢天谢地,它有Boost测试)。尽管文档很冗长,但我不知道从哪里开始

我有一些在Java中进行单元测试的经验(我正在寻找C++中的单元测试),我见过
test
包,其中包含独立于
src
包的单元测试代码,我也见过。他们的建议各不相同,并且针对不同的封装结构提出了将测试代码与生产代码分离或将它们放在一起的理由

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

我还编写了另一个主要方法来运行测试函数。Eclipse不喜欢这样,因为我在同一个项目中有两个主要方法。我在项目属性中摸索,在构建(链接,真的)时,没有找到任何有用的东西来分离我的生产代码和测试代码。我的临时解决方案是在终端中使用
g++
,并临时编译我的“测试”代码

我发现Boost实际上生成了它自己的主要方法,所以这是我目前针对单元测试的攻击计划,特别是对于已经有了测试工具库的情况

    C++的单元测试的常规方法是什么?
  • 如何开始Boost测试?(已安装Boost)
  • 为了能够在IDE中独立于我的生产代码运行Boost单元测试,我需要在Eclipse中进行任何更改吗?(IntelliJ和Java的优点之一是,它可以通过单击自动运行您喜欢的任何主要方法)——这里的目标是能够在Eclipse中构建和运行我的测试
  • 我的测试应该在一个单独的Eclipse项目中吗?(这是在回答我所联系的第二个SO问题时提出的)

< > > >编辑< /强>:我找到了一个介绍Boost测试的文章,但它没有讨论IDE设置中如何处理它。

< P>我自己决定如何做这件事,我会为那些刚从C++开始的人编写我的解决方案,并且需要对他们的代码进行测试。目前我在任何地方都找不到好的介绍。以下是我使用过的资源(发现很有用):

  • 它以比Boost文档更好的方式引入了Boost测试
  • 讨论C++中最常用的测试方法。
  • 它讨论了允许测试的Eclipse构建配置
<>测试的C++约定与其他编码语言一样,只需在项目下的“代码>测试< /代码>”目录中编写测试。使用Boost测试需要链接单元测试框架:
-l Boost\u unit\u Test\u framework
,在Eclipse中:

右击项目,转到属性、C/C++构建、设置、工具设置、GCC C++链接器、库,并添加库名称<代码> BooStUnITTI TestGrase< /C>(如果您需要多线程处理,请在名称中添加

-mt
;此外,一旦存在测试生成配置,您可以返回并仅选择该配置来链接库——这将减少其他生成的可执行文件的大小)

为了能够在Eclipse中独立于主方法运行单元测试,我们需要建立一个新的构建配置

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

接下来,我们需要将构建配置彼此区分开来,以便在构建它们时,它们实际上与生产和测试构建相对应

右键单击
测试
、资源配置、从生成中排除…,并选择表示生产生成的生成(即调试和/或发布)。完成后,右键单击源文件和主方法,并将其从测试生成中排除

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

右击项目,转到Projices,C/C++构建,设置,工具设置,GCC C++编译器,包括,并添加路径<代码> /…/工作区/ ProjutsNo> <代码> > 现在,为了能够在Eclipse中运行测试构建,它需要知道您希望IDE运行的可执行文件

单击Run,Run Configurations…,查看您当前的运行配置,整合这些设置,例如,为调试构建命名为“调试构建”,为C/C++应用程序命名为“调试/工件名称”,为构建配置命名为“调试”。接下来,创建一个新的运行配置,并将其命名为“测试构建”,将C/C++应用程序设置为“Test/Artifact\u Name”,并确保构建配置为Test

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

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

//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()
//unit\u tests.cpp
#定义BOOST\u TEST\u DYN\u链接
#定义BOOST\u TEST\u模块someModuleName
#包括
#包括
结构模板对象{
某些对象x;
模板_对象(){
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()