利用單元測試對PHP代碼進行檢查_PHP教程

來源:互聯網
上載者:User

  測試驅動的開發和單元測試是確保代碼在經過修改和重大調整之後依然能如我們期望的一樣工作的最新方法。在本文中,您將學習到如何在模組、資料庫和使用者介面(UI)層對自己的 PHP 代碼進行單元測試。

  現在是淩晨 3 點。我們怎樣才能知道自己的代碼依然在工作呢?

  Web 應用程式是 24x7 不間斷啟動並執行,因此我的程式是否還在運行這個問題會在晚上一直困擾我。單元測試已經幫我對自己的代碼建立了足夠的信心 —— 這樣我就可以安穩地睡個好覺了。

  單元測試 是一個為代碼編寫測試案例並自動運行這些測試的架構。測試驅動的開發是一種單元測試方法,其思想是應該首先編寫測試程式,並驗證這些測試可以發現錯誤,然後才開始編寫需要通過這些測試的代碼。當所有測試都通過時,我們開發的特性也就完成了。這些單元測試的價值是我們可以隨時運行它們 —— 在簽入代碼之前,重大修改之後,或者部署到正在啟動並執行系統之後都可以。

  PHP 單元測試

  對於 PHP 來說,單元測試架構是 PHPUnit2。可以使用 PEAR 命令列作為一個 PEAR 模組來安裝這個系統:% pear install PHPUnit2。

  在安裝這個架構之後,可以通過建立派生於 PHPUnit2_Framework_TestCase 的測試類別來編寫單元測試。

  模組單元測試

  我發現開始單元測試最好的地方是在應用程式的商務邏輯模組中。我使用了一個簡單的例子:這是一個對兩個數字進行求和的函數。為了開始測試,我們首先編寫測試案例,如下所示。

  清單 1. TestAdd.php

  assertTrue( add( 1, 2 ) == 3 ); } function test2() { $this->assertTrue( add( 1, 1 ) == 2 ); }}?>

  這個 TestAdd 類有兩個方法,都使用了 test 首碼。每個方法都定義了一個測試,這個測試可以與清單 1 一樣簡單,也可以十分複雜。在本例中,我們在第一個測試中只是簡單地斷定 1 加 2 等於 3,在第二個測試中是 1 加 1 等於 2。

  PHPUnit2 系統定義了 assertTrue() 方法,它用來測試參數中包含的條件值是否為真。然後,我們又編寫了 Add.php 模組,最初讓它產生錯誤的結果。

  清單 2. Add.php

  

  現在運行單元測試時,這兩個測試都會失敗。

  清單 3. 測試失敗

  % phpunit TestAdd.phpPHPUnit 2.2.1 by Sebastian Bergmann.FFTime: 0.0031270980834961There were 2 failures:1) test1(TestAdd)2) test2(TestAdd)FAILURES!!!Tests run: 2, Failures: 2, Errors: 0, Incomplete Tests: 0.

  現在我知道這兩個測試都可以正常工作了。因此,可以修改 add() 函數來真正地做實際的事情了。

  現在這兩個測試都可以通過了。

  

  清單 4. 測試通過

  % phpunit TestAdd.phpPHPUnit 2.2.1 by Sebastian Bergmann...Time: 0.0023679733276367OK (2 tests)%

  儘管這個測試驅動開發的例子非常簡單,但是我們可以從中體會到它的思想。我們首先建立了測試案例,並且有足夠多的代碼讓這個測試回合起來,不過結果是錯誤的。然後我們驗證測試的確是失敗的,接著實現了實際的代碼使這個測試能夠通過。

  我發現在實現代碼時我會一直不斷地添加代碼,直到擁有一個覆蓋所有代碼路徑的完整測試為止。在本文的最後,您會看到有關編寫什麼測試和如何編寫這些測試的一些建議。

  資料庫測試

  在進行模組測試之後,就可以進行資料庫訪問測試了。資料庫訪問測試帶來了兩個有趣的問題。首先,我們必須在每次測試之前將資料庫恢複到某個已知點。其次,要注意這種恢複可能會對現有資料庫造成破壞,因此我們必須對非生產資料庫進行測試,或者在編寫測試案例時注意不能影響現有資料庫的內容。

  資料庫的單元測試是從資料庫開始的。為了闡述這個問題,我們需要使用下面的簡單模式。

  清單 5. Schema.sql

  DROP TABLE IF EXISTS authors;CREATE TABLE authors ( id MEDIUMINT NOT NULL AUTO_INCREMENT, name TEXT NOT NULL, PRIMARY KEY ( id ));

  清單 5 是一個 authors 表,每條記錄都有一個相關的 ID。

  接下來,就可以編寫測試案例了。

  清單 6. TestAuthors.php

  assertTrue( Authors::delete_all() ); } function test_insert() { $this->assertTrue( Authors::delete_all() ); $this->assertTrue( Authors::insert( Jack ) ); } function test_insert_and_get() { $this->assertTrue( Authors::delete_all() ); $this->assertTrue( Authors::insert( Jack ) ); $this->assertTrue( Authors::insert( Joe ) ); $found = Authors::get_all(); $this->assertTrue( $found != null ); $this->assertTrue( count( $found ) == 2 ); }}?>

  這組測試覆蓋了從表中刪除作者、向表中插入作者以及在驗證作者是否存在的同時插入作者等功能。這是一個累加的測試,我發現對於尋找錯誤來說這非常有用。觀察一下哪些測試可以正常工作,而哪些測試不能正常工作,就可以快速地找出哪些地方出錯了,然後就可以進一步理解它們之間的區別。

  最初產生失敗的 dblib.php PHP 資料庫存取碼版本如下所示。

  清單 7. dblib.php

  getMessage()); } return $db; } public static function delete_all() { return false; } public static function insert( $name ) { return false; } public static function get_all() { return null; }}?>

  對清單 8 中的代碼執行單元測試會顯示這 3 個測試全部失敗了:

  清單 8. dblib.php

  % phpunit TestAuthors.phpPHPUnit 2.2.1 by Sebastian Bergmann.FFFTime: 0.007500171661377There were 3 failures:1) test_delete_all(TestAuthors)2) test_insert(TestAuthors)3) test_insert_and_get(TestAuthors)FAILURES!!!Tests run: 3, Failures: 3, Errors: 0, Incomplete Tests: 0.%

  現在我們可以開始添加正確訪問資料庫的代碼 —— 一個方法一個方法地添加 —— 直到所有這 3 個測試都可以通過。最終版本的 dblib.php 代碼如下所示。

  清單 9. 完整的 dblib.php

  getMessage()); } return $db; } public static function delete_all() { $db = Authors::get_db(); $sth = $db->prepare( DELETE FROM authors ); $db->execute( $sth ); return true; } public static function insert( $name ) { $db = Authors::get_db(); $sth = $db->prepare( INSERT INTO authors VALUES (null,?) ); $db->execute( $sth, array( $name ) ); return true; } public static function get_all() { $db = Authors::get_db(); $res = $db->query( "SELECT * FROM authors" ); $rows = array(); while( $res->fetchInto( $row ) ) { $rows []= $row; } return $rows; }}?>

  HTML 測試

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


  清單 10. TestPage.php

  get( $url ); $resp = $clie

http://www.bkjia.com/PHPjc/486600.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/486600.htmlTechArticle測試驅動的開發和單元測試是確保代碼在經過修改和重大調整之後依然能如我們期望的一樣工作的最新方法。在本文中,您將學習到如何在...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.