2015-04-29 52 views
2

我有一些php腳本作爲cronjobs運行。沒有課程,只有一些功能。單元測試PHP腳本

編號喜歡用PHPUnit測試腳本,以確保一切正常,但它似乎我需要重寫PHP作爲一個類,我不想做的(或知道如何)。

例如,如果我有一個劇本,它的唯一功能是增加1和2一起,

<?php 

$a=1; 
$b=2 
$c=$a+$b; 

?> 

我怎麼測試$ C == 3 PHPUnit的?

謝謝, 唐

回答

4

對於你的榜樣,你沒有測試$ C = 3

但是,這是因爲你的例子是有點過於簡單化。腳本執行後,變量$c停止存在。所以它存在的事實並不重要。你想測試你的代碼是做什麼的,而不是它如何做。

我會修改你的例子一點點:

job.php

<?php 

$a=1; 
$b=2 
echo $a + $b; 

?> 

現在我們確實有一些輸出和一些行爲。該測試想:

public function testJob() { 
    require('job.php'); 
    $this->expectOutputString('3'); 
} 

PHPUnit has the ability to assert against stdOut.我們確保代碼輸出我們所期望的。您對這些類型的文件的測試將檢查他們做了什麼是正確的。由於PHP的require語句將在此時執行文件,因此我們可以運行該腳本並檢查其輸出。

如果您的文件具有功能,您只需將它包括在內並在各自的測試中檢查每個功能。

+0

謝謝Schleis!你的例子確實有幫助,你讓它「點擊」給我。 –

+0

沒問題。主要想法是使測試有用,並讓您有信心重構代碼。測試是一個自動化的工作,當你確保工作時你會做什麼。這些斷言應該是你正在檢查的內容。 – Schleis

0

這是沒有必要去讀書,你可以單元測試功能,以同樣的方式!你甚至可以在不封裝函數的情況下進行單元測試,儘管這會更困難。

在特定情況下我會做的是將代碼封裝在一個函數或類中的靜態方法。

<?php 
function add($a, $b) { 
    return $a + $b; 
} 
$c=add($a, $b); 
?> 

然後爲add函數提供測試。 $ a和$ b值來自何處非常重要。這就是你需要嘲笑的。如果你能控制自己的價值,你可以使用

global $c; 
// your test setup 
include(<cron file>); 
$this->assertEquals($expectedValue, $c); 
0

通常,較小的測試單元是一種功能或方法,您可以通過這些功能或方法來輸入,並且您可以從中獲得某些輸出。所以,如果你的腳本包含函數,你可以測試它們。

但是,在您描述的特定情況下,您可以簡單地斷言$c等於3,但這對測試沒有多大幫助,因爲測試應該是black-box test單位。

另外,如果您要測試的腳本調用某些全局PHP函數,則可以模擬這些函數並聲明它們是按預期方式調用的(here是關於如何模擬全局函數的示例)。相同的模擬也可以應用於執行其他全局PHP函數的腳本中的函數。必須小心,但腳本是否執行了一些破壞性操作,例如刪除文件,就好像你不能模擬刪除功能一樣,最終會出現一些令人討厭的結果。