Quiero encontrar una buena forma de generar vectores de prueba automáticamente. A modo de ejemplo, estoy probando un módulo de procesamiento de audio llamando a una función que ejercita el módulo bajo prueba con el vector de prueba especificado y, al hacerlo, realiza varias comprobaciones para el funcionamiento correcto y la corrección de la salida del módulo.Generación automática/plantilla de vectores de prueba en C++
void runTest(const char *source, double gain, int level);
El vector de prueba es el triplete de source
, gain
y level
. Aquí está el espacio multidimensional Quiero poner a prueba en contra:
const char *sources[] = {"guitar.mp3", "vocals.mp3", "drums.mp3"};
double gains[] = {1., 10., 100.};
int levels[] = {1, 2, 3, 4};
valores pueden tener otras propiedades, por ejemplo, si tiene una rabia vocals.mp3 dinámica de 2, 5 la guitarra y la batería 10, podríamos concebir una representación como:
int dynamicRange(const char *source);
Quiero ser capaz de configurar varias pruebas. Por ejemplo, quiero ser capaz de ejecutar:
// 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);
Quiero crear el código anterior y sin un montón de copiar y pegar de forma dinámica o usando mi compilador para hacer el trabajo de campo, por ejemplo:
// 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);
Lo anterior parece una C dinámica, pero mi lenguaje es C++ y espero utilizar plantillas y una combinación de técnicas dinámicas y estáticas. Tal vez incluso metaprogramación.
Las combinaciones y variaciones también serían interesantes. Por ejemplo, podría querer usar solo el archivo de entrada más corto. O puede que desee ejecutar todas las fuentes con corner-cases para gain
y level
. O gain
también podría ser un rango continuo de 1 a 100, pero vamos a mantener las cosas discretas por ahora.
Antes de comenzar a diseñar tipos, plantillas, representación, etc. Me preguntaba si esto es un problema que se ha resuelto antes o, si no, las bibliotecas existentes, p. Boost MPL, se útil?
¿Por qué quieres plantillas? ¿No están anidados para bucles lo suficiente? –
No necesito necesariamente plantillas pero solo quiero escribir "allPermutations", "cornerCases", "minimal", "allPairs", etc. una vez para hacer frente a cualquier número de dimensiones y todos los tipos de parámetros. – paperjam
Ok, me perdí esto. La mejor forma es, probablemente, utilizar una interfaz común basada en, por ejemplo. 'boost :: any' para pasar los parámetros de prueba. De esta forma, separa la asignación de parámetros y el vertido de las pruebas en sí. En este sentido, la solución de @Alexander Poluektov parece lo suficientemente flexible si no desea utilizar un marco particular. –