PHP 行為測試工具 Codeception (介紹)


原文地址:https://phphub.org/topics/25

Codeception 簡介

Codeception 簡單來說, 分為以下幾種測試

  • Acceptance Tests 驗收測試
  • Functional Tests 功能測試
  • Unit Tests 單元測試

接下來我們來一一介紹每一種測試的優缺點.

Acceptance Tests 驗收測試

我們先設想這樣一個場景:當技術人員開發完畢, 其客戶, 產品經理, 或者是測試人員, 他們怎么確定產品的可用性? 一般情況下, 他們都是執行以下幾個步驟進行測試:

  • 打開瀏覽器;
  • 輸入 url;
  • 看到一些信息, 並確定了這個頁面是可用的;
  • 點擊某個 url;
  • 填寫表單, 並提交表單, 看到了某些信息, 並確定此功能是可用的

這種測試方式我們稱之為 手動測試, 或 人工測試, 與其相反的是 自動化測試, Codeception 的 Acceptance Tests 會利用瀏覽器的編程接口, 做到以上的 人工測試 涉及到的步驟完全自動化, 大大節省了人工成本.

先貼代碼

<?php
$I = new AcceptanceTester($scenario);
$I->amOnPage('/');
$I->click('Sign Up');
$I->submitForm('#signup', array('username' => 'MilesDavis', 'email' => 'miles@davis.com'));
$I->see('Thank you for Signing Up!');

優點

  • 可用來測試任何網站;
  • 完全基於瀏覽器, 可以測試 Javascript 甚至是 ajax 請求;
  • 可以把運行狀態給 產品經理 或者 客戶看, 讓人信服;
  • 不需要多余的配置, 對 App 源碼修改要求最少, 代碼適應性好, 可以當成整個應用來測試, 不在乎內部實現.

缺點

  • 測試速度緩慢, 因為需要運行在瀏覽器和真實的數據庫上;
  • 相比單元測試, 做不到完全的測試, 有些細微的邏輯可能會錯過;
  • 在運行的時候有時候會發生不可控的事情, 因為瀏覽器的渲染, javascript 的運行, 有時候會有意想不到的情況發生.
  • 再一次強調, 此測試會非常慢;

Functional Tests 功能測試

功能測試模擬一個 web 請求 (模擬 $_GET 和 $_POST 等變量), 發送給 App, 應用返回 HTML 結果, 在測試的過程中, 可以分析並進行 assert 判定返回的數據, 甚至可以檢查數據是否正常的存儲到數據庫.

函數測試需要有一個測試環境, 幾個有名的框架, 像 Laravel 就有現成的 Package 可以用來集成.

以下是一個簡單的功能測試:

<?php
$I = new FunctionalTester($scenario);
$I->amOnPage('/');
$I->click('Sign Up');
$I->submitForm('#signup', array('username' => 'MilesDavis', 'email' => 'miles@davis.com'));
$I->see('Thank you for Signing Up!');
$I->seeEmailSent('miles@davis.com', 'Thank you for registration');
$I->seeInDatabase('users', array('email' => 'miles@davis.com'));

可以看出跟 Acceptance Tests 驗收測試 語法類似, 因為集成了測試環境, 允許檢查 email 和 數據庫.

優點

  • 跟 Acceptance tests 類似, 但是少了打開瀏覽器來渲染, 速度快多了;
  • 能提供更詳細的分析, 如數據庫或者 email;
  • 可讀性很強, 雖然沒法讓測試人員看到打開瀏覽器模擬人工測試, 但是還是可以讓別人信服;
  • 比較穩定, 只有當大規模的代碼變更, 或者把代碼從一個框架轉移到另一個框架的時候, 才會有影響.

缺點

  • 無法測試 javascript 和 ajax;
  • 因為使用代碼相對簡單的模擬一個瀏覽器請求, 測試的可行度, 或者說完整性, 會相對較差;
  • 需要一個框架的支持;

Unit Tests 單元測試

單元測試(又稱為模塊測試, Unit Testing)是針對程序模塊(軟件設計的最小單位)來進行正確性檢驗的測試工作, 當 functional 或者 acceptance 測試都檢查不到 最小單位 的邏輯時, 還能通過 單元測試 確認深藏在代碼里面的某些功能仍然可用, 單元測試能消除程序單元的不可靠性.

Codeception 的單元測試功能是基於 PHPUnit 之上的, 你可以照樣寫 PHPUnit 的測試代碼, Codeception 一樣能運行.

Codeception 在 PHPUnit 的基礎上提供了一系列工具能讓單元測試更加簡單, 代碼可讀性更高. 單元測試是最復雜最繁瑣的測試, 並且是會跟着業務邏輯代碼的改變而改變, 在實際開發中技術人員會經常因為需求、業務的變更而修改單元測試, 提高其可讀性和易用性可以幫助相關人員更加快速的跟上一切變化.

以下是一個簡單的 integration test (集成測試)

<?php
function testSavingUser()
{
    $user = new User();
    $user->setName('Miles');
    $user->setSurname('Davis');
    $user->save();
    $this->assertEquals('Miles Davis', $user->getFullName());
    $this->unitTester->seeInDatabase('users',array('name' => 'Miles', 'surname' => 'Davis'));
}

優點

  • 最快的測試, 當然, 在上面的示例代碼中, 觸碰到了數據庫, 還是有點延遲;
  • 能把測試覆蓋到特別刁鑽的程序邏輯上, 這是 functional 或者 acceptance 所做不到的;
  • 允許你測試最核心代碼, 確定核心代碼的健壯性;
  • 寫單元測試的程序要都是好程序員 。

缺點

  • 因為是單元測試, 會把代碼分為多個小單元單獨測試, 但是各個單元之間的對接測試不到;
  • 對代碼的修改非常敏感, 很多項目的 test 最后沒用上就是因為測試跟不上業務邏輯代碼的修改.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM