[英]Unit Testing a PHP Script
我有一些作為cronjobs運行的php腳本。 沒有類,只有幾個函數。
我想用PHPUnit測試腳本以確保一切正常,但看來我需要將php作為一個類重寫,我不想這樣做(或不知道如何做)。
例如,如果我有一個腳本,而它的唯一功能是將1和2加在一起,
<?php
$a=1;
$b=2
$c=$a+$b;
?>
如何使用phpunit測試$ c == 3?
謝謝唐
對於您的示例,您無需測試$ c = 3。
但這是因為您的示例過於簡單。 腳本執行后,變量$c
停止存在。 因此,它的存在並不重要。 您想要測試代碼的功能,而不是代碼的功能。
我將對您的示例進行一些修改:
job.php
<?php
$a=1;
$b=2
echo $a + $b;
?>
現在,我們實際上有一些輸出和某些行為。 測試為此:
public function testJob() {
require('job.php');
$this->expectOutputString('3');
}
PHPUnit可以對stdOut進行斷言。 我們確保代碼輸出期望的結果。 您對這些類型的文件進行的測試將檢查它們是否正確。 由於PHP的require
語句將在此時執行文件,因此我們可以運行腳本並檢查其輸出。
如果文件具有功能,則只需將其包括在內,然后在各自的測試中檢查每個功能。
不一定要有類,您可以用相同的方法對函數進行單元測試! 您甚至可以在不封裝功能的情況下進行單元測試,盡管這樣做會更加困難。
在特定情況下,我要做的是使用靜態方法將代碼封裝在函數或類中。
<?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);
通常,較小的測試單元是一種函數或方法,您可以將輸入傳遞給該函數或方法,並且可以從中期望獲得一定的輸出。 因此,如果您的腳本包含功能,則可以對其進行測試。
但是,在您描述的特定情況下,您可以簡單地斷言$c
等於3
,但這對測試沒有多大幫助,因為測試應該對單元black-box test
。
另外,如果要測試的腳本調用了某些全局PHP函數,則可以模擬這些函數並斷言它們是按預期方式調用的( 這里是有關如何模擬全局函數的示例)。 相同的模擬也可以應用於執行其他全局PHP函數的腳本中的函數。 但是,如果腳本執行某些破壞性的操作(例如刪除文件,就像您無法模擬刪除功能一樣),則可能要小心,但結果可能會令人討厭。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.