国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > PHP > 正文

舉例詳解PHP腳本的測(cè)試方法

2020-03-22 20:03:27
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
一、常用測(cè)試示例我們經(jīng)常會(huì)遇到這種情況:將一些沒(méi)有經(jīng)過(guò)任何測(cè)試的遺留代碼進(jìn)行重新編寫測(cè)試,甚至這些代碼還是用html' target='_blank'>面向?qū)ο?/u>寫的。要對(duì)這樣的代碼進(jìn)行測(cè)試,我的建議是把代碼分解成塊,這樣就容易測(cè)試了。然而,這些遺留代碼并不是那么好重構(gòu)的,比如:測(cè)試前,你不能在把代碼重新編寫,這是為了避免影響原有程序,當(dāng)然也不好進(jìn)行單元測(cè)試。在PHP程序中,通常有一部分代碼是寫在幾個(gè)index.php和script.php文件中的,這些.php文件存放在幾個(gè)不同的文件夾里。如果不找到它們的入口點(diǎn),是無(wú)法直接由Web服務(wù)器訪問(wèn)的。測(cè)試副本要測(cè)試一個(gè)PHP腳本,我們需要模擬一個(gè)HTTP請(qǐng)求,并檢查返回的響應(yīng)(response)是否等于預(yù)期值。這里需要注意的是模擬一個(gè)請(qǐng)求,要定義response和request,這不僅僅是內(nèi)容(content)的不同,而且他們的頭信息(header)也是不同的。此外,如果我們想要測(cè)試一個(gè)操作數(shù)據(jù)的事務(wù)腳本,我們要確保不讓它去連接真正的數(shù)據(jù)庫(kù)應(yīng)用程序的其余部分。在現(xiàn)實(shí)中,通常沒(méi)有人會(huì)直接拿原有的PHP腳本進(jìn)行重寫測(cè)試。因?yàn)榕掳汛a弄得不可恢復(fù)。我建議使用PHP腳本的副本,這樣我們就可以將PHP代碼進(jìn)行一些小手術(shù)了。如何將代碼進(jìn)行最小修改:刪除include和require語(yǔ)句(如果它們沒(méi)有被用到),并且修改內(nèi)部函數(shù)的調(diào)用方式,例如:將header()寫成$object- header()。最后,我們來(lái)測(cè)試這個(gè)事務(wù)腳本。測(cè)試完后,我們可以從副本腳本中提取出它們,并把它們放入新腳本文件中。具體步驟一、模擬一個(gè)HTTP請(qǐng)求并重新定義變量$_GET和$_POST,還要修改$_SERVER的header。二、獲取請(qǐng)求響應(yīng),response的body可以通過(guò)ob_start()和ob_get_clean()捕獲,它可以收集每一個(gè)用echo()或以 php標(biāo)簽輸出的buffer(緩沖內(nèi)容)。注意:輸出緩沖支持在PHP多個(gè)級(jí)別的嵌套,所以在大多數(shù)情況下,都可以捕獲到,即使腳本在使用ob_*調(diào)用本身。三、測(cè)試腳本應(yīng)包含事務(wù)腳本的內(nèi)部方法,因此在這個(gè)腳本范圍內(nèi)的方法都可以被調(diào)用。例如:
1.腳本所需的變量可以被定義為局部變量封裝起來(lái),如$connection作為一個(gè)數(shù)據(jù)庫(kù)連接。
2.不是原本PHP的內(nèi)置函數(shù),應(yīng)該加上對(duì)象來(lái)調(diào)用,如:header()寫成$this- header()。具體代碼這就是我們要測(cè)試的事務(wù)腳本對(duì)象,具體到腳本中,我們還需要封裝:
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;這是我們的測(cè)試代碼: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']);測(cè)試副本只是暫時(shí)的!它讓我們編寫的測(cè)試不會(huì)改變。最終,我們要將已經(jīng)通過(guò)測(cè)試的PHP腳本進(jìn)行重構(gòu),以消除冗余代碼。當(dāng)我們的測(cè)試完成后,可以將handleRequest()的內(nèi)容替換成真正的邏輯代碼。假如你要寫很多這樣的測(cè)試腳本,你可以寫一個(gè)通用的測(cè)試對(duì)象,以滿足你的測(cè)試需要。

