【问题标题】:Randomize unit-tests using cmake/ctest使用 cmake/ctest 随机化单元测试
【发布时间】:2021-09-25 02:17:58
【问题描述】:

我管理一个相当大的开源项目,其中包含许多单元测试(约 200 个文件),并且通过所有测试对于持续集成来说非常耗时。我们使用 cmake/ctest/Catch2 作为单元测试框架。

有没有办法告诉 cmake/ctest 只构建和运行单元测试的随机子集(例如,只有 30%)?

当针对给定功能对代码进行多次提交迭代时,检查所有测试的概率趋于一,但每个单独的提交会更快。

显然,在准备 PR 或发布时,该比率将设置为 100%。

【问题讨论】:

  • Is there a way to tell cmake/ctest 是的,进行所有测试,随机播放,获得其中的 30%,然后将它们传递给 ctest。你试过什么?
  • 嗯..我的意思是一种自动的方式来做到这一点。在每个 ctest 调用中随机挑选一些测试。

标签: unit-testing cmake ctest


【解决方案1】:

另类

最后,我想出了一个 cmake 解决方案,只需创建一个新的add_test() 函数,它会在随机测试时激活测试:

function(my_add_test test_file) #optional_avoid_add_test
  字符串(随机长度 2 字母“0123456789”_random)
  if (${_random} LESS ${THRESHOLD_RANDOM_TESTING})
    add_executable(${test_file} ${test_file}.cpp)
    add_test(${test_file} ${test_file})
  万一()
结束函数()

在我的主要cmake 中,我有全局变量(可以在cmake CLI/GUI 中设置)

SET(THRESHOLD_RANDOM_TESTING "100" CACHE INTERNAL "~% of unit tests to build and run.")

每次我重新生成项目时,都会构建一个新的随机选择。

【讨论】:

    【解决方案2】:

    有没有办法告诉cmake/ctest

    是的。获取所有测试,随机播放,获取其中的 30%,然后将它们传回给 ctest。

    看起来很有趣,在 linux shell 中只是:

    ctest -N | sed -n 's/  Test #[0-9]\+: //p' | { tmp=$(cat); cnt=$(wc -l <<<"$tmp"); shuf -n "$((cnt * 30 / 100))" <<<"$tmp"; }
    

    我的意思是一种自动的方式来做到这一点。

    不,没有。

    【讨论】:

    • 不错的解决方法.. 让我玩一下。谢谢
    猜你喜欢
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    • 2013-03-22
    • 2010-10-18
    • 1970-01-01
    相关资源
    最近更新 更多