【问题标题】:Boost unit test framework: include main function of my codebaseBoost单元测试框架:包括我的代码库的主要功能
【发布时间】:2016-02-29 09:05:49
【问题描述】:

我有一个要执行测试的代码库。此代码库的其中一个文件包含我要测试的代码,以及程序的主要功能。

当我将此文件添加到我的 CMakeLists 时,它抱怨包含多个主要功能。

事情是这样的:

RunTest.cpp:

#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MODULE Main
#include <boost/test/unit_test.hpp>

MyTest1.cpp:

#define BOOST_TEST_MODULE test_1_module
#define BOOST_TEST_DYNAMIC_LINK
#include <boost/test/unit_test.hpp>
#include <boost/test/parameterized_test.hpp>
#include <boost/test/unit_test_log.hpp>
#include <boost/test/results_collector.hpp>

#include "../MyCode.h"

BOOST_AUTO_TEST_SUITE(test_suite_one)

BOOST_AUTO_TEST_CASE {
...
}

BOOST_AUTO_TEST_SUITE_END()

这是我的 CMakeLists 的样子:

SET (
    TestRunner

    RunTest.cpp
    MyCode.cpp #contains a main function
)

ADD_EXECUTABLE(TestRunner $TestRunner)

我该如何解决这个问题?有没有办法让 boost 忽略我的代码库中的主要功能?

【问题讨论】:

  • 你在头文件中定义了main?!
  • 不,它在一个 cpp 文件中。
  • 好吧,无论如何...只要正确地分离你的代码,这样带有main的*.cpp就不会包含太多其他内容。
  • 好的,问题是这是共享代码,所以不容易做到。您还有其他解决方案吗?
  • 如果您无法修改包含main 的文件,那么如果您的测试检测到其中有错误,您会怎么做?我认为要么放弃而不是对这段不可测试的代码进行单元测试,要么投入精力修改不可测试的代码以使其可测试,这两者都证明比试图找到解决问题的方法更有效率。

标签: c++ unit-testing boost


【解决方案1】:

为了避免测试 exe 中出现多个 main 函数的错误,我将项目拆分为两个项目。 CMake 代码:

add_library (MyProject_base STATIC ${MYPROJECT_BASE_SRC})
add_executable (MyProject ${MYPROJECT_SRC})
add_executable (MyProject_Test ${MYPROJECT_TEST_SRC})

target_link_libraries(MyProject_base
    #stuff
)
target_link_libraries(MyProject
    MyProject_base
    #stuff
)        
target_link_libraries (MyProject_Test
    MyProject_base
    #stuff
)

现在MyProject_base 被构建为一个静态库,它链接到实际的可执行文件MyProject 以及测试exe MyProject_Test。然后MyProject_base 中的代码是经过单元测试的,而MyProject 只不过是一个主函数,当然没有经过单元测试。

【讨论】:

    猜你喜欢
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-20
    相关资源
    最近更新 更多