我想找到一种自动生成测试向量的好方法。举个例子,我正在通过调用一个函数来测试一个音频处理模块,该函数使用指定的测试向量来执行被测模块,并且这样做会对模块输出的正确操作和正确性进行各种检查。在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