使用 cmake/ctest 随机化单元测试
Randomize unit-tests using cmake/ctest
我管理着一个相当大的开源项目,其中包含许多单元测试(约 200 个文件)并且通过所有测试对于持续集成来说非常耗时。我们使用 cmake/ctest/Catch2 作为单元测试框架。
有没有办法告诉 cmake/ctest 只构建和 运行 单元测试的随机子集(例如,只有 30%)?
当对给定功能的代码进行多次提交迭代时,所有检查的测试都趋于一次的概率,但每个单独的提交会更快。
显然,在准备 PR 或发布时,此比率将设置为 100%。
Is there a way to tell 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"; }
I meant an automatic way to do that.
没有,没有。
另类
最后,我想出了一个 cmake 解决方案,只需创建一个新的 add_test()
函数来激活随机测试的测试:
function(my_add_test test_file) #optional_avoid_add_test
string(RANDOM LENGTH 2 ALPHABET "0123456789" _random)
if (${_random} LESS ${THRESHOLD_RANDOM_TESTING})
add_executable(${test_file} ${test_file}.cpp)
add_test(${test_file} ${test_file})
endif()
endfunction()
在我的主 cmake
中,我有全局变量(可以设置在 cmake
CLI/GUI)
SET(THRESHOLD_RANDOM_TESTING "100" CACHE INTERNAL "~% of unit tests to build and run.")
每次我重新生成项目时,都会构建一个新的随机选择。
我管理着一个相当大的开源项目,其中包含许多单元测试(约 200 个文件)并且通过所有测试对于持续集成来说非常耗时。我们使用 cmake/ctest/Catch2 作为单元测试框架。
有没有办法告诉 cmake/ctest 只构建和 运行 单元测试的随机子集(例如,只有 30%)?
当对给定功能的代码进行多次提交迭代时,所有检查的测试都趋于一次的概率,但每个单独的提交会更快。
显然,在准备 PR 或发布时,此比率将设置为 100%。
Is there a way to tell 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"; }
I meant an automatic way to do that.
没有,没有。
另类
最后,我想出了一个 cmake 解决方案,只需创建一个新的 add_test()
函数来激活随机测试的测试:
function(my_add_test test_file) #optional_avoid_add_test string(RANDOM LENGTH 2 ALPHABET "0123456789" _random) if (${_random} LESS ${THRESHOLD_RANDOM_TESTING}) add_executable(${test_file} ${test_file}.cpp) add_test(${test_file} ${test_file}) endif() endfunction()
在我的主 cmake
中,我有全局变量(可以设置在 cmake
CLI/GUI)
SET(THRESHOLD_RANDOM_TESTING "100" CACHE INTERNAL "~% of unit tests to build and run.")
每次我重新生成项目时,都会构建一个新的随机选择。