Php 如何测试生成二进制文件的函数?
我试着用PHP学习单元测试。我知道,对于一个刚开始使用PHP进行单元测试的人来说,这有点太远了。无论如何,情况是这样的:Php 如何测试生成二进制文件的函数?,php,unit-testing,mp3,Php,Unit Testing,Mp3,我试着用PHP学习单元测试。我知道,对于一个刚开始使用PHP进行单元测试的人来说,这有点太远了。无论如何,情况是这样的: function doresize(&$mp3file) { global $tmpdir, $mp3info, $ffmpeg; if(dirname($mp3file) != $tmpdir ) { copy($mp3file , $tmpdir . '/' . $mp3file); $mp3file =
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文件一分为二。如我所见,您正在使用外部程序
ffmpeg
来完成这项工作。因此,我的建议是:
1) 测试命令:将此函数提取为两个函数。一个用于生成命令(在本例中为$command3
)。创建单元测试以检查命令是否有效。另一个函数执行该命令
2) 测试最终结果。您可以手动创建一个结果文件。尽一切努力(用手)确保结果文件是您想要的。编写一个单元测试来创建命令,执行它,然后比较新的输出文件和先前生成的文件。比较可以通过工具完成,例如或使用php逐字节读取(fread
)来比较它们
您可以创建多个文件来执行此测试(如每个带宽、采样率或编解码器)
请注意,如果转换过程始终生成完全相同的二进制文件,则第二个测试可能不起作用
注II:如果转换并不总是产生完全相同的二进制文件,或者不可能有一个测试文件来表示所有其他文件。您必须通过了解输出文件的格式并对其进行分析来进行更透明的测试。例如,读取原始文件和输出文件的音频长度、采样率并进行比较
希望这有帮助
我忘了说什么了。如果你相信我。您只需完全跳过测试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);
}
单元测试更有可能也更适合用于面向对象编程,即:您有一个类,并且您使用断言来测试您的对象。在本例中,您有一个函数,并且希望进行单元测试。我建议您为此创建一个类并使用PhpUnit。将此代码段转换为类很容易,我只是不知道如何检查生成的文件。我不同意单元测试适用于OOP,而不适用于结构(本例中的函数)。单元测试是简单的局部测试。与许多其他类型的测试一样,单元测试只是将预定义输入的输出与该输入的预期输出进行比较。这同样适用于结构化、函数式、声明式、逻辑编程以及面向对象编程。只有我的2美分。@NawaMan:同意。单元测试并没有等到OOP存在。我想,我的选择是检查命令。非常感谢。