本篇主要介紹PHP腳本的測試方法及實例,有興趣的朋友參考下,希望對大家有幫助。
一、常用測試範例
我們經常會遇到這種情況:將一些沒有經過任何測試的遺留程式碼重新編寫測試,甚至這些程式碼還是用面向對象寫的。要對這樣的程式碼進行測試,我的建議是把程式碼分解成區塊,這樣就容易測試了。
然而,這些遺留程式碼並不是那麼好重構的,例如:測試前,你不能在把程式碼重新編寫,這是為了避免影響原有程序,當然也不好進行單元測試。
在PHP程式中,通常有一部分程式碼是寫在幾個index.php和script.php檔案中的,這些.php檔案存放在幾個不同的資料夾裡。如果不找到它們的入口點,是無法直接由網路伺服器存取的。
測試副本
要測試一個PHP腳本,我們需要模擬一個HTTP請求,並檢查傳回的回應(response)是否等於預期值。這裡要注意的是模擬一個請求,要定義response和request,這不只是內容(content)的不同,而且他們的頭資訊(header)也是不同的。
此外,如果我們想要測試一個操作資料的事務腳本,我們要確保不讓它去連接真正的資料庫或應用程式的其餘部分。
在現實中,通常沒有人會直接拿原來的PHP腳本來重寫測試。因為怕把程式碼弄得不可恢復。我建議使用PHP腳本的副本,這樣我們就可以將PHP程式碼進行一些小手術了。
如何將程式碼進行最小修改:刪除include和require語句(如果它們沒有被用到),並且修改內部函數的呼叫方式,例如:將header()寫成$object->header() 。
最後,我們來測試這個事務腳本。測試完後,我們可以從副本腳本中提取出它們,並將它們放入新腳本檔案中。
具體步驟
一、模擬一個HTTP請求並重新定義變數$_GET和$_POST,還要修改$_SERVER的header。
二、取得請求回應,response的body可以透過ob_start()和ob_get_clean()捕獲,它可以收集每一個用echo()或以
注意:輸出緩衝支援在PHP多個層級的嵌套,所以在大多數情況下,都可以捕獲到,即使腳本在使用ob_*呼叫本身。
三、測試腳本應包含事務腳本的內部方法,因此在這個腳本範圍內的方法都可以被呼叫。例如:
1.腳本所需的變數可以定義為局部變數封裝起來,如$connection作為一個資料庫連接。
2.不是原本PHP的內建函數,應該加上物件來調用,如:header()寫成$this->header()。
具體程式碼
這就是我們要測試的事務腳本對象,具體到腳本中,我們還需要封裝:
<?php class ForumPosting { private $headers = array(); public function handleRequest($postRequest) { $_POST = $postRequest; $connection = $this->getAConnection(); ob_start(); include 'forum/post_new_copy.php'; $content = ob_get_clean(); return array( 'content' => $content, 'headers' => $this->headers ); } private function header($headerLine) { $this->headers[] = $headerLine; } ... }
這是我們的測試程式碼:
public function testANewPostIsCreated() { $action = new ForumPosting(); $response = $action->handleRequest(array( 'id_thread' => 42, 'text' => 'Hello, world', ... )); $this->assertEquals('...', $response['content']); $this->assertContains('Content-type: text/html', $response['headers']); }
測試副本只是暫時的!它讓我們寫的測試不會改變。最終,我們要將已經通過測試的PHP腳本進行重構,以消除冗餘程式碼。
當我們的測試完成後,可以將handleRequest()的內容替換成真正的邏輯程式碼。假如你要寫很多這樣的測試腳本,你可以寫一個通用的測試對象,以滿足你的測試需求。
二、PHP開發者的單元測試工具包
#在PHP領域,單元測試的工具主要有PHPUNIT,PHPUNIT2和SimpleTest三種。其中PHPUNIT在功能上很簡單,不算完善;PHPUNIT2是專門為PHP5寫的單元測試工具,在結構和功能上都向Junit看齊;而SimpleTest則是一套非常實用的測試工具,其中的webTest支持對web程式介面的測試,是Easy最推薦的一款測試工具。在本文中,我們選擇SimpleTest來介紹。
相關知識:PHPUNIT2也是一款很好的工具,尤其是架構上有很多值得圈點之處,希望未來能有機會在專門的文章中和大家分享。
SimpleTest:就是這麼Simple
安裝SimpleTest很簡單,上sf.net上下載一個原始碼包,然後解壓縮到web目錄下就可以使用了,這裡就不多說。
下面我們先來看個範例:寫一個測試,檢查一個網站是否可以存取。
首先我們引入要用到的檔案:
程式碼清單:
require_once("../simpletest/unit_tester.php"); require_once("../simpletest/web_tester.php"); require_once("../simpletest/reporter.php");
然後我們建立一個測試類別:
程式碼清單:
class TestOfSite extends WebTestCase { function TestOfSite() { $this->WebTestCase("测试"); } function testSite() { $this->get("http://howgo.net/prettyface/display.php"); $this->assertTitle(".: facebook :."); } }
首先我們擴展了webTestCase類,這樣我們就可以自動獲得測試web的能力,然後在建構函數中我們直接使用基類的,只是把標題傳給它。接著我們就該寫入測試方法了,測試方法都是以'test"開頭的,用以識別在我們運行測試的時候,類別中哪些方法要進行呼叫。
而$this-> get將取得網頁的內容,我們指定它的標題為".: facebook :.", 接著我們要做的就是實例化這個類別的對象,並運行它。
代码列表:
$test = &new TestOfSite(); $test->run(new HtmlReporter());
下边是运行结果:
如果测试出错则会出现下边的界面:
到这里一个简单的测试就算完成了。
实战演习 – 一个Login测试
下面我们进入实战,在这个基础上完成一个login的测试。这次我们先贴出完整的代码:
代码列表:
require_once("../simpletest/unit_tester.php"); require_once("../simpletest/web_tester.php"); require_once("../simpletest/reporter.php"); class TestOfLogin extends WebTestCase { function TestOfLogin() { $this->WebTestCase("Login测试"); } function testLoginOk() { // 取得页面 $this->get("http://howgo.net/prettyface/login.php"); // 添加测试表项 $this->setField("name","Easy"); $this->setField("pass","******"); // 提交 $this->clickSubmit("提交"); // 察看提交后返回页面是否正确 $this->assertWantedPattern("/成功登录/"); // 点击页面链接 $this->clickLink("点击这里进入管理页面"); // 察看指定页面标题和关键内容 $this->assertTitle("ADMINCP"); $this->assertWantedPattern("/请选择要进行的任务/"); // 退出登陆 $this->clickLink("退出管理"); $this->clickLink } }
总结:以上就是本篇文的全部内容,希望能对大家的学习有所帮助。
相关推荐:
以上是PHP腳本的測試方法及實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

在PHP中,trait適用於需要方法復用但不適合使用繼承的情況。 1)trait允許在類中復用方法,避免多重繼承複雜性。 2)使用trait時需注意方法衝突,可通過insteadof和as關鍵字解決。 3)應避免過度使用trait,保持其單一職責,以優化性能和提高代碼可維護性。

