一、測試名詞
- 單元測試
- 功能測試
- 應用測試
- 測試整個應用 app
- 通常會用 HTTP 呼叫到接受回應
- 回歸測試
二、兩個主要檔案
- TestCase.php 測試得基礎 Class, 其他建立的測試檔案需繼承它
- CreatesApplication.php 為 Trait 提供給 TestCase.php 使用, 主要立啟用 bootstarp 建立 container
三、測試特徵
- RefreshDatabase
- 將所有測試資料庫執行一次 migration
- 在測試結束時回覆交易
- WithoutMiddleware
- 可以停用所有 Middlware, e.g. CSRF 保護、身分驗證等...
- DateabseMigrations
- 每次測試之前對資料庫執行 migration fresh
- DatabaseTransactions
四、測試 Class
- cmd 產生 Class 檔案, 預設會在 test/Unit 目錄下, 若要改成在 Feature 目錄下, 可添加旗標 --unit
php artisan make:test ProductTest --unit
- Laravel 的測試檔案會在 test 目錄下, 並以 Test 結尾, e.g. test/ProductTest.php
- class 內的方法須以 test 開頭, e.g. test_create_product()
- VScode 內安裝套件執行測試, 出現「.」時代表測試成功沒有錯誤, 出現 「F」 代表測試時有出現錯誤
- 當在測試時有用到 Models 物件建立資料時, 可以使用 make() 方法, 與 create() 差別在於 make() 會將新建的資料放在記憶體中, 當結束後會清除
- 驗證測試結果, 在 Laravel 會提供許多 PHPUnit 斷言, 來檢測測試結果是否正確
public function test_get_product_admin()
{
$response = $this->get('/adm/product/index');
$response->assertStatus(200);
}
-
測試範例
- 向 Laravel 發出 HTTP 請求( GET, POST ... 等 ), 對回傳結果下斷言檢測
public function test_update_product()
{
$response = $this->post(route('product.update'), [
'name' => 'new product name'
]);
# $response 物件有40多種斷言可以使用
# https://laravel.com/docs/9.x/http-tests#response-assertions
$response->assertStatus(200);
}
- 資料庫測試
- e.g. 想測試 product create 是否成功
public function test_create_product() {
$this->post(route('product.store'), [
'name' => 'mytest',
// ... product data
]);
$this->asserDatabaseHas('product', ['name' => 'mytest']);
}
五、測試環境
- Laravel 在執行時, 都會有一個當下環境, 代表目前應用 app 正在哪個環境下運行
- 可能的環境 local, staging, production 等
- 可以用 app()->environment()
- 一般在測試時不會讀取正式 .env 環境變數, 要另外再建立一個 .env.testing 檔案來提供測試環境下的變數