二、PHP開(kāi)發(fā)者的單元測(cè)試工具包在PHP領(lǐng)域,單元測(cè)試的工具主要有PHPUNIT,PHPUNIT2和SimpleTest三種。其中PHPUNIT在功能上很簡(jiǎn)單,不算完善;PHPUNIT2是專門為PHP5寫的單元測(cè)試工具,在結(jié)構(gòu)和功能上都向Junit看齊;而SimpleTest則是一套非常實(shí)用的測(cè)試工具,其中的webTest支持對(duì)web程序界面的測(cè)試,是Easy最為推薦的一款測(cè)試工具。在本文中,我們選擇SimpleTest進(jìn)行介紹。相關(guān)知識(shí):PHPUNIT2也是一款很好的工具,尤其是架構(gòu)上有很多值得圈點(diǎn)之處,希望將來(lái)能有機(jī)會(huì)在專門的文章中和大家分享。SimpleTest:就是這么Simple安裝SimpleTest很簡(jiǎn)單,上sf.net上下載一個(gè)源碼包,然后解壓到web目錄下就可以使用了,這里就不多說(shuō)。下面我們先來(lái)看個(gè)例子:編寫一個(gè)測(cè)試,檢查一個(gè)網(wǎng)站是否可以訪問(wèn)。首先我們引入要用到的文件:代碼列表:require_once("../simpletest/unit_tester.php");require_once("../simpletest/web_tester.php");require_once("../simpletest/reporter.php");然后我們創(chuàng)建一個(gè)測(cè)試類:代碼列表:class TestOfSite extends WebTestCase function TestOfSite() $this- WebTestCase("測(cè)試"); function testSite() $this- get("http://howgo.net/prettyface/display.php"); $this- assertTitle(".: facebook :.");首先我們擴(kuò)展了webTestCase類,這樣我們就可以自動(dòng)獲得測(cè)試web的能力,然后在構(gòu)造函數(shù)中我們直接使用基類的,只是把標(biāo)題傳給它。接著我們就該寫測(cè)試方法了,測(cè)試方法都是以‘test"開(kāi)頭的,用以識(shí)別在我們運(yùn)行測(cè)試的時(shí)候,類中哪些方法要進(jìn)行調(diào)用。而$this- get將取得網(wǎng)頁(yè)的內(nèi)容,我們指定它的標(biāo)題為 ".: facebook :.", 接著我們要做的就是實(shí)例化這個(gè)類的對(duì)象,并運(yùn)行它。代碼列表:$test = &new TestOfSite();$test- run(new HtmlReporter());下邊是運(yùn)行結(jié)果:如果測(cè)試出錯(cuò)則會(huì)出現(xiàn)下邊的界面:到這里一個(gè)簡(jiǎn)單的測(cè)試就算完成了。實(shí)戰(zhàn)演習(xí) – 一個(gè)Login測(cè)試下面我們進(jìn)入實(shí)戰(zhàn),在這個(gè)基礎(chǔ)上完成一個(gè)login的測(cè)試。這次我們先貼出完整的代碼:代碼列表: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測(cè)試"); function testLoginOk() // 取得頁(yè)面 $this- get("http://howgo.net/prettyface/login.php"); // 添加測(cè)試表項(xiàng) $this- setField("name","Easy"); $this- setField("pass","******"); // 提交 $this- clickSubmit("提交"); // 察看提交后返回頁(yè)面是否正確 $this- assertWantedPattern("/成功登錄/"); // 點(diǎn)擊頁(yè)面鏈接 $this- clickLink("點(diǎn)擊這里進(jìn)入管理頁(yè)面"); // 察看指定頁(yè)面標(biāo)題和關(guān)鍵內(nèi)容 $this- assertTitle("ADMINCP"); $this- assertWantedPattern("/請(qǐng)選擇要進(jìn)行的任務(wù)/"); // 退出登陸 $this- clickLink("退出管理"); $this- clickLink
PHP教程

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 遂昌县| 林口县| 大悟县| 丹巴县| 北票市| 娱乐| 达州市| 永登县| 临夏市| 遵义市| 临夏市| 财经| 七台河市| 彭州市| 玉树县| 清涧县| 天峻县| 和硕县| 柯坪县| 湛江市| 渑池县| 凌源市| 隆安县| 石楼县| 越西县| 鞍山市| 布拖县| 乡宁县| 禹城市| 波密县| 顺平县| 林州市| 资兴市| 洛隆县| 志丹县| 广河县| 平泉县| 黄浦区| 定安县| 乌审旗| 丰城市|