2009-11-02 78 views
0

我正试图学习使用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文件剪切一半。

+0

那么,单元测试更有可能适用于面向对象编程,即:您有一个类,并使用断言来测试您的对象。在这种情况下,你有一个功能,你想单元测试。我建议你有一个这样的课程,并使用PhpUnit。 – DarthVader 2009-11-02 02:21:00

+1

将此片段转换为类很容易,我只是不知道如何检查生成的文件。 – ariefbayu 2009-11-02 02:32:53

+1

我不同意单元测试适合OOP而不是结构(在这种情况下是函数)。单元测试是简单的本地测试。像许多其他测试一样,单元测试简单地将预定义输入的输出与该输入的预期输出进行比较。这对于面向对象的结构,功能,声明性,逻辑编程都是适用的。只是我2美分。 – NawaMan 2009-11-02 03:01:00

回答

2

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

1)测试命令:你将这个函数提取成两个函数。一个用于生成命令(在这种情况下是$command3)。创建一个单元测试来检查命令是否有效。另一个函数执行该命令。

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

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

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

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

希望这会有所帮助。

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

+0

好吧,我想,我的选择是检查命令。谢谢。 – ariefbayu 2009-11-02 03:53:05

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); 
} 
相关问题