我正在使用CMake来构建我的项目.我添加了一个使用Boost单元测试框架的单元测试二进制文件.这个二进制文件包含所有单元测试.我已经添加了由CTest运行的二进制文件:
ADD_EXECUTABLE( tftest test-main.cpp )
ENABLE_TESTING()
ADD_TEST( UnitTests tftest)
Run Code Online (Sandbox Code Playgroud)
但Visual Studio中的构建输出仅显示运行CTest的结果:
Start 1: UnitTests
1/1 Test #1: UnitTests ................***Failed 0.05 sec
0% tests passed, 1 tests failed out of 1
Run Code Online (Sandbox Code Playgroud)
这不是很有用,因为我看不出哪个测试失败了.如果我从命令行手动运行ctest,--verbose我得到Boost单元测试的输出,它告诉实际失败的是什么:
1: Test command: tftest.exe
1: Test timeout computed to be: 9.99988e+006
1: Running 4 test cases...
1: test-main.cpp(20): error in "sanity_check3": check 1 == 2 failed
1:
1: *** 1 failure detected in test suite "Master Test Suite"
1/1 Test #1: UnitTests ................***Failed 0.00 sec
Run Code Online (Sandbox Code Playgroud)
那么,我需要在CMakeLists.txt中进行哪些更改才能让CTest --verbose …
我希望ctest默认显示失败的测试输出.也就是说,我想运行:
$ make all test
Run Code Online (Sandbox Code Playgroud)
并且无需查看任何失败测试的输出cat Testing/Temporary/LastTest.log.
似乎有两种方法可以做到这一点:
(1)设置CTEST_OUTPUT_ON_FAILURE环境变量:
$ CTEST_OUTPUT_ON_FAILURE=1 make all test
$ # or CTEST_OUTPUT_ON_FAILURE=1 ctest
Run Code Online (Sandbox Code Playgroud)
(2)指定调用的--output-on-failure标志ctest:
$ ctest --output-on-failure
Run Code Online (Sandbox Code Playgroud)
是否有办法编写CMakeLists.txt文件,以便ctests在默认情况下在正常的"make all test"调用中转储失败的测试输出,而无需在会话中全局导出环境变量或诉诸自定义目标make check(如所描述的)在这里)?
我知道SET_TESTS_PROPERTIES()命令,但尝试这样:
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(testenv CXX)
ENABLE_TESTING()
ADD_EXECUTABLE(hello hello.cpp)
ADD_TEST(testhello hello)
# Following sets the environment variable for the shell in which the test
# progoram 'hello' is run, but not the shell in which ctest is run
SET_TESTS_PROPERTIES(testhello
PROPERTIES …Run Code Online (Sandbox Code Playgroud) 我有一种感觉,我应该能够在应用程序生命周期的基础上将目录添加到PATH环境变量,但我无法找到如何执行此操作.是否可以向Windows快捷方式添加参数,该快捷方式将目录附加到PATH的当前值以供链接的应用程序使用?
我希望每次成功构建项目时都会启动测试.如果某些测试被破坏,我希望我的构建也被打破.默认情况下,我需要通过运行ctest命令手动运行测试.CTest实际上可以构建项目,但我使用调用make来构建源代码的IDE .而且make不会运行测试.
我将此命令添加到我的根CMakeLists.txt文件,但它不起作用.
add_custom_command(OUTPUT tests.txt
POST_BUILD
COMMAND ctest --output-on-failure)
Run Code Online (Sandbox Code Playgroud)
CMake不会返回任何错误,一切都很好,但我的自定义命令不会调用.如何在CMake中每次成功构建后运行一些东西?
更新:
我的最终解决方案是这个功能:
macro(add_unit_test target target_test)
set(UNIT_TEST_TARGETS ${UNIT_TEST_TARGETS} ${target_test} PARENT_SCOPE)
add_test(target ${CMAKE_CURRENT_BINARY_DIR}/${target_test})
endmacro(add_unit_test)
Run Code Online (Sandbox Code Playgroud)
它调用add_test并记住列表中的测试目标.此功能添加的项目中的每个测试.在根CMakeLists.txt我有这个代码:
add_custom_target( all_tests ALL
DEPENDS ${UNIT_TEST_TARGETS}
)
add_custom_command(TARGET all_tests
COMMENT "Run tests"
POST_BUILD COMMAND ctest ARGS --output-on-failure
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
)
Run Code Online (Sandbox Code Playgroud)
它创建依赖于项目中所有单元测试的自定义目标.自定义命令all_tests在构建目标后运行.