依賴注入容器(DIC)是一種管理和提供對象依賴關係的工具,用於PHP項目中。 DIC的主要好處包括:1.解耦,使組件獨立,代碼易維護和測試;2.靈活性,易替換或修改依賴關係;3.可測試性,方便注入mock對象進行單元測試。

SplFixedArray在PHP中是一種固定大小的數組,適用於需要高性能和低內存使用量的場景。 1)它在創建時需指定大小,避免動態調整帶來的開銷。 2)基於C語言數組,直接操作內存,訪問速度快。 3)適合大規模數據處理和內存敏感環境,但需謹慎使用,因其大小固定。

PHP通過$\_FILES變量處理文件上傳,確保安全性的方法包括:1.檢查上傳錯誤,2.驗證文件類型和大小,3.防止文件覆蓋,4.移動文件到永久存儲位置。

JavaScript中處理空值可以使用NullCoalescingOperator(??)和NullCoalescingAssignmentOperator(??=)。 1.??返回第一個非null或非undefined的操作數。 2.??=將變量賦值為右操作數的值,但前提是該變量為null或undefined。這些操作符簡化了代碼邏輯,提高了可讀性和性能。

CSP重要因為它能防範XSS攻擊和限制資源加載,提升網站安全性。 1.CSP是HTTP響應頭的一部分,通過嚴格策略限制惡意行為。 2.基本用法是只允許從同源加載資源。 3.高級用法可設置更細粒度的策略,如允許特定域名加載腳本和样式。 4.使用Content-Security-Policy-Report-Only頭部可調試和優化CSP策略。

HTTP請求方法包括GET、POST、PUT和DELETE,分別用於獲取、提交、更新和刪除資源。 1.GET方法用於獲取資源,適用於讀取操作。 2.POST方法用於提交數據,常用於創建新資源。 3.PUT方法用於更新資源,適用於完整更新。 4.DELETE方法用於刪除資源,適用於刪除操作。

HTTPS是一種在HTTP基礎上增加安全層的協議,主要通過加密數據保護用戶隱私和數據安全。其工作原理包括TLS握手、證書驗證和加密通信。實現HTTPS時需注意證書管理、性能影響和混合內容問題。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

記事本++7.3.1
好用且免費的程式碼編輯器

Dreamweaver CS6
視覺化網頁開發工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

SublimeText3漢化版
中文版,非常好用