2017-08-08 54 views
0

我知道,在圍棋它是常用的所謂TableDrivenTests實施測試的情況下,例如:我可以在C++中使用TableDrivenTests概念嗎?

func TestMyFunc(t *testing.T) { 
    var tTable = []struct { 
     input []float64 
     result float64 
    }{ 
     {[]float64{1, 2, 3, 4, 5, 6, 7, 8, 9}, 102.896}, 
     {[]float64{1, 1, 1, 1, 1, 1, 1, 1, 1}, 576.0}, 
     {[]float64{9, 9, 9, 9, 9, 9, 9, 9, 9}, 0.0}, 
    } 

    for _, pair := range tTable { 
     result := MyFunc(pair.input) 
     assert.Equal(t, pair.result, result) 
    } 
} 

鑑於測試用例表,實際測試通過 所有表只迭代條目和每個條目執行必要的測試。

我真的很喜歡這個風格執行測試。所以我想知道,是否有可能在C++中使用類似的東西?如果可能的話,你能告訴我一個例子嗎?

編輯:我正在使用Qt Creator,我有一個類創建執行單元測試。我真正想知道的是,如果可以創建一個結構,其輸入輸入輸出並遍歷條目以執行每個測試。由於我使用Qt,它不需要是'標準的C++結構',它可以是Qt提供的另一種數據結構。

+0

不使用標準C++,因爲它沒有任何單元測試。你將不得不爲此找到一個圖書館。 – Rakete1111

+0

謝謝@ Rakete1111。我編輯了我的問題。 – KelvinS

+0

當然這是可能的。嘗試一下。 –

回答

2

下面是一個幾乎爲1:1的翻譯C++:

#include <vector> 
#include <iostream> 

// Testable function. 
double MyFunc(const std::vector<double> &input) 
{ 
    static double results[] = { 102.896, 576.0, 0.0 }; 
    static int i = 0; 
    return results[i++]; // return different results 
} 

// Our test. Returns true if passes. 
bool TestMyFunc() 
{ 
    struct 
    { 
     std::vector<double> input; 
     double result; 
    } tTable[] = 
    { 
     {{1, 2, 3, 4, 5, 6, 7, 8, 9}, 102.896}, 
     {{1, 1, 1, 1, 1, 1, 1, 1, 1}, 576.0}, 
     {{9, 9, 9, 9, 9, 9, 9, 9, 9}, 0.0}, 
    }; 

    for (const auto &pair : tTable) { 
     auto result = MyFunc(pair.input); 
     if (result != pair.result) 
      return false; // return false if test fails 
    } 

    return true; // all test cases passed 
} 

int main() { 
    std::cout << TestMyFunc() << std::endl; 
    return 0; 
} 

但是我建議使用現有的單元測試框架,例如gtest有一個概念value parametrised tests,這大概是你想要的。

+0

忍者 - 我9分鐘.... :) ...和你更完整,更精美一點,好。至少我找到了幾乎完全相同的'tTable'結構(結果首先,這在單元測試中更加慣用,「期望」值通常位於左側,輸入和計算位於右側)。現在我看到OP最初就是這樣組織的,所以......對OP來說只是一個毫無意義的建議。 – Ped7g