Как проверить функцию, которая выдает двоичный файл? - PullRequest
0 голосов
/ 02 ноября 2009

Я пытался научиться модульному тестированию с помощью PHP. Я знаю, что это слишком далеко для тех, кто просто запустил юнит-тестирование в PHP. Во всяком случае, вот случай:

function doresize(&$mp3file)
{
    global $tmpdir, $mp3info, $ffmpeg;

    if(dirname($mp3file) != $tmpdir )
    {
        copy($mp3file , $tmpdir . '/' . $mp3file);
        $mp3file = $tmpdir . '/' . $mp3file;
    }
    $mp3filenew = basename($file, '.swf') . "_new.mp3";

    $command2 = "$mp3info -x \"$mp3file\" 2> /dev/null";

    exec($command2, $buffer);

    $mp3length = getLengthFromBuffer($buffer);

    debug("  \$mp3length: $mp3length");

    $lengthTranslated = roundLengthToSeconds($mp3length);

    $maxlength = floor( $lengthTranslated / 2);

    $halfmaxlength = floor( $maxlength / 2);

    $start = rand($halfmaxlength, $maxlength);

    $command3 = "$ffmpeg -y -acodec copy -ss $start -t $maxlength -i \"$mp3file\" $mp3filenew 2> /dev/null";


    exec($command3);

    @unlink($mp3file);
    rename($mp3filenew, $mp3file);
}

Из вышеприведенного кода, какой аспект этого кода я должен добавить в тестовом примере?

К вашему сведению: приведенный выше код используется для разрезания mp3-файлов пополам.

Ответы [ 2 ]

2 голосов
/ 02 ноября 2009

Как я вижу, для работы вы используете внешнюю программу ffmpeg. Итак, мои предложения таковы:

1) Проверьте команду: вы извлекаете эту функцию в две функции. Один для генерации команды (в данном случае $command3). Создайте модульный тест, чтобы проверить правильность команды. Другая функция выполняет команду.

2) Проверьте окончательный результат. Вы вручную создаете файл результатов. Сделайте все возможное (вручную), чтобы убедиться, что файл результатов - это то, что вам нужно. Напишите модульный тест для создания команды, выполните ее, а затем сравните новый выходной файл и файл, который вы создали ранее. Сравнение может быть сделано с помощью таких инструментов, как bsdiff или с помощью php для чтения побайтно (на ум приходит fread), чтобы сравнить их .

Вы можете создать несколько файлов для этого теста (например, для каждой полосы пропускания, частоты дискретизации или кодека).

ПРИМЕЧАНИЕ I , что второй тест может не сработать, если процесс преобразования всегда выдает точно такой же двоичный файл.

ПРИМЕЧАНИЕ II Если преобразование не всегда дает один и тот же двоичный файл или невозможно иметь один тестовый файл для представления всех других файлов. Вы должны сделать более прозрачный тест, зная формат выходного файла и проанализировав его. Например, прочитайте исходную и выходную аудиофайлы, частоты дискретизации и сравните их.

Надеюсь, это поможет.

РЕДАКТИРОВАТЬ Я забыл что-то сказать. Если вы доверяете ffmpeg. Вы можете просто полностью пропустить тест 2 (двоичное сравнение) и проверить только команду.

0 голосов
/ 05 ноября 2009

Эта функция, так как она выполняет несколько разных вещей, может быть проверена модулем. Я бы начал с разбивки на маленькие кусочки, которые можно проверить. Например:

function doresize(&$mp3file)
{    
    $mp3file = move_to_tmp_if_not_already($mp3file);

    $lengthTranslated = getFileLengthTranslated($mp3file)

    $maxlength = floor( $lengthTranslated / 2);
    $halfmaxlength = floor( $maxlength / 2);
    $start = rand($halfmaxlength, $maxlength);
    $mp3filenew = extract_mp3($mp3file, start, $maxlength);

    @unlink($mp3file);
    rename($mp3filenew, $mp3file);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...