#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. Я проголосовал и принял это, поскольку это, безусловно, лучший ответ (: Я рассмотрю возможность использования задач предварительного тестирования и посмотрю, как далеко я продвинусь. Если есть какие-либо хорошие примеры того, как заставить каждый тест выполняться во временных каталогах, я был бы рад услышать об этом.