我自己想出了如何做到这一点,我将记录我的解决方案,以供那些刚开始使用 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。