Использование REQUIRED_FILES для модульных тестов в cmake

Очень короткий пример попытки использовать REQUIRED_FILES:

$ tree .
.
├── CMakeLists.txt
└── main.cxx
$ cat main.cxx 
int main() { return 0; }
$ cat CMakeLists.txt 
cmake_minimum_required(VERSION 3.10)

add_executable(a.out main.cxx)

include(CTest)
add_test(NAME a.out COMMAND a.out)
set_property(TEST a.out PROPERTY REQUIRED_FILES $<TARGET_FILE:a.out>)

Один исполняемый файл, который ничего не делает и представляет собой тест, который просто требует своего существования.

$ mkdir build && cd build && cmake .. && ctest
-- The C compiler identification is GNU 4.8.5
-- The CXX compiler identification is GNU 4.8.5
-- Check for working C compiler: /usr/lib64/ccache/cc
-- Check for working C compiler: /usr/lib64/ccache/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/lib64/ccache/c++
-- Check for working CXX compiler: /usr/lib64/ccache/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /[...]/req/build
Test project /[...]/req/build
    Start 1: a.out
Could not find executable /[...]/req/build/a.out
Looked in the following places:
/[...]/req/build/a.out
/[...]/req/build/a.out
/[...]/req/build/Release/a.out
/[...]/req/build/Release/a.out
/[...]/req/build/Debug/a.out
/[...]/req/build/Debug/a.out
/[...]/req/build/MinSizeRel/a.out
/[...]/req/build/MinSizeRel/a.out
/[...]/req/build/RelWithDebInfo/a.out
/[...]/req/build/RelWithDebInfo/a.out
/[...]/req/build/Deployment/a.out
/[...]/req/build/Deployment/a.out
/[...]/req/build/Development/a.out
/[...]/req/build/Development/a.out
[...]/req/build/a.out
[...]/req/build/a.out
[...]/req/build/Release/a.out
[...]/req/build/Release/a.out
[...]/req/build/Debug/a.out
[...]/req/build/Debug/a.out
[...]/req/build/MinSizeRel/a.out
[...]/req/build/MinSizeRel/a.out
[...]/req/build/RelWithDebInfo/a.out
[...]/req/build/RelWithDebInfo/a.out
[...]/req/build/Deployment/a.out
[...]/req/build/Deployment/a.out
[...]/req/build/Development/a.out
[...]/req/build/Development/a.out
Unable to find required file: /[...]/req/build/a.out
1/1 Test #1: a.out ............................***Not Run   0.00 sec

0% tests passed, 1 tests failed out of 1

Total Test time (real) =   0.00 sec

The following tests FAILED:
      1 - a.out (Not Run)
Errors while running CTest

Я думал, что смысл REQUIRED_FILES состоит в том, чтобы избежать запуска этого теста, потому что этот файл не существует, и, следовательно, нет непройденного теста. Как правильно использовать это свойство?


person Barry    schedule 06.08.2018    source источник


Ответы (1)


Вы правильно используете свойство, так как ctest фактически не запускал тест. CTest не может пометить тест как успешный, поскольку он не был запущен, и не пометит тест как не пройденный из-за необходимых файлов, поэтому помещает тест в корзину Not Run.

Что касается того, почему требуемые файлы не найдены, это связано с тем, что бинарный файл a.out не был собран. Вам не хватает шага в вашем скрипте:

mkdir build && cd build && cmake .. && cmake --build . && ctest

Вы также можете упростить сценарий:

person RobertJMaynard    schedule 06.08.2018