iT邦幫忙

2022 iThome 鐵人賽

0
自我挑戰組

laravel+vue 學習系列 第 32

Day 32. HTTP Tests

  • 分享至 

  • xImage
  •  

一、建立測試環境

  1. 可以建立 .env.testing 檔案, 區隔正式與測試設定
    • 在測試時預設會先讀取 .env.testing 測試環境變數設定, 若無才會去找 .env 正式環境變數
  2. 新建測試檔案
    • artisan 命令建立檔案
        # 預設會建立在 test/Feature 資料夾下        
        php artisan make:test ProductTest
    
        # 加入參數 --unit 會產 test/Unit 目錄下
        php artisan make:test ProductUnitTest
    
  3. 執行 test 命令
    • 可以使用 artisan 命令和 vendor/bin/phpunit 下的 bat 檔案執行測試
        php artisan test
        # 後面參數除了 artisan 提供的, 也可以接 phpunit 參數設定
        php artisan test --stop-on-failure
    
    https://ithelp.ithome.com.tw/upload/images/20221010/20128127QahOTT5bjX.png

二、HTTP 請求方法

  1. 在建立的 test Class 下可以使用 $this 內的請求方法, 有 get, post, put, patch 和 delete, 對應到 HTTP Method

  2. 在發出請求後會回傳 Illuminate\Testing\TestResponse 實例, 可以提供 assert(斷言) 方法來幫助驗證請求結果

        public function test_get_product_admin()
        {
            // 使用 get 方法請求 adm 商品列表頁
            $response = $this->get('/adm/product/index');
    
            // adm 需要登入所以會跳轉到 login 頁面, 回傳 http code 302 (重新導向) 狀態碼
            // 可以添加特徵 WithoutMiddleware 來忽略登入流程, 此時會回傳 http code 200
            $response->assertStatus(302);
        }
    
  3. 在請求中添加 header

    • 使用 withHeaders 添加 header
        // 給予自訂 header
        $response = $this->withHeaders([
            'X-Header-Only' => 'ProductName'
        ])->get('/adm/product/index');
    
  4. 在請求中添加 Cookie

    • 使用 withCookie 方法添加 cookie
        public function test_get_product_admin()
        {
            // 給予 cookie 內容
            $response = $this->withCookie([
                'user_style' => 'black'
            ])->get('/adm/product/index');
    
            $response->assertStatus(200);
        }
    
  5. 在請求中添加 Session

    • 使用 withSession 方法添加 session
        public function test_get_product_admin()
        {        
            // 給予 session 內容
            $response = $this->withSession([
                'user_style' => 'black'
            ])->get('/adm/product/index');
    
            $response->assertStatus(200);
        }
    
  6. 設定當下使用者

    • 使用 actingAs 方法添加目前使用者
        public function test_get_product_admin()
        {
            // 取得使用者資料
            $user = User::findOrFail(5);
            // 再請求時提供使用者進行測試(像是模擬已登入狀態)
            $response = $this->actingAs($user)->withHeaders([
                'X-Header' => 'Value'
            ])->get('/adm/product/index');
    
            $response->assertStatus(200);
        }
    
  7. API json 請求

    • test 有提供 json, getJson, postJson, putJson, patchJson, deleteJson 和 optionsJson 方法, 可以發出 json 請求
        public function test_get_menu()
        {
            // 發出請求取回選單內容
            $response = $this->getJson('api/menu');
    
            // 判斷回傳的 json 結構中是否有 data 欄位
            // 還有其他 assertJson{*} 的 assert 方法可以判斷回傳路徑、資料內容等 ...
            $response->assertStatus(200)->assertJsonStructure(['data']);
        }
    

    https://ithelp.ithome.com.tw/upload/images/20221010/20128127KWxznIaCyZ.png

    • 使用 closure 來驗證回傳內容
        public function test_example()
        {
            $response = $this->get('api/front/5');
            // 印出回傳內容
            $response->dump();
            // 使用 closure 驗證 json 內的資料
            $response->assertJson(fn (AssertableJson $json) => 
                $json->where('data.title', '1235')
                ->where('data.category', '食品')
                ->etc()
            );
        }
    

    https://ithelp.ithome.com.tw/upload/images/20221010/20128127OTMSv57SL0.png

    • has 和 missing 相關方法, 驗證是否有存在的欄位
    
        $response->assertJson(fn (AssertableJson $json) => 
            $json->has('data') // 檢查是否有 data 欄位
            ->missing('error') // 檢查是否沒有 error 欄位
        );
    
        $response->assertJson(fn (AssertableJson $json) => 
            $json->hasAll(['data', 'status', 'message']) // 檢查是否包含多個欄位
            ->missingAll(['error', 'error_code]) // 檢查是否沒有多個欄位
        );
    
        $response->assertJson(fn (AssertableJson $json) => 
            $json->hasAny(['data', 'status', 'message']) // 檢查多個欄位是否包含其中一個以上
        );
    
    • 測試 collection
        $response->assertJson(fn (AssertableJson $json) => 
            $json->has(3) // 顯查回傳數量
                ->first(fn($json) => // 檢查第一筆資料
                    $json->hasAll(['data', 'status', 'message']) // 檢查是否包含多個欄位
                    ->missingAll(['error', 'error_code]) // 檢查是否沒有多個欄位
                )
        );
    
        // 使用 . 來取得第幾筆資料
        $response->assertJson(fn (AssertableJson $json) => 
            $json->has(3) // 顯查回傳數量
                ->has('data.0', fn($json) => // 檢查第一筆資料
                    $json->hasAll(['data', 'status', 'message']) // 檢查是否包含多個欄位
                    ->missingAll(['error', 'error_code]) // 檢查是否沒有多個欄位
                )
        );
    
    • 檢查回傳欄位類型
        $response->assertJson(fn (AssertableJson $json) =>
            $json->whereType('product_name', 'string') // 檢查是否文文字
                 ->whereType('pid', ['string', 'integer']) // 檢查是否為文字或是數字
        );
    

上一篇
Day 31. Laravel Validation
系列文
laravel+vue 學習32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言