如何使ctest在临时/临时目录中运行测试可执行文件

时间:2019-04-10 20:54:24

标签: cmake ctest

每次运行$ make test(或$ctest)时,如何使ctest在单独的临时/临时目录中运行每个测试。

比方说,我有一个测试可执行文件mytest.cpp,该可执行文件执行以下两项操作:1)断言当前工作目录中不存在名为“ foo.txt”的文件,然后2)创建一个名为“ foo.txt”。现在,我希望能够make test多次运行mytest.cpp,而不会失败。

我想通过要求cmake / ctest在其自己的临时目录中运行每个测试(在此示例中为一个测试)来实现这一目标。

我已经在线搜索了解决方案,并且已经阅读了ctest文档。特别是add_test文档。我可以为add_test提供一个“ WORKING_DIRECTORY”。这将在“ 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 个答案:

答案 0 :(得分:1)

通常,测试框架提供某种预测试(设置)和后测试(清理)任务。 And so does CTest.

将以下CTestCustom.ctest文件添加到示例的构建目录中,使每次测试均成功:

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

对于更复杂的任务,您可能需要创建一个自定义脚本,但这是调用它的方式。