CMake and CTest: automatically run test's dependencies
Asked Answered
F

2

5

In my CMakeLists.txt I have something like this:

 set_property(TEST testX APPEND PROPERTY DEPENDS testY)
 set_property(TEST testX APPEND PROPERTY DEPENDS testZ)

And I want some way to run testX and all its dependencies automatically. Something like:

ctest <options> testX

and as a result, CTest will run textY, testZ and testX. Is there any way to do this?

Or, if it is impossible now, is there any way to extract information on the dependencies from the CMake build directory by script?

Fullmouthed answered 12/6, 2015 at 17:29 Comment(0)
D
3

There's no built-in way of doing this as far as I know.

The best way I can think of to achieve your goal is to use the LABELS property on the tests. You can retrieve the list of dependencies using get_property or get_test_property and apply the same label to testX and each of its dependent tests:

get_test_property(testX DEPENDS DependenciesOfTestX)
set_tests_properties(testX ${DependenciesOfTestX} PROPERTIES LABELS LabelX)

Then you can tell CTest to only run tests with that label:

ctest -L LabelX
Dowling answered 14/6, 2015 at 15:19 Comment(0)
A
5

Support for test fixtures was added in CMake 3.7 and they do exactly what you want. Your particular scenario would be implemented like this:

set_property(TEST testX PROPERTY FIXTURES_REQUIRED Foo)
set_property(TEST testY PROPERTY FIXTURES_SETUP Foo)
set_property(TEST testZ PROPERTY FIXTURES_SETUP Foo)

You can then ask ctest to run just testX and it will automatically add testY and testZ to the set of tests to be executed:

ctest -R testX

It will also ensure that testX will only run after testY and testZ have been passed. If either of testY or testZ fails, testX will be skipped. New options -FS, -FC and -FA were also added to ctest in CMake 3.9 which allow automatic adding fixture setup/cleanup tests to be controlled at the ctest command line. For example, to temporarily skip adding testY to the test set but still automatically add testZ, one could do this:

ctest -R testX -FS testY

The fixtures properties are described in the CMake docs and the following article covers the fixtures feature more comprehensively:

https://crascit.com/2016/10/18/test-fixtures-with-cmake-ctest/

Annabel answered 1/11, 2017 at 20:27 Comment(0)
D
3

There's no built-in way of doing this as far as I know.

The best way I can think of to achieve your goal is to use the LABELS property on the tests. You can retrieve the list of dependencies using get_property or get_test_property and apply the same label to testX and each of its dependent tests:

get_test_property(testX DEPENDS DependenciesOfTestX)
set_tests_properties(testX ${DependenciesOfTestX} PROPERTIES LABELS LabelX)

Then you can tell CTest to only run tests with that label:

ctest -L LabelX
Dowling answered 14/6, 2015 at 15:19 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.