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

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

Допустим, у меня есть тестовый исполняемый файл, mytest.cpp, который делает две вещи: 1) он утверждает, что файл с именем "foo.txt" не существует в текущем рабочем каталоге, а затем 2) создает файл с именем "foo" .текст". Теперь я хочу иметь возможность запускать 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::string& 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 Ответ

1 голос
/ 11 апреля 2019

Как правило, среда тестирования предоставляет какие-то задачи перед тестом (настройка) и после тестирования (очистка). И CTest.

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

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

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

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