问题描述
我有一个基于cmake
的(C ++)项目,其中包括通过add_test()
创建的测试。
构建过程基本上是:
- cmake
- 建立所有测试套件
- 进行测试
这工作了一段时间了。
我现在正在尝试使我的构建生成一个Test.xml
,并将其作为管道构建的一部分提交。它不适用于该项目。
Q1我可以告诉cmake
我要生成Test.xml
时(进行测试)运行测试吗?
目前,我相信只能通过运行Test.xml
来创建ctest
。
大概ctest汇总了测试结果,而cmake
只是盲目地运行它们?
有人可以确认或驳斥吗?
所以我目前正在尝试使用以下命令运行ctest:
ctest -vv -debug --output-on-failure -T test
因为这确实创建了我需要的Test.xml
文件。
我必须添加include(CTest)
和include(Dart)
来修复“ Could not find DartConfiguration.tcl
”。
但是,即使我以前运行过“ make test
”,它也保证了构建是最新的,它仍然尝试构建,并且我得到了:
Error: Could not load cache
对于运行已编译测试的测试(基于脚本的测试可以正常工作)。 它正在执行的命令是:
/opt/cmake-3.18.1/bin/cmake "--build" "<projectDir>/test/<TestName>" --target "<test_exe>"
CMakeCache.txt
和CMakeLists.txt
实际上位于“ <projectDir>/cmake
”中,这就是为什么无法加载缓存的原因。
该命令应为:
/opt/cmake-3.18.1/bin/cmake "--build" "<projectDir>/cmake" --target "<test_exe>"
Q2是否有某种方法可以告诉ctest不需要运行cmake?
我的怀疑不是。 ctest是否必须调用cmake来运行测试?它只是监视和汇总输出吗?
如果我查看DartConfiguration.tcl,就会发现:
SourceDirectory: <projectDir/cmake
BuildDirectory: <projectDir/cmake
ConfigureCommand: "/opt/cmake-3.18.1/bin/cmake" "<projectDir/cmake"
MakeCommand: /opt/cmake-3.18.1/bin/cmake --build . --config "${CTEST_CONfigURATION_TYPE}" -- -i
我正在运行ctest -T test而不是ctest -T build-and-test为什么ctest完全尝试构建?
我尝试设置Ctest_build_command,但它似乎对生成的DartConfiguration.tcl没有影响。
一些说明:
-
ctest适用于其他使用源代码以外版本的项目
-
如果不进行大规模重构,该人将无法使用源代码以外的版本。
-
源根实际上是“
<projectDir>
” -
CMakeLists.txt位于“
<projectDir>/cmake
”中 -
程序源代码位于“
<projectDir>/src
”中 -
测试脚本和代码位于“
<projectDir>/test
”中 -
我的构建工作于:
enable_testing()
我以前从未使用过:
include(CTest)
include(Dart)
其中一个创建DartConfiguration.tcl,它只是“键:值”对的列表。我认为这是在直接调用ctest时使用的,这里不是这种情况。 尽管阅读了this,我仍不清楚它们的真正用途和目的。
也发布在cmake讨论频道-https://discourse.cmake.org/t/cmake-ctest-generate-test-xml-without-rebuilding-could-not-load-cache/2025
解决方法
事实证明,我有一些伪测试用于通过cmake --build来构建测试驱动程序。这些是使用CMAKE_CURRENT_DIRECTORY而不是CMAKE_SOURCE_DIR明确且莫名其妙地使用的。糟糕!