CTest add tests in subdirectories

I have a CMake-based project that consists of several sub-components, which can all be independently compiled and tested. The directory layout looks like this:

. ├── CMakeLists.txt ├── comp1 │   ├── CMakeLists.txt │   ├── src │   │   ├── foo.cc │   │   └── foo.h │   └── tests │   ├── CMakeLists.txt │   └── test_comp1.cc └── comp2 ├── CMakeLists.txt ├── src │   ├── bar.cc │   └── bar.h └── tests ├── CMakeLists.txt └── test_comp2.cc 

I want to enable ctest, therefore in the root CMakeLists.txt I have include(CTest) and in the component-specific CMakeLists.txt files I have

if(BUILD_TESTING) add_subdirectory(tests) endif() 

In compX/tests/CMakeLists.txt I have the code to compile the test and the add_test()command. The tests get successfully compiled and I can manually run them. However, if I call ctest, it returns

No tests were found!!! 

After playing a bit with this, it turned out that if I move the add_subdirectory(tests) call to the root CMakeLists.txt like this:

if(BUILD_TESTING) add_subdirectory(comp1/tests) endif() 

it works. But I find this quite ugly and messy, to put component-specific stuff into the root file.

Conversely, I tried to move the include(CTest) command one level down into the component-specific CMakeLists.txt. But ctest complains with this:

********************************* No test configuration file found! ********************************* 

Is there seriously no way to use ctest with a directory structure like above?

4

1 Answer

The CTest documentation isn't the clearest.

A project I'm working on has a similar directory structure composed of various units, and in each unit are src and tests subdirectories.

CMake documentation says to call "enable_testing()" at the top-level CMakeLists.txt file, and it further says this command will "enable CTest at the current directory and below." Which sounds recursive, right? Well it's not.

Every CMakeLists.txt must have enable_testing() called to enable automatic CTest discovery in that directory.

Thus, in your project, the toplevel CMakeLists.txt will need enable_testing(), then comp{1,2}/CMakeLists.txt will need it, and finally comp{1,2}/tests/CMakeLists.txt will need it.

Once you add those commands and rerun cmake, those directories will each contain a CTestTestfile.cmake file, which is what the ctest program will look for when it runs.

1

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like