10

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

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

4

3 回答 3

22

--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).

参考:

于 2016-05-11T22:08:22.990 回答
2

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

但是,您可以使用简单的 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
于 2012-12-06T00:18:28.690 回答
0

基于弗雷泽回答的 Linux 单线:

ctest -I ,0,,`awk -F: '{print $1;}' Testing/Temporary/LastTestsFailed.log | paste -d, -s`
于 2014-10-01T12:28:10.473 回答