将项目源代码与CMake下的boost测试相关联

时间:2014-08-03 17:47:18

标签: c++ boost cmake

我正在尝试找到将我的项目源代码与我的升压单元测试相关联的最佳方法。我现在使用CMake进行了相当基本的项目设置,但是我遇到的所有boost UTF示例都显示了非常基本的测试,这些测试不接触测试中的项目中的源代码。

作为一个最小的例子,我有以下内容:

的CMakeLists.txt

cmake_minimum_required(version 2.8) 
project(test-project) 
find_package(Boost 1.55 REQUIRED COMPONENTS unit_test_framework )
include_directories(${Boost_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIRS})

add_subdirectory(src) 
enable_testing()
add_subdirectory(test) 

src / CMakeLists.txt

add_executable(example main.cpp foo.cpp)  

的src / foo.h中

#include <string>
std::string hello(std::string name);

的src / Foo.cpp中

#include "foo.h"
std::string hello(std::string name) { return "Hello " + name; }

src / main.cpp - 以简单的方式使用foo

测试/的CMakeLists.txt

include_directories (../src) 
set(TEST_REQUIRED_SOURCES ../src/foo.cpp)

add_executable (test test.cpp ${TEST_REQUIRED_SOURCES}) 
target_link_libraries(test ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY})

add_test(SimpleTest test)

测试/ TEST.CPP

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

#include "foo.h"

BOOST_AUTO_TEST_CASE(ShouldPass) {
    BOOST_CHECK_EQUAL(hello("fred"), "Hello fred")
}

虽然这有效,但我想避免以下情况:

  1. 使用编译所需的所有文件列表定义TEST_REQUIRED_SOURCES。
  2. 避免重复编译代码。
  3. 我的结构对于这类项目看起来是否正确?将我的src下的代码编译成库是否有意义?我在测试方面的大部分经验来自C#,其中更简单。

1 个答案:

答案 0 :(得分:1)

您可以查看我在那里的表现:https://github.com/NewbiZ/mengine/blob/master/CMakeLists.txt

基本上,我使用我的库构建一个目标文件,并在主可执行文件和测试中重用它。那样你只会建一次。

有趣的CMake是:

# Just build the object files, so that we could reuse them
# apart from the main executable (e.g. in test)
ADD_LIBRARY(mengine_objects OBJECT ${MENGINE_SOURCES})

然后构建主可执行文件:

ADD_EXECUTABLE(mengine $<TARGET_OBJECTS:mengine_objects>
                       src/main.cpp)

测试:

ADD_EXECUTABLE(test_tga $<TARGET_OBJECTS:mengine_objects>
                        test_tga.cpp)

希望有所帮助!