【问题标题】:How to test function that produce binary file?如何测试生成二进制文件的功能?
【发布时间】:2009-11-02 02:00:10
【问题描述】:

我正在尝试使用 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 文件切成两半。

【问题讨论】:

  • 嗯,单元测试更有可能也更适合用于面向对象的编程,即:你有一个类并且你使用断言来测试你的对象。在这种情况下,您有一个功能并且您想要进行单元测试。我建议您为此开设一个课程并使用 PhpUnit。
  • 把这个 sn-p 转换成类很简单,我只是不知道如何检查生成的文件。
  • 我不同意单元测试适用于 OOP 而不是结构性的(在这种情况下是函数)。单元测试是简单的本地测试。像许多其他测试一样,单元测试只是将预定义输入的输出与该输入的预期输出进行比较。这适用于结构化、函数式、声明式、逻辑编程以及面向对象。只是我的 2 美分。
  • @NawaMan:同意。单元测试没有等待 OOP 存在。

标签: php unit-testing mp3


【解决方案1】:

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

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

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

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

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

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

希望这会有所帮助。

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

【讨论】:

  • 好吧,我想,我的选择是检查命令。谢谢。
【解决方案2】:

这个函数作为它正在做的一些不同的事情可以进行单元测试。我会先分成可以测试的小块。例如:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多