2016-03-03 74 views
0

我使用CMake和ctest一起生成軟件測試。 作爲一個例子,我有一個二進制foo,它正好有三個輸入參數 p1,p2,p3。參數的範圍可以從0-2。 要檢查我的二進制foop1p2所有可能的組合,p3 我做的,我CMakeList.txtCmake ctest代

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這看起來很可怕。 在此先感謝。

+0

難道你不會錯過在'add_test()'命令行調用'foo'本身嗎?關於你的問題,我不知道'add_test()'命令中的任何「參數範圍」選項。所以我不認爲你可以在CMake中進一步優化它。 – Florian

+0

是的,你是對的,我編輯了我的文章 –

+1

一個小的優化就是在像foreach(P1 RANGE 0 2)這樣的'foreach()'中使用'RANGE''。這些東西用於遍歷測試參數[通過CMake本身](https://github.com/Kitware/CMake/blob/master/Tests/CMakeLists.txt#L1481)。 – Florian

回答

1

您可以使用化妝測試的一代遞歸函數「更優雅」:

# 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生成測試)是一個簡化的測試系統,具有一些功能。

+0

你知道其中一些稱爲「特殊測試系統」嗎? –

相關問題