首頁>技術>

引言

程式設計師很難發現自己寫的bug,這是一條難破的檻。所以要寫測試,要讓自己的程式給別人測試, 思路不同,實現方法不同,才能發現業務邏輯中的不合理和bug。

laravel集成了PHPunit測試框架可方便書寫測試用例。本文就來個拋磚引玉式的簡介。

程式碼時間

laravel應用安裝完畢之後,在 vendor/bin/ 目錄內已經內建了 phpunit 檔案, 在windows平臺下,使用 phpunit.bat 檔案。

開啟命令列工具,進入到laravel工作根目錄,執行命令:

./vendor/bin/phpunit

預設應用只寫了兩個測試用例,所以輸出結果如下圖:

檔案上傳測試

我們先來模擬一個虛擬的檔案,執行表單檔案上傳功能。這裡構造檔案物件,使用 Symfony UploadedFile 物件, 下面的程式碼中,我們假設存在 storage/tests 目錄。該目錄下放置一個 for-tests.jpg 圖片檔案。

下面是一個測試方法:

我們首先構造了一個 UploadFile 物件,然後呼叫 post 方法訪問 upload-route, 並將上傳引數正確地填寫。最後驗證上傳是否成功。

很多時候測試路由要求必須有真是的檔案存在,比如對於使用者,我們要求其必須有一個頭像檔案。 laravel使用了Faker庫用於偽資料的生成,我們通過一個工廠方法,實現為每個使用者建立頭像的需求。

上述方法,從源目錄內隨機地獲取一張圖片,並拷貝到目標路徑,並使用使用者名稱進行區分。

然後構造測試用例,建立一個新的使用者,訪問使用者的個人資訊頁面,並檢視頭像是否存在。

session測試

web網頁為了保持會話上下文資訊,使用session快取資料。我們在之前的文章內有過詳細的說明。 那麼現在我們看一看,如何對session進行測試。

比如某個頁面,斷言某個鍵值是否匹配:

$this->assertSessionHas('key', 'value');

或者同時根據不同的規則,測試不同的資料:

$check = [    'has',    'hasWithThisValue' => 'thisValue',];$this->assertSessionHasAll($check);

laravel在表單驗證中使用 throw exception 的方式返回,併為頁面寫入 errors 陣列, 記錄驗證錯誤資訊。我們測試某個頁面是否有錯誤資訊:

$this->post('test-route', ['failing' => 'data']);$this->assertSessionHasErrors(['name', 'email']);
Cache快取測試

測試快取,與session類似,不過更加精簡。因為cache是全域性的資料, 比如測試某個鍵值對的正確性:

Cache::put('key', 'value', 15);$this->assertEquals('value', Cache::get('key'));

大致如此,不過多贅述。

Cookie測試

使用者端快取一些資料,可以有效降低網路請求量。但是在laravel中,為了安全性,cookie資料都是經過加密處理的, 我們如果直接在測試用例中使用,是辦不到的。所以需要首先排除在測試中的cookie加密。

我們看一下注冊的預設中介軟體的內容:

protected $middlewareGroups = [    'web' => [        \\App\\Http\\Middleware\\EncryptCookies::class,   ],],        

然後檢視 EncryptCookies 檔案,該類內提供了方法:

protected $except = [];

此處填寫cookie名,指定不用加密的那些鍵名。這種方法新增的cookie名全域性不加密, 但是對於專門在測試時不使用加密的方法,有些矯枉過正。所以我們需要在測試用例中, 實時宣告不加密,那麼只需在測試方法中這樣實現:

在中介軟體內實時宣告cookie名不加密,然後請求url並傳入cookie,最後斷言cookie的值。

如果出於一些考慮,在全域性不加密的情況下,要測試單個加密的cookie值, 那麼可以手動加密字串並傳入url中:

$encryptedBaz = app(Encrypter::class)->encrypt('baz');

Encrypter就是laravel框架用來加密cookie值的方法。

寫在最後

本文通過對網頁端的session,cookie,cache等元件值的測試, 演示了常用的構造測試用例的方法。在測試之前,需要大家對laravel的框架中, 處理此種快取資料的方法有所深入了解。

Happy coding :-)

最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • APP開發應該選擇原生開發還是混合開發