我使用的是C ++ 98,除了标准库之外,我只能访问旧版本的Boost(幸好有Boost测试版)。虽然文件令人生畏,但很长,而且我不知道从哪里开始。
我有一些使用Java进行单元测试的经验(我在C ++中寻找单元测试),并且我看到test
包含单独测试代码的src
包与{ {1}}包,我也看到了Where do you put your unit test?以及Unit Testing with Boost and Eclipse。他们的建议各不相同,并提出了不同包装结构的推理,以便将测试代码与生产代码分开,或将它们放在一起。
在我开始研究Boost测试之前,我在Eclipse中创建了这个结构(可能是错误的):
-- ProjectName
|-- Debug
|-- src
|-- test
我写了另一个运行测试函数的主要方法。 Eclipse并不喜欢这样,因为我在同一个项目中有两个主要方法。我在项目属性中摸索着并没有找到任何有用的东西,可以在构建(链接,真的)时将我的生产代码与测试代码分开。我的临时解决方法是在终端中使用g++
并临时编译我的" test"代码。
我在Boost::Test -- generation of Main()?发现了一些建议,Boost实际上已经生成了自己的主要方法,所以这是我对单元测试的攻击计划,特别是对于已经有可用的测试工具库。
- 组织C ++单元测试的传统方法是什么?
- 如何开始使用Boost测试? (Boost已安装)
- 我是否需要在Eclipse中更改以便能够在IDE中的生产代码中单独运行Boost单元测试? (关于IntelliJ的一个好处是,使用Java,它是如何通过点击自动运行你喜欢的任何主要方法) - 这里的目标是能够在Eclipse中构建和运行我的测试。
- 我的测试应该在一个单独的Eclipse项目中吗? (这是在我回答的第二个SO问题的回答中提出的)
编辑:我找到了this文章,介绍了Boost测试,但它没有讨论如何在IDE设置中处理它。
答案 0 :(得分:3)
我想出了如何独立完成这项工作,并且我将为那些刚刚开始使用C ++并需要对其代码进行测试的其他人记录我的解决方案。目前我找不到任何好的介绍。以下是我使用的资源(并且发现有用):
测试的C ++约定类似于其他编码语言,只需在项目下的test
目录中编写测试。使用Boost Test需要链接单元测试框架:-l boost_unit_test_framework
在Eclipse中:
右键单击您的项目,转到属性,C / C ++构建,设置,工具设置,GCC C ++链接器,库,并添加库名
boost_unit_test_framework
(如果名称添加-mt
,您需要多线程;此外,一旦测试构建配置存在,您可以返回并选择该配置来链接库 - 它将减少您的其他构建的可执行文件的大小。)
为了能够在Eclipse中运行单元测试而不是main方法,我们需要建立一个新的构建配置。这样,Eclipse就知道在执行测试时用main方法排除源文件。
单击Project,Build Configurations,Manage ...,然后选择New ...并将其命名为Test(或
test
以外的其他内容)。选择现有配置,以便我们从生产版本继承属性。
接下来,我们需要区分构建配置,以便在构建它们时,它们实际上对应于生产和测试构建。
右键单击
test
,资源配置,从构建中排除...,然后选择代表生产构建的构建(即调试和/或发布)。完成后,使用main方法右键单击源文件,并将其从Test build中排除。
我们还需要改变一些事情。我们还没有任何测试代码,但是我们仍然无法运行我们的测试版本,我们的测试版本也不会知道src
中存在的资源,因为Eclipse不会自动包含这些源文件。它们对test
中的测试代码几乎不可见。
右键单击您的项目,转到属性,C / C ++构建,设置,工具设置,GCC C ++编译器,包含,然后添加路径
/.../workspace/ProjectName
。
现在能够在Eclipse中运行测试版本,它需要知道您期望IDE运行的可执行文件。
单击“运行”,“运行配置...”,查看当前的运行配置,通过提供调试版本名称“Debug Build”,C / C ++应用程序“Debug / Artifact_Name”来合并这些设置。 ,以及构建配置“调试”。接下来,创建一个新的运行配置,并将其称为“Test Build”,将C / C ++ Application设置为“Test / Artifact_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()
这展示了使用Boost测试的一些关键事项:
BOOST_TEST_DYN_LINK
;你需要在包含任何Boost库之前定义一种链接测试框架的方法struct
是对这些灯具进行分组的,并且暗示您的对象应该有一个定义良好的构造函数和析构函数以进行自动作用域(如果您没有调用new
,则不需要{(1}}在拆解中)附加花絮:要使Boost Test更加详细,请转到测试版本的运行配置,并添加参数delete
。