【问题标题】:CMake + Boost test: ignore tests that fail to buildCMake + Boost 测试:忽略无法构建的测试
【发布时间】:2016-03-22 23:02:06
【问题描述】:

我们的 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(它会像原来的一样失败)并且没有任何钩子来删除不可编译的单元。

【问题讨论】:

  • 你最大的问题是提交的代码有问题。

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


【解决方案1】:

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

必须手动找出损坏的部分,进入 CMakeLists.txt 并注释掉无法编译的部分。

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

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

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

【讨论】:

    【解决方案2】:

    我猜您可以为每个规范源创建一个测试可执行文件(使用 foreach() loop),然后执行以下操作:

    make spec_foo &&  ./spec_foo
    

    这只会尝试构建与您要运行的测试匹配的二进制文件

    但是,如果您的构建经常失败,则可能表明您的生产代码中有一些糟糕的设计......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-12
      • 1970-01-01
      • 2012-04-10
      • 1970-01-01
      相关资源
      最近更新 更多