c++ - CMake + boost 测试 : ignore tests that fail to build

标签 c++ unit-testing boost cmake boost-test

我们的 C++ 项目在 Boost/Test 中实现了相对较多的测试套件。所有测试都远离主项目的树,每个测试套件都位于单独的 .cpp 文件中。因此,我们当前用于测试的 CMakeLists.txt 如下所示:

cmake_minimum_required(VERSION 2.6)

project(TEST_PROJECT)
find_package(Boost COMPONENTS unit_test_framework REQUIRED)

set(SPEC_SOURCES
    main.cpp
    spec_foo.cpp
    spec_bar.cpp
    ...
)

set(MAIN_PATH some/path/to/our/main/tree)    
set(MAIN_SOURCES
    ${MAIN_PATH}/foo.cpp
    ${MAIN_PATH}/bar.cpp
    ...
)

add_executable (test_project
    ${SPEC_SOURCES}
    ${MAIN_SOURCES}
)

target_link_libraries(test_project
    ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}
)

add_test(test_project test_project)

enable_testing()

它工作正常,但问题是 SPEC_SOURCESMAIN_SOURCES 是相当长的列表,有时有人会破坏主树或规范源文件中的任何一个文件。反过来,这使得构建目标可执行文件和测试其余部分变得不可能。必须手动找出损坏的地方,进入 CMakeLists.txt 并注释掉编译失败的部分。

那么,问题:有没有一种方法可以忽略无法在 CMake 中自动构建的测试,编译、链接并运行其余测试(理想情况下,将失败的标记为“构建失败” ")?

远程相关问题 Best practice using boost test and tests that should not compile建议在 CMake 中使用 try_compile 命令。然而,在它的裸体形式中,它只是执行新的临时生成的 CMakeList(它将像原始的一样失败)并且没有任何钩子(Hook)来删除不可编译的单元。

最佳答案

我认为您的测试方法存在一些问题。

One has to manually figure out what was broken, go into CMakeLists.txt and comment out parts that fail to compile.

如果您的单元测试覆盖率很高,您应该能够非常快速地识别和定位问题。持续集成(例如 Jenkins、Buildbot、Travis (GitHub))可能非常有帮助。他们将运行您的测试,即使一些开发人员在提交之前没有这样做。

您还假设只需要从构建中删除一个非编译类(及其测试)。但是传递依赖性又如何呢,其中一个非编译类会破坏其他类的编译或导致链接错误。破坏构建的测试呢?所有这些事情都发生在开发过程中。

我建议您将构建分成许多库,每个库都有自己的测试运行器。把属于一起的东西放在一起(凝聚力)。尽量减少编译中的依赖性(依赖注入(inject)、接口(interface)……)。这将允许通过编译库和测试运行器来继续开发,即使某些库没有编译(一段时间)。

关于c++ - CMake + boost 测试 : ignore tests that fail to build,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36166848/

相关文章:

c++ - 模板替换和 SFINAE 中的私有(private)成员访问

ruby-on-rails - 从终端运行测试时出现语法错误

iphone - Xcode 4 使用命令行进行单元测试

linux - 如何升级从源代码构建的 linux 包?

c++ - 线段树的构建

c++ - 如何避免打印 cout 语句的终端空间

c++ - 用 Boost 代替 C++0x 库特性

c++ - 在 boost 单位和持续时间之间转换

c++ - 使用 new 创建的对象的范围

unit-testing - 提供默认构造函数是否被认为是测试的最佳实践?