我想找到一種自動生成測試向量的好方法。舉個例子,我正在通過調用一個函數來測試一個音頻處理模塊,該函數使用指定的測試向量來執行被測模塊,並且這樣做會對模塊輸出的正確操作和正確性進行各種檢查。在C++中自動/模板生成測試向量
void runTest(const char *source, double gain, int level);
的測試向量的source
,gain
和level
三重態。這裏是多維的空間,我想測試反對:
const char *sources[] = {"guitar.mp3", "vocals.mp3", "drums.mp3"};
double gains[] = {1., 10., 100.};
int levels[] = {1, 2, 3, 4};
值可以有其他屬性,例如,如果vocals.mp3有2動態憤怒,吉他5和鼓10,我們可以設想就像一個表示:
int dynamicRange(const char *source);
我希望能夠配置各種測試運行。舉例來說,我希望能夠運行:
// all permutations (total 36 vectors)
runTest("guitar.mp3", 1., 1);
runTest("guitar.mp3", 1., 2);
runTest("guitar.mp3", 1., 3);
runTest("guitar.mp3", 1., 4);
runTest("guitar.mp3", 1., 1);
runTest("guitar.mp3", 10., 2);
runTest("guitar.mp3", 10., 3);
// ...
// corner cases (according to dynamicRange)
runTest("vocals.mp3", 1., 1);
runTest("vocals.mp3", 1., 4);
runTest("vocals.mp3", 100., 1);
runTest("vocals.mp3", 100., 4);
runTest("drums.mp3", 1., 1);
runTest("drums.mp3", 1., 4);
runTest("drums.mp3", 100., 1);
runTest("drums.mp3", 100., 4);
// sparse/minimal tests touching every value for each parameter
runTest("guitar.mp3", 1., 1);
runTest("vocals.mp3", 10., 2);
runTest("drums.mp3", 100., 3);
runTest("guitar.mp3", 1., 4);
// quick test
runTest("guitar.mp3", 1., 1);
我想沒有很多的副本創建上面的代碼粘貼動態或使用我的編譯器做跑腿,例如:
// syntax tentative here, could be class/template instantiations
allPermutations(runTest, sources, gains, levels);
cornerCases(runTest, lookup(sources, dynamicRange), gains, levels);
minimal(runTest, sources, gains, levels);
quick(runTest, sources, gains, levels);
上面看起來像動態C,但我的語言是C++,我期待使用模板以及動態和靜態技術的組合。也許甚至是元編程。
組合和變化也會很有趣。例如,我可能只想使用最短的輸入文件。或者我可能想運行所有的角落案例來源gain
和level
。或者gain
也可以是1到100的連續範圍,但現在讓我們保持離散。
在我開始設計類型,模板,表示等之前,我想知道這是一個在之前解決的問題,或者如果沒有,現有的庫Boost MPL,有用嗎?
爲什麼你想要模板?不足以嵌套循環嗎? – 2011-03-24 13:25:36
我不一定需要模板,但我只想編寫「allPermutations」,「cornerCases」,「minimal」,「allPairs」等一次來處理任意數量的維度和所有參數類型。 – paperjam 2011-03-24 14:18:39
好吧,我錯過了這個。最好的方法可能是使用基於例如。 'boost :: any'用於傳遞測試參數。這樣,您可以將調度和參數分配與測試本身分開。在這方面,@Alexander Poluektov的解決方案似乎足夠靈活,如果你不想使用特定的框架。 – 2011-03-24 14:26:28