iT邦幫忙

2022 iThome 鐵人賽

DAY 11
0
自我挑戰組

laravel+vue 學習系列 第 11

Day11. 測試

  • 分享至 

  • xImage
  •  

一、測試名詞

  • 單元測試
    • 對於單一類別或方法進行測試
  • 功能測試
    • 對多個類別或方法間的互動進行測試
  • 應用測試
    • 測試整個應用 app
    • 通常會用 HTTP 呼叫到接受回應
  • 回歸測試
    • e.g. 模擬使用者在表單上操作,並得到回應頁面

二、兩個主要檔案

  • 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」 代表測試時有出現錯誤
    https://ithelp.ithome.com.tw/upload/images/20220916/20128127ePnqFiV5np.png
  • 當在測試時有用到 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 檔案來提供測試環境下的變數

上一篇
Day10. Laravel 請求生命週期
下一篇
Day12. 容器 Container
系列文
laravel+vue 學習32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言