對整個 PHP 應用程序進行測試的下一個步驟是對前端的超文本標記語言(HTML)界面進行測試。要進行這種測試,我們需要一個如下所示的 Web 頁面。
圖 1. 測試 Web 頁面

這個頁面對兩個數字進行求和。為了對這個頁面進行測試,我們首先從單元測試代碼開始入手。
清單 10. TestPage.php
<?phprequire_once 'HTTP/Client.php';require_once 'PHPUnit2/Framework/TestCase.php';class TestPage extends PHPUnit2_Framework_TestCase{ function get_page( $url ) { $client = new HTTP_Client(); $client->get( $url ); $resp = $client->currentResponse(); return $resp['body']; } function test_get() { $page = TestPage::get_page( 'http://localhost/unit/add.php' ); $this->assertTrue( strlen( $page ) > 0 ); $this->assertTrue( preg_match( '/<html>/', $page ) == 1 ); } function test_add() { $page = TestPage::get_page( 'http://localhost/unit/add.php?a=10&b=20' ); $this->assertTrue( strlen( $page ) > 0 ); $this->assertTrue( preg_match( '/<html>/', $page ) == 1 ); preg_match( '/<span id="result">(.*?)<\/span>/', $page, $out ); $this->assertTrue( $out[1]=='30' ); }}?> |
這個測試使用了 PEAR 提供的 HTTP Client 模塊。我發現它比內嵌的 PHP Client URL Library(CURL)更簡單一點兒,不過也可以使用后者。
有一個測試會檢查所返回的頁面,并判斷這個頁面是否包含 HTML。第二個測試會通過將值放到請求的 URL 中來請求計算 10 和 20 的和,然后檢查返回的頁面中的結果。
這個頁面的代碼如下所示。
清單 11. TestPage.php
<html><body><form><input type="text" name="a" value="<?php echo($_REQUEST['a']); ?>" /> +<input type="text" name="b" value="<?php echo($_REQUEST['b']); ?>" /> =<span id="result"><?php echo($_REQUEST['a']+$_REQUEST['b']); ?></span><br/><input type="submit" value="Add" /></form></body></html> |
這個頁面相當簡單。兩個輸入域顯示了請求中提供的當前值。結果 span 顯示了這兩個值的和。 標記標出了所有區別:它對于用戶來說是不可見的,但是對于單元測試來說卻是可見的。因此單元測試并不需要復雜的邏輯來找到這個值。相反,它會檢索一個特定 標記的值。這樣當界面發生變化時,只要 span 存在,測試就可以通過。
與前面一樣,首先編寫測試用例,然后創建一個失敗版本的頁面。我們對失敗情況進行測試,然后修改頁面的內容使其可以工作。結果如下:
清單 12. 測試失敗情況,然后修改頁面
% phpunit TestPage.phpPHPUnit 2.2.1 by Sebastian Bergmann...Time: 0.25711488723755OK (2 tests)% |
這兩個測試都可以通過,這就意味著測試代碼可以正常工作。
不過對 HTML 前端的測試有一個缺陷:JavaScript。超文本傳輸協議(HTTP)客戶機代碼對頁面進行檢索,但是卻沒有執行 JavaScript。因此如果我們在 JavaScript 中有很多代碼,就必須創建用戶代理級的單元測試。我發現實現這種功能的最佳方法是使用 Microsoft® Internet Explorer® 內嵌的自動化層功能。通過使用 PHP 編寫的 Microsoft Windows® 腳本,可以使用組件對象模型(COM)接口來控制 Internet Explorer,讓它在頁面之間進行導航,然后使用文檔對象模型(DOM)方法在執行特定用戶操作之后查找頁面中的元素。
這是我了解的對前端 JavaScript 代碼進行單元測試的惟一一種方法。我承認它并不容易編寫和維護,這些測試即使在對頁面稍微進行改動時也很容易遭到破壞。
編寫哪些測試以及如何編寫這些測試
在編寫測試時,我喜歡覆蓋以下情況:
文章來源于領測軟件測試網 http://www.anti-gravitydesign.com/