CMAKE中的预期构建测试
Expected build-failure tests in CMake
有时可以检查某些东西无法构建,例如:
// Next line should fail to compile: can't convert const iterator to iterator.
my_new_container_type::iterator it = my_new_container_type::const_iterator();
是否可以将这些类型的事物纳入cmake/ctest?我在CMakeLists.txt
中寻找这样的东西:
add_build_failure_executable(
test_iterator_conversion_build_failure
iterator_conversion_build_failure.cpp)
add_build_failure_test(
test_iterator_conversion_build_failure
test_iterator_conversion_build_failure)
(当然,据我所知,这些特定的CMAKE指令不存在。)
您可以或多或少地做到这一点。您可以添加将无法编译的目标,然后添加一个测试,该测试调用cmake --build
尝试构建目标。剩下的就是将测试属性WILL_FAIL
设置为true。
所以,说您的测试在一个名为" all_fail.cpp"的文件中,其中包含:
#if defined TEST1
non-compiling code for test 1
#elif defined TEST2
non-compiling code for test 2
#endif
然后您可以在cmakelists.txt中具有以下内容:
cmake_minimum_required(VERSION 3.0)
project(Example)
include(CTest)
# Add a couple of failing-to-compile targets
add_executable(will_fail will_fail.cpp)
add_executable(will_fail_again will_fail.cpp)
# Avoid building these targets normally
set_target_properties(will_fail will_fail_again PROPERTIES
EXCLUDE_FROM_ALL TRUE
EXCLUDE_FROM_DEFAULT_BUILD TRUE)
# Provide a PP definition to target the appropriate part of
# "will_fail.cpp", or provide separate files per test.
target_compile_definitions(will_fail PRIVATE TEST1)
target_compile_definitions(will_fail_again PRIVATE TEST2)
# Add the tests. These invoke "cmake --build ..." which is a
# cross-platform way of building the given target.
add_test(NAME Test1
COMMAND ${CMAKE_COMMAND} --build . --target will_fail --config $<CONFIGURATION>
WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
add_test(NAME Test2
COMMAND ${CMAKE_COMMAND} --build . --target will_fail_again --config $<CONFIGURATION>
WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
# Expect these tests to fail (i.e. cmake --build should return
# a non-zero value)
set_tests_properties(Test1 Test2 PROPERTIES WILL_FAIL TRUE)
,如果您有很多这些要写的话,显然可以将所有这些包裹在功能或宏中。
@fraser的答案是一种很好的方法,特别是WILL_FAIL
属性是很好的建议。不过,可以替代将失败的目标部分组成主要项目。问题中的用例几乎是ctest --build-and-test
模式的目的。您可以将其放在自己的单独的迷你项目中,而不是将其构建为测试的一部分。主要项目中可能看起来的一个示例:
add_test(NAME iter_conversion
COMMAND ${CMAKE_CTEST_COMMAND}
--build-and-test
${CMAKE_CURRENT_LIST_DIR}/test_iter
${CMAKE_CURRENT_BINARY_DIR}/test_iter
--build-generator ${CMAKE_GENERATOR}
--test-command ${CMAKE_CTEST_COMMAND}
)
set_tests_properties(iter_conversion PROPERTIES WILL_FAIL TRUE)
这具有一个优点,即它将成为项目测试结果的一部分,因此,将作为正常测试过程的一部分定期执行。在上面的示例中,test_iter
目录本质上是它自己的独立项目。如果您需要从主构建中传递信息,则可以通过添加--build-options
来定义缓存变量以传递到其CMAKE运行。检查最新文档以获取该区域的最近更正/澄清的帮助。
对于我同意该评论的问题中的特定示例。应通过static_assert
而不是构建故障测试对此进行测试。
对于使用CMake添加构建故障测试的一种方式(在此是一个好主意的情况下),我最近创建了一个库,该库允许使用单个CMAKE功能调用添加此类测试。它扩展了可接受的答案,并允许构建失败测试,并检查故障是否由于特定错误而发生(可以在CMAKE或源文件中提供预期错误):https://github.com/ibob/icm/blob/master/icm_build_failure_testing.cmake
- 以现代 CMake 方式控制包含的库中的构建选项(测试等)
- 如何在提升构建中设置环境变量以进行提升单元测试框架?
- 无法构建 RcppArmadillo.package.skeleton 测试包:"R_init_"的多重定义<name>
- 使用cmake构建google测试单元测试时出现链接器错误
- 为多个测试文件构建可执行文件
- 在 Linux 上构建 cpptest 单元测试框架
- 使用 QtCreator 构建 CUDA/C++ 测试程序时出现错误 2
- 我想使用 CMake 生成和编译 Visual Studio projet,我需要从构建中排除单元测试文件。有没有办法做到这一点?
- C++ CppUnitTestFramework 在构建后运行测试
- 如何在 Android Studio 中构建本地/主机操作系统C++单元测试?
- 测试构建C++包装器时出现 OpenCV 错误
- 实施 SystemC TLM 测试平台构建失败
- GTEST/Google测试C 在Visual Studio 2017上构建错误
- CEF-使用MDd构建测试
- dlib示例,测试构建失败
- 构建和链接 Crypto++ 的测试代码
- Qt 5测试版2,Qt Creator 2.6,MSVC错误:Qt Creaator需要一个编译器来构建.在工具包选项中
- 使用Google测试,CLANG和LIBC 进行故障构建测试
- CMAKE中的预期构建测试
- 无法使用谷歌的protobuf构建测试C++应用程序