100% 的測試覆蓋率,需要花費在測試代碼上的工時,絲毫不亞于業(yè)務代碼的開發(fā)時間。
如開發(fā) Deadline 不允許,做不到 100% 測試覆蓋率,應該考慮對程序入口進行測試。這種方式的時間利用比最高。
Laravel 項目中程序入口,一般有以下四種:
對這些入口進行 100% 的測試覆蓋,可以很大范圍內(nèi)測試到項目代碼。
編寫測試時,必須永遠把執(zhí)行速度放在首位。
所有的單元測試,都必須放置于 tests/Unit
目錄下。且必須使用子目錄存儲,絕不直接放置于此目錄下。
所有的集成測試,都必須放置于 tests/Feature
目錄下。且必須使用子目錄存儲,絕不直接放置于此目錄下。
常見的子目錄按照入口,應該劃分如下:
├── API
├── Web
├── Admin
├── Command
└── Job
測試中使用到樣例數(shù)據(jù),必須放置于 tests/Fixtures
目錄中。且必須使用子目錄存儲,絕不直接放置于此目錄下。
測試代碼必須在開發(fā)同事的機器上能運行,測試必須在 Beta 環(huán)境下能運行。
所有的測試,都 必須 支持并發(fā)測試,這樣可以極大節(jié)省 CI 中測試運行的時間,提高整個工作流的速度。
每次提交代碼前,使用以下命令跑一下不報錯即可:
php artisan test -p
支持并發(fā)測試:
composer require brianium/paratest
寫 Feature Test 的時候,必須使用用例測試(User Story),而不是代碼測試。
?代碼測試的例子:
// tests/Feature/API/V1/UserAddressControllerTest.php
class UserAddressControllerTest extends APITest
{
public function test_controller_index_method()
{
}
public function test_controller_create_method()
{
}
}
? 用例測試:
// tests/Feature/API/V1/UserAddressControllerTest.php
class UserAddressControllerTest extends APITest
{
public function test_user_can_view_user_address_index()
{
}
public function test_guest_can_not_create_user_address()
{
}
public function test_user_can_create_user_address()
{
}
}
程序中經(jīng)常會使用第三方服務,例如發(fā)送郵件使用 SendCloud 的 API 、或發(fā)送短信 API。
將這些服務 API 調(diào)用封裝到 Service 層,編寫測試代碼時,對其進行 Mock 。
建議:檢測測試代碼是否使用第三方服務,最好的方法就是把 Wifi 關掉,然后跑一遍測試。如果有錯誤發(fā)生,證明調(diào)用了第三方 API。
更多建議: