在 cmake 中使用 REQUIRED_FILES 进行单元测试
Using REQUIRED_FILES for unit tests in cmake
尝试使用 REQUIRED_FILES
:
的非常简短的示例
$ tree .
.
├── CMakeLists.txt
└── main.cxx
$ cat main.cxx
int main() { return 0; }
$ cat CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
add_executable(a.out main.cxx)
include(CTest)
add_test(NAME a.out COMMAND a.out)
set_property(TEST a.out PROPERTY REQUIRED_FILES $<TARGET_FILE:a.out>)
一个可执行文件,什么都不做,是一个只需要自身存在的测试。
$ mkdir build && cd build && cmake .. && ctest
-- The C compiler identification is GNU 4.8.5
-- The CXX compiler identification is GNU 4.8.5
-- Check for working C compiler: /usr/lib64/ccache/cc
-- Check for working C compiler: /usr/lib64/ccache/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/lib64/ccache/c++
-- Check for working CXX compiler: /usr/lib64/ccache/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /[...]/req/build
Test project /[...]/req/build
Start 1: a.out
Could not find executable /[...]/req/build/a.out
Looked in the following places:
/[...]/req/build/a.out
/[...]/req/build/a.out
/[...]/req/build/Release/a.out
/[...]/req/build/Release/a.out
/[...]/req/build/Debug/a.out
/[...]/req/build/Debug/a.out
/[...]/req/build/MinSizeRel/a.out
/[...]/req/build/MinSizeRel/a.out
/[...]/req/build/RelWithDebInfo/a.out
/[...]/req/build/RelWithDebInfo/a.out
/[...]/req/build/Deployment/a.out
/[...]/req/build/Deployment/a.out
/[...]/req/build/Development/a.out
/[...]/req/build/Development/a.out
[...]/req/build/a.out
[...]/req/build/a.out
[...]/req/build/Release/a.out
[...]/req/build/Release/a.out
[...]/req/build/Debug/a.out
[...]/req/build/Debug/a.out
[...]/req/build/MinSizeRel/a.out
[...]/req/build/MinSizeRel/a.out
[...]/req/build/RelWithDebInfo/a.out
[...]/req/build/RelWithDebInfo/a.out
[...]/req/build/Deployment/a.out
[...]/req/build/Deployment/a.out
[...]/req/build/Development/a.out
[...]/req/build/Development/a.out
Unable to find required file: /[...]/req/build/a.out
1/1 Test #1: a.out ............................***Not Run 0.00 sec
0% tests passed, 1 tests failed out of 1
Total Test time (real) = 0.00 sec
The following tests FAILED:
1 - a.out (Not Run)
Errors while running CTest
我认为 REQUIRED_FILES
的目的是为了避免 运行 这个测试,因为那个文件不存在,因此 not 失败了测试。实际使用此 属性 的正确方法是什么?
您使用 属性 是正确的,因为 ctest 实际上没有 运行 测试。 CTest 无法将测试标记为成功,因为它没有 运行,并且不会由于所需文件而将测试标记为失败,因此它会将测试放入 Not Run
bin。
至于为什么没有找到需要的文件,那是因为a.out二进制文件没有构建。您缺少脚本中的一个步骤:
mkdir build && cd build && cmake .. && cmake --build . && ctest
您还可以将脚本简化为:
尝试使用 REQUIRED_FILES
:
$ tree .
.
├── CMakeLists.txt
└── main.cxx
$ cat main.cxx
int main() { return 0; }
$ cat CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
add_executable(a.out main.cxx)
include(CTest)
add_test(NAME a.out COMMAND a.out)
set_property(TEST a.out PROPERTY REQUIRED_FILES $<TARGET_FILE:a.out>)
一个可执行文件,什么都不做,是一个只需要自身存在的测试。
$ mkdir build && cd build && cmake .. && ctest
-- The C compiler identification is GNU 4.8.5
-- The CXX compiler identification is GNU 4.8.5
-- Check for working C compiler: /usr/lib64/ccache/cc
-- Check for working C compiler: /usr/lib64/ccache/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/lib64/ccache/c++
-- Check for working CXX compiler: /usr/lib64/ccache/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /[...]/req/build
Test project /[...]/req/build
Start 1: a.out
Could not find executable /[...]/req/build/a.out
Looked in the following places:
/[...]/req/build/a.out
/[...]/req/build/a.out
/[...]/req/build/Release/a.out
/[...]/req/build/Release/a.out
/[...]/req/build/Debug/a.out
/[...]/req/build/Debug/a.out
/[...]/req/build/MinSizeRel/a.out
/[...]/req/build/MinSizeRel/a.out
/[...]/req/build/RelWithDebInfo/a.out
/[...]/req/build/RelWithDebInfo/a.out
/[...]/req/build/Deployment/a.out
/[...]/req/build/Deployment/a.out
/[...]/req/build/Development/a.out
/[...]/req/build/Development/a.out
[...]/req/build/a.out
[...]/req/build/a.out
[...]/req/build/Release/a.out
[...]/req/build/Release/a.out
[...]/req/build/Debug/a.out
[...]/req/build/Debug/a.out
[...]/req/build/MinSizeRel/a.out
[...]/req/build/MinSizeRel/a.out
[...]/req/build/RelWithDebInfo/a.out
[...]/req/build/RelWithDebInfo/a.out
[...]/req/build/Deployment/a.out
[...]/req/build/Deployment/a.out
[...]/req/build/Development/a.out
[...]/req/build/Development/a.out
Unable to find required file: /[...]/req/build/a.out
1/1 Test #1: a.out ............................***Not Run 0.00 sec
0% tests passed, 1 tests failed out of 1
Total Test time (real) = 0.00 sec
The following tests FAILED:
1 - a.out (Not Run)
Errors while running CTest
我认为 REQUIRED_FILES
的目的是为了避免 运行 这个测试,因为那个文件不存在,因此 not 失败了测试。实际使用此 属性 的正确方法是什么?
您使用 属性 是正确的,因为 ctest 实际上没有 运行 测试。 CTest 无法将测试标记为成功,因为它没有 运行,并且不会由于所需文件而将测试标记为失败,因此它会将测试放入 Not Run
bin。
至于为什么没有找到需要的文件,那是因为a.out二进制文件没有构建。您缺少脚本中的一个步骤:
mkdir build && cd build && cmake .. && cmake --build . && ctest
您还可以将脚本简化为: