Как заставить ctest запускать тестовые исполняемые файлы в временном / временном каталоге

#cmake #ctest

#cmake #ctest

Вопрос:

Как я могу заставить ctest запускать каждый из моих тестов в отдельном временном / временном каталоге при каждом запуске $ make test (или $ctest ).

Допустим, у меня есть тестовый исполняемый файл, mytest.cpp который выполняет две вещи: 1) Он утверждает, что файл с именем «foo.txt » не существует в текущем рабочем каталоге, а затем 2) создает файл с именем «foo.txt «. Теперь я хочу иметь возможность запускать make test несколько раз без mytest.cpp сбоев.

Я хочу добиться этого, попросив cmake / ctest запускать каждый тест (в данном примере один тест) в своем собственном временном каталоге.

Я искал решения в Интернете и прочитал ctest документацию. В частности add_test , документы. Я могу предоставить «WORKING_DIRECTORY» для add_test . Это запустит мой тест в этом «WORKING_DIRECTORY». Однако любые изменения, внесенные в эту папку, сохраняются при нескольких make test запусках. Итак, при втором запуске make test тест завершается неудачно.

Вот минимальный, воспроизводимый способ запуска сбоя. Один исходный файл mytest.cpp , который определяет исполняемый файл теста, и CMakeLists.txt файл для построения кода.

 # CMakeLists.txt
cmake_minimum_required (VERSION 2.8)
project (CMakeHelloWorld)
enable_testing()

add_executable (mytest mytest.cpp)
add_test( testname mytest)
  

и

 // mytest.cpp
#include <sys/stat.h>
#include <unistd.h>
#include <string>
#include <fstream>

inline bool exists (const std::stringamp; name) {
    std::ifstream f(name.c_str());
    return f.good();
}

int main() {
    assert(exists("foo.txt") == false);
    std::ofstream outfile ("foo.txt");
    outfile.close();
}
  

Серия команд, которые генерируют сбой

 $ mkdir build
$ cd build
$ cmake ..
$ make
$ make test
$ make test
  

Это даст

 Running tests...
Test project /path/to/project
    Start 1: testname
1/1 Test #1: testname .........................***Exception: Other  0.25 sec

0% tests passed, 1 tests failed out of 1

Total Test time (real) =   0.26 sec

The following tests FAILED:
          1 - testname (OTHER_FAULT)
Errors while running CTest
make: *** [test] Error 8
  

Ответ №1:

Обычно платформа тестирования предоставляет какие-то задачи перед тестированием (настройка) и после тестирования (очистка). И CTest тоже.

Добавление следующего CTestCustom.ctest файла в каталог сборки вашего примера делает тест успешным каждый раз:

 # CTestCustom.ctest
set(CTEST_CUSTOM_POST_TEST "rm foo.txt")
  

Для более сложных задач вы можете создать пользовательский скрипт, но это способ его вызова.

Комментарии:

1. Спасибо, @Stanley F. Я проголосовал и принял это, поскольку это, безусловно, лучший ответ (: Я рассмотрю возможность использования задач предварительного тестирования и посмотрю, как далеко я продвинусь. Если есть какие-либо хорошие примеры того, как заставить каждый тест выполняться во временных каталогах, я был бы рад услышать об этом.