如何在 transient/temporary 目录中制作 ctest 运行 测试可执行文件
How to make ctest run test executables in a transient/temporary directory
如何在每次 运行 $ make test
(或 $ctest
)时将我的每个测试都放在单独的 transient/temporary 目录中。
假设我有一个测试可执行文件,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
通常,测试框架提供某种预测试(设置)和 post-测试(清理)任务。 And so does CTest.
将以下 CTestCustom.ctest
文件添加到您的示例的构建目录中,每次测试都会成功:
# CTestCustom.ctest
set(CTEST_CUSTOM_POST_TEST "rm foo.txt")
对于更复杂的任务,您可能想要创建一个自定义脚本,但这就是调用它的方式。
如何在每次 运行 $ make test
(或 $ctest
)时将我的每个测试都放在单独的 transient/temporary 目录中。
假设我有一个测试可执行文件,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
通常,测试框架提供某种预测试(设置)和 post-测试(清理)任务。 And so does CTest.
将以下 CTestCustom.ctest
文件添加到您的示例的构建目录中,每次测试都会成功:
# CTestCustom.ctest
set(CTEST_CUSTOM_POST_TEST "rm foo.txt")
对于更复杂的任务,您可能想要创建一个自定义脚本,但这就是调用它的方式。