2009-11-02 34 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); 
} 
相關問題