CMake中预期的建置失败测试

kd3sttzy  于 2022-11-11  发布在  其他
关注(0)|答案(3)|浏览(138)

有时候,检查某些东西是否无法构建是很好的,例如:

// 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)

(Of当然,据我所知,这些特定的CMake指令并不存在。)

pxyaymoc

pxyaymoc1#

你可以按照你所描述的或多或少地做这件事。你可以添加一个编译失败的目标,然后添加一个调用cmake --build来尝试构建目标的测试。剩下的就是把测试属性WILL_FAIL设置为true。
因此,假设您将测试存放在名为“will_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)

如果要编写大量的函数或宏,显然可以将所有这些内容 Package 到一个函数或宏中。

ttygqcqt

ttygqcqt2#

@Fraser的回答是一个很好的方法,特别是WILL_FAIL属性是一个很好的建议。尽管有一个替代方法可以让失败的目标成为主项目的一部分。问题中的用例与ctest --build-and-test模式的用途差不多。与其让预期失败的目标成为主构建的一部分,你可以把它放在它自己独立的小项目中,然后把它作为测试的一部分来构建。2一个在主项目中看起来像这样的例子:

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运行的缓存变量。请查看最新的文档以获得有关此区域的最新更正/澄清帮助。

zy1mlcev

zy1mlcev3#

对于问题中的特定示例,我同意评论。这应该用static_assert而不是构建失败测试来测试。
对于用CMake添加构建失败测试的方法(如果这是个好主意的话),我最近创建了一个库,它或多或少地允许用一个CMake函数调用添加这样的测试。它扩展了可接受的答案,允许构建失败测试,并检查失败是因为一个特定的错误而发生的(预期的错误可以在CMake或源文件中提供):https://github.com/iboB/icm/blob/master/icm_build_failure_testing.cmake

相关问题