我试图用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 :(得分: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);
}