Я хочу найти хороший способ автоматически генерировать тестовые векторы.В качестве примера, я тестирую модуль обработки звука, вызывая функцию, которая выполняет тестируемый модуль с указанным тестовым вектором и при этом выполняет различные проверки правильности работы и правильности вывода модуля.
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?