首頁  >  文章  >  後端開發  >  PHP腳本的測試方法及實例

PHP腳本的測試方法及實例

墨辰丷
墨辰丷原創
2018-06-07 17:26:404303瀏覽

本篇主要介紹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()或以aa9b57d059c03606273b654cfceb5dceheader()。

具體程式碼

這就是我們要測試的事務腳本對象,具體到腳本中,我們還需要封裝:

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实现获取上月、本月、近15天、近30天的方法

PHP+Ajax实现的无刷新分页功能的方法

PHP 实现返回数组后的处理方法

以上是PHP腳本的測試方法及實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn