Reputation: 9394
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?
Upvotes: 5
Views: 2686
Reputation: 10137
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/
Upvotes: 5
Reputation: 78290
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
Upvotes: 3