如何使 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::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

通常,测试框架提供某种测试前(设置)和测试后(清理)任务。CTest也是如此。

将以下CTestCustom.ctest文件添加到示例的生成目录中,每次测试都会成功:

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

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

相关内容

  • 没有找到相关文章

最新更新