Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CMake: setting an environmental variable for ctest (or otherwise getting failed test output from ctest/make test automatically)

I want ctest to show me the failed tests output by default. That is, I want to run:

$ make all test 

and see any output of failed tests without having to cat Testing/Temporary/LastTest.log.

It appears that there are two ways of doing this:

(1) Setting the CTEST_OUTPUT_ON_FAILURE environmental variable:

 $ CTEST_OUTPUT_ON_FAILURE=1 make all test  $ # or CTEST_OUTPUT_ON_FAILURE=1 ctest 

(2) Specifying the --output-on-failure flag to the ctest invocation:

 $ ctest --output-on-failure 

Is there a way to write a CMakeLists.txt file such that ctests dumps failed tests output by default on a normal "make all test" invocation WITHOUT resorting to exporting the environmental variable globally in the session or resorting to a custom target like make check (as described here)?

I am aware of the SET_TESTS_PROPERTIES() command, but trying it out like this:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8) PROJECT(testenv CXX) ENABLE_TESTING() ADD_EXECUTABLE(hello hello.cpp) ADD_TEST(testhello hello)  # Following sets the environment variable for the shell in which the test # progoram 'hello' is run, but not the shell in which ctest is run SET_TESTS_PROPERTIES(testhello     PROPERTIES ENVIRONMENT "CTEST_OUTPUT_ON_FAILURE=1") 

and experimenting shows that the environmental variable is set in the shell that the test program is executed in, but not in the shell that ctest is executed in.

like image 476
Jeet Avatar asked Apr 22 '13 22:04

Jeet


People also ask

What is CMake CTest?

Description. The "ctest" executable is the CMake test driver program. CMake-generated build trees created for projects that use the ENABLE_TESTING and ADD_TEST commands have testing support. This program will run the tests and report results.

Is CTest part of CMake?

When you run the tests from your build environment, what really happens is that the build environment runs CTest . CTest is an executable that comes with CMake; it handles running the tests for the project.

What is CTest command?

Build and Test Mode. CTest provides a command-line signature to configure (i.e. run cmake on), build, and/or execute a test: ctest --build-and-test <path-to-source> <path-to-build> --build-generator <generator> [<options>...]

Does CTest run tests in parallel?

CTest is the test runner that is shipped with CMake. This runner can run tests in parallel using the -j X option (X is the numbers of threads). However, it can only run the tests that are declared in the CMakeLists. txt file.


2 Answers

The built-in test target cannot be modified, but you can add a custom check target which invokes ctest with the --output-on-failure switch in the following way:

if (CMAKE_CONFIGURATION_TYPES)     add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND}          --force-new-ctest-process --output-on-failure          --build-config "$<CONFIGURATION>") else()     add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND}          --force-new-ctest-process --output-on-failure) endif() 

The custom target has to be set up differently for single build type and multi-configuration builds. In the latter case, the active build configuration has to be passed on to the ctest invocation using the --build-config flag. The --force-new-ctest-process is used by the built-in test target by default.

like image 118
sakra Avatar answered Sep 22 '22 00:09

sakra


There is now the list variable CMAKE_CTEST_ARGUMENTS in which you can set ctest arguments.

https://cmake.org/cmake/help/latest/variable/CMAKE_CTEST_ARGUMENTS.html

like image 26
Exascale Avatar answered Sep 23 '22 00:09

Exascale