【发布时间】:2011-07-22 00:56:07
【问题描述】:
我想找到一种自动生成测试向量的好方法。例如,我正在通过调用一个函数来测试音频处理模块,该函数使用指定的测试向量来练习被测模块,并在此过程中对模块输出的正确操作和正确性进行各种检查。
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,有用吗?
【问题讨论】:
-
为什么需要模板?嵌套的 for 循环还不够吗?
-
我不一定需要模板,但我只想写一次“allPermutations”、“cornerCases”、“minimal”、“allPairs”等,以应对任意数量的维度和所有参数类型。
-
好吧,我错过了。最好的方法可能是使用基于例如的通用接口。
boost::any用于传递测试参数。这样,您就可以将调度和参数分配与测试本身分开。在这方面,如果您不想使用特定框架,@Alexander Poluektov 的解决方案似乎足够灵活。
标签: c++ unit-testing templates metaprogramming