首页
学习
活动
专区
圈层
工具
发布

ctest生成
EN

Stack Overflow用户
提问于 2016-03-03 15:00:49
回答 1查看 237关注 0票数 0

我使用CMake和ctest一起生成软件测试。举个例子,我有一个二进制foo,它得到了整整三个输入参数-- p1p2p3。参数范围从0到2。为了检查二进制foop1p2p3的所有可能组合,我在CMakeList.txt中执行以下操作

代码语言:javascript
复制
foreach(P1 0 1 2)
    foreach(P2 0 1 2)
        foreach(P3 0 1 2)
            add_test(foo-p1${P1}-p2${P2}-p3${P3} foo ${P1} ${P2} ${P3})
        endforeach(P3)
    endforeach(P2)
 endforeach(P3)

是否有一种更“优雅”的方法来生成所有这些不同的测试?假设foo需要10个参数p1,.,p10,这看起来很可怕。提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-03 19:13:42

您可以使用递归函数使测试的生成“更优雅”:

代码语言:javascript
复制
#  generate_tests n [...]
#
# Generate test for each combination of numbers in given range(s).
#
# Names of generated tests are ${test_name}-${i}[-...]
# Commands for generated test are ${test_command} ${i} [...]
#
# Variables `test_name` and `test_command` should be set before function's call.
function(generate_tests n)
    set(rest_args ${ARGN})
    list(LENGTH rest_args rest_args_len)
    foreach(i RANGE ${n})
        set(test_name "${test_name}-${i}")
        list(APPEND test_command ${i})
        if(rest_args_len EQUAL 0)
            add_test(${test_name} ${test_command}) # Final step
        else()
            generate_tests(${test_args}) # Recursive step
        endif()
    endforeach()
endfunction()

# Usage example 1
set(test_name foo)
set(test_command foo)
generate_tests(2 2 2) # Will generate same tests as in the question post

# Usage example 2
set(test_name bar)
set(test_command bar arg_first ) # `arg_first` will prepend generated command's parameters.
generate_tests(1 2 1 1 1 1 1 1 1 1) # 10 Ranges for generation. 3 * 2^9 = 1536 tests total.

注意,在第二种情况下(具有10个迭代参数),测试总数相对较大(1536)。在这种情况下,CMake配置可能会比较慢。

通常,这种可扩展的测试是由特殊的测试系统执行的。CTest (它使用命令add_test生成测试)是一个简化的测试系统,具有一些特性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35775626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档