如何使用 ctest 重新运行失败的测试



我正在使用 CTest 来启动我的项目的测试。我只想启动上次执行时失败的测试。

有没有一种简单的方法可以用CTest做到这一点?

--rerun-failed 选项已添加到 CMake 3.0 中的 CTest:

 --rerun-failed
    Run only the tests that failed previously
    This  option  tells  ctest to perform only the tests that failed
    during its previous run.  When this option is  specified,  ctest
    ignores  all  other options intended to modify the list of tests
    to run (-L, -R, -E, -LE, -I, etc).  In the event that CTest runs
    and   no   tests  fail,  subsequent  calls  to  ctest  with  the
    --rerun-failed option will  run  the  set  of  tests  that  most
    recently failed (if any).

引用:

  • CTest 文档

  • GitHub 提交

我认为简短的回答是否定的。

但是,您可以使用简单的 CMake 脚本将上次失败的测试列表转换为适合 CTest -I选项的格式。

CTest 写入一个名为 <your build dir>/Testing/Temporary/LastTestsFailed.log 的文件,其中包含失败测试的列表。 如果所有测试在后续运行中通过,则不会清除此列表。 此外,如果 CTest 在仪表板模式下运行(作为 dart 客户端),则日志文件名将包括文件<your build dir>/Testing/TAG中详述的时间戳。

下面的脚本没有考虑文件名,包括时间戳,但应该很容易扩展它来做到这一点。 它读取失败测试的列表,并将名为 FailedTests.log 的文件写入当前生成目录。

set(FailedFileName FailedTests.log)
if(EXISTS "Testing/Temporary/LastTestsFailed.log")
  file(STRINGS "Testing/Temporary/LastTestsFailed.log" FailedTests)
  string(REGEX REPLACE "([0-9]+):[^;]*" "\1" FailedTests "${FailedTests}")
  list(SORT FailedTests)
  list(GET FailedTests 0 FirstTest)
  set(FailedTests "${FirstTest};${FirstTest};;${FailedTests};")
  string(REPLACE ";" "," FailedTests "${FailedTests}")
  file(WRITE ${FailedFileName} ${FailedTests})
else()
  file(WRITE ${FailedFileName} "")
endif()

然后,您应该能够通过执行以下操作来仅运行失败的测试:

cmake -P <path to this script>
ctest -I FailedTests.log

基于Fraser答案的Linux单行代码:

ctest -I ,0,,`awk -F: '{print $1;}' Testing/Temporary/LastTestsFailed.log | paste -d, -s`

相关内容

  • 没有找到相关文章

最新更新