原文地址: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 最后沒用上就是因為測試跟不上業務邏輯代碼的修改.