# laravel test(測試) 基礎教學 https://laracasts.com/series/laravel-from-scratch-2018/episodes/37 https://www.kancloud.cn/curder/laravel/408495 https://hackmd.io/@javck/ByJgF8HRP/%2FVPV2zmfzRgKoU0elUWlBdQ 還未看 之後要先看 https://laracasts.com/series/php-testing-jargon https://www.youtube.com/watch?v=DRhhfy2sG1E ## 主要介紹 Laravel 預設就支持用 PHPUnit 來做測試,並為你的應用配置好了 phpunit.xml 檔案。框架還提供了一些便利的幫助函數來讓你更直觀的測試你的應用 預設情況下,應用的 tests 目錄中包含兩個子目錄:Feature 和 Unit ## Unit 單元測試(Unit Tests)是針對你的程式碼中非常少,而且相對獨立的部分來進行的測試。實際上,大部分單元測試都是針對單個方法進行的。單元測試不會啟動你的應用因此無法取用應用資料庫或框架的服務 ## Feature 功能測試(Feature Tests)則是針對大部分的程式碼進行的測試,包括多個物件之間的交互,甚至是對 JSON 端點的完整 HTTP 請求等等。總的來說,你大部分的測試都應該是功能測試,這些測試能讓你確保你的系統能夠正常運作 ## 環境 在使用 phpunit 進行測試時,Laravel 將根據 phpunit.xml 文件設定的環境變數自動將環境設置為 testing,並將 Session 及緩存以 array 的驅動形式來保存,也就是說在測試時不會持久保存任何 Session 或緩存資料 你可以隨意創建其它必要的測試環境配置。testing 環境變數可以在 phpunit.xml 文件中修改,但是在運行測試之前,請確保使用以下命令來清除配置的緩存! `php artisan config:clear` .env.testing 檔案 此外,你還可以在你的專案根目錄下創建一個 .env.testing 檔案,在運行單元測試或使用帶有 --env=testing 選項的 Artisan 命令時, .env 文件中的變數將會被這個文件覆蓋 ## 瀏覽器模擬測試 https://hackmd.io/@javck/ByJgF8HRP/%2F3AU4Wg7dS2Op6SRYv5Ht_A Laravel Dusk Laravel Dusk 提供了直覺、簡單易用的瀏覽器自動化及測試 API 。預設情況下,Dusk 不需要在你的機器上安裝 JDK 或者 Selenium 。而是需要使用單獨的 ChromeDriver 進行安裝。當然,你也可以自由使用其他的兼容 Selenium 的驅動 ## 測試有權限有效 token創建資源 Passport 套件有一個方法讓我們可以模擬權限 **Passport 的actingAs方法可用於指定當前經過身份驗證的用戶及其範圍。給該actingAs方法的第一個參數是用戶實例,第二個參數是應授予用戶令牌的範圍數組:** ``` use App\Models\User; use Laravel\Passport\Passport; public function test_servers_can_be_created() { Passport::actingAs( User::factory()->create(), ['create-servers'] ); $response = $this->post('/api/create-server'); $response->assertStatus(201); } ``` 在第二參數可用 ['*'] 比較快 **actingAs 和 actingAsClient差別** 一個是客戶,一個是客戶端,詳細的不清楚,但看到用到AS的 ## 使用 指令可以這樣下 ![](https://i.imgur.com/kvJ8l6I.png) 簡化 直接test ## pefreshDataBase 每次都還原 測試完data還原 ## 已登入註冊 利用 actingAs() 這個函式,我們就可以在測試時模擬為 $user 這個使用者, ![](https://i.imgur.com/Ktx4wIC.png) ## http ![](https://i.imgur.com/bkt6fe4.png) 重點在他不用傳user_id 你想看看 在controller你會 傳過來user_id嗎 ## 判斷資料庫有沒有 assertDatabaseHas ![](https://i.imgur.com/MVsKVQH.png) ## 抓錯誤 $this->withourExceptionHandling ![](https://i.imgur.com/fua2AF3.png) 把它放在你的測試方法的頂部: $this->withoutExceptionHandling(); 您不需要為此創建一個方法,它包含在 laravel 的“InteractsWithExceptionHandling”特性中,該特性由您應該從測試擴展的抽象 TestCase 使用。 這樣就能知道錯誤了 ## http 回應相關 assert ![](https://i.imgur.com/LpsIl8x.png) assertRedirect('login') 或 ``` $response ->assertStatus(201) ->assertJson([ 'created' => true, ]); ``` ## api resource 測試 https://www.youtube.com/watch?v=sFrU_89UQbM 可以用getData轉成json 因為這是個class 是個物件 平常是array 才能toJson ![](https://i.imgur.com/rxV5HtU.png) ## 身分驗證 https://www.youtube.com/watch?v=GQz67Lcvvoc ###### tags: `Laravel`