Incorporating Expected Build-Failure Tests in CMake

Incorporating Expected Build-Failure Tests in CMake

21 May 2024 Stephan Petzl Leave a comment Tech-Help

When developing complex software, it’s sometimes beneficial to ensure that certain operations fail to compile. This can help catch issues at the build stage, preventing potential runtime errors. In this article, we will guide you on how to incorporate expected build-failure tests into your CMake projects.


We’ll demonstrate how to set up build-failure tests in CMake, ensuring certain code snippets fail to compile as expected. This method involves defining a target that is not meant to build successfully and configuring CTest to handle these scenarios.

Step-by-Step Guide

1. Prepare Your Test File

Create a file, for example, will_fail.cpp, containing code snippets that should fail to compile:

#if defined TEST1
non-compiling code for test 1
#elif defined TEST2
non-compiling code for test 2

2. Update Your CMakeLists.txt

Add the following to your CMakeLists.txt to define the failing targets and configure the tests:

cmake_minimum_required(VERSION 3.0)


# 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 $
add_test(NAME Test2
         COMMAND ${CMAKE_COMMAND} --build . --target will_fail_again --config $
# Expect these tests to fail (i.e. cmake --build should return
# a non-zero value)
set_tests_properties(Test1 Test2 PROPERTIES WILL_FAIL TRUE)

3. Run Your Tests

To run your tests and verify the expected failures, use the following command:


Alternative Approach

Another method is to use the ctest --build-and-test mode. This allows you to separate the failing target into its own mini project:

add_test(NAME iter_conversion
            --build-generator ${CMAKE_GENERATOR}
            --test-command ${CMAKE_CTEST_COMMAND}
set_tests_properties(iter_conversion PROPERTIES WILL_FAIL TRUE)

This approach ensures that the failing target is part of the project’s test results, making it more likely to be executed regularly as part of normal testing processes.


Incorporating expected build-failure tests in CMake can significantly enhance your development workflow by catching potential issues early. By following the steps outlined in this guide, you can set up these tests efficiently and ensure your codebase remains robust.

Enhance Testing with Repeato

For developers looking to streamline their testing processes, Repeato offers a powerful no-code test automation tool for iOS and Android. With its intuitive test recorder and computer vision-based approach, Repeato makes it easy to create, run, and maintain automated tests for your apps. Additionally, Repeato supports testing websites inside an Android emulator or device, with explicit web testing support coming soon. Explore Repeato to take your test automation to the next level.

Like this article? there’s more where that came from!