如何测试生成二进制文件的函数?

时间:2009-11-02 02:00:10

标签: php unit-testing mp3

我试图用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 个答案:

答案 0 :(得分:2)

正如我所看到的,您正在使用外部程序ffmpeg来完成工作。所以我的建议是:

1)测试命令:将此功能提取为两个功能。一个用于生成命令(在本例中为$command3)。创建单元测试以检查命令是否有效。另一个函数执行命令。

2)测试最终结果。您手动创建结果文件。做(手动)确保结果文件是您想要的。编写单元测试以创建命令,执行它然后比较新输出文件和先前生成的文件。可以通过诸如 bsdiff之类的工具进行比较,或者使用php逐字节读取(fread)来比较它们

您可以创建多个文件来执行此测试(例如每个带宽,采样率或编解码器)。

注意我如果转换过程总是生成完全相同的二进制文件,则第二个测试可能不起作用。

注意II 如果转换并不总是产生完全相同的二进制文件,或者不可能有一个测试文件来表示所有其他文件。您必须通过了解输出文件的格式并进行分析来进行更透明的测试。例如,读取原始和ouptut文件的音频长度,采样率并进行比较。

希望这有帮助。

编辑我忘了说些什么。如果你信任ffmpeg。您可以完全跳过测试2(二进制比较),只检查命令。

答案 1 :(得分:0)

这个功能作为一些不同的东西,它可以进行单元测试。我首先要分成可以测试的小块。例如:

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);
}