PHPUnit 自動化測試大作戰【CH05】

閱讀時間約 12 分鐘

前一天與大家分享了幾個通用型 Assertion 函數,今天來為大家介紹幾個 HTTP 相關的 Assertion 函數吧!

今天要介紹的各函數,其使用方式和前一天所介紹的略有不同。以下所列各函數,皆是基於 HTTP Response 來做驗證測試,因此大家會看到 $response = $this->get('/') 像這樣的語句,執行到這語句時,PHPUnit 將會執行HTTP Resquest GET / ,相當於用瀏覽器開啟網站根網址,或是用 Postman 打網站的根網址。更多詳細說明可參考此連結

除此之外,今天會提到的各個 Assertion 函數,並非 PHPUnit 內建,而是由 Laravel 所擴充,因此需注意是否有確實引用到 use Tests\\TestCase ,該檔通常位於 tests/ 底下:

<?php

// tests/TestCase.php

namespace Tests;

use Illuminate\\Foundation\\Testing\\TestCase as BaseTestCase;

abstract class TestCase extends BaseTestCase{

use CreatesApplication;

}

Cookie & Session

assertCookie

  • 函數簽名:$response->assertCookie($cookieName, $value = null)
  • 函數說明: 可驗證回應中是否含有 $cookieName 之 Cookie,且是否與給定之 $value 值相等。
  • 實作範例:
Route::get('/assertCookie', function () {

return response('')->withCookie('cookieName', 'cookieValue');

});
/** * Example for assertCookie() * @return void */

public function testAssertCookie(){

$response = $this->get('/assertCookie');

// 通過測試

$response->assertCookie('cookieName', 'cookieValue');

}

assertCookieMissing

  • 函數簽名$response->assertSessionHas($key, $value)
  • 函數說明: 可驗證回應中是否不含 $cookieName 之 Cookie。
  • 實作範例
Route::get('/assertCookieMissing', function () {

return response('')->withCookie('cookieName', 'cookieValue');

});
/** * Example for assertCookieMissing() * @return void */

public function testAssertCookieMissing(){

$response = $this->get('/assertCookie');

// 通過測試

$response->assertCookieMissing('cookieName2');

}

assertSessionHas

  • 函數簽名
  • 函數說明: 可驗證在回應請求後,Laravel Session 儲存庫是否含有指定 Key 值的 Session。
  • 實作範例
Route::get('/assertSessionHas', function () {

Session::put('sessionKey', 'sessionValue');

return response('');

});
/** * Example for assertSessionHas() * @return void */

public function testassertSessionHas(){

$response = $this->get('/assertSessionHas');

// 通過測試

$response->assertSessionHas('sessionKey');

}

HTTP

assertSuccessful、assertOk、assertNotFound、assertForbidden、assertUnauthorized、assertUnprocessable

  • 函數簽名

$response->assertSuccessful()

$response->assertOk()

$response->assertNotFound()

$response->assertForbidden()

$response->assertUnauthorized()

$response->assertUnprocessable()

  • 函數說明: 這6個函數所驗證的情境很單純,都是驗證 HTTP Status Code,細部分別如下:

assertSuccessful:回應為成功類HTTP Status Code(>= 200 and < 300)

assertOk:回應為 200 HTTP Status Code

assertNotFound:回應為 400 HTTP Status Code

assertForbidden:回應為 403 HTTP Status Code

assertUnauthorized:回應為 401 HTTP Status Code

assertUnprocessable:回應為 422 HTTP Status Code

  • 實作範例
Route::get('/notFound', function () {

return response('', 404);

});Route::get('/ok', function () {

return response('', 200);

});Route::get('/successful', function () {

return response('', 201);

});Route::get('/forbidden', function () {

return response('', 403);

});Route::get('/unauthorized', function () {

return response('', 401);

});Route::get('/unprocessable', function () {

return response('', 422);

});
/** * Example for assertSuccessful()、assertOk()、assertNotFound()、assertForbidden()、assertUnauthorized()、assertUnprocessable() * @return void */

public function testAssertHttpStatusCode(){

$response1 = $this->get('/notFound');

$response2 = $this->get('/ok');

$response3 = $this->get('/successful');

$response4 = $this->get('/forbidden');

$response5 = $this->get('/unauthorized');

$response6 = $this->get('/unprocessable');

// 以下各 Assertion 皆會通過測試

$response1->assertNotFound();

$response2->assertOk();

$response3->assertSuccessful();

$response4->assertForbidden();

$response5->assertUnauthorized();

$response6->assertUnprocessable();

}

assertJson

  • 函數簽名$response->assertJson(array $data, $strict = false)
  • 函數說明: 此函數會驗證回應是否為JSON格式,並且判斷其JSON結構(包含欄位及值)是否包含給定的 $data 結構(包含欄位及值)。
  • 實作範例
Route::get('/assertJson', function () {

return response()->json(

[ 'field1' => 'value1',

'field2' => 'value2',

] );});
/** * Example for assertJson() * @return void */

public function testAssertJson(){

$response = $this->get('/assertJson');

// 通過測試

$response->assertJson(['field1' => 'value1']);

}

assertJsonStructure

  • 函數簽名: $response->assertJsonStructure(array $structure)
  • 函數說明:與前一個函數不同,此函數只驗證是否含有給定的結構(不驗證值)。
  • 實作範例
Route::get('/assertJsonStructure', function () {

return response()->json(

[ 'a' => [

'b' => [

'c',

], ], ] );});
/** * Example for assertJsonStructure() * @return void */

public function testAssertJsonStructure(){

$response = $this->get('/assertJsonStructure');

// 通過測試

$response->assertJsonStructure(['a' => ['b']]);

}

以上就是今天所介紹的 HTTP 相關 Assertion 函數。

下一篇來介紹資料庫相關的 Assertion 函數。

如果您喜歡這篇文章,歡迎加入追蹤以接收新文章通知 😄

參考資料

本系列文章目錄

avatar-img
8會員
240內容數
歡迎來到 WilliamP 的沙龍天地,在這裡將與各位讀者探討各種主題,包刮高中數學題庫、PHP開發經驗、LINE聊天機器人開發經驗、書摘筆記等,歡迎交流!
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
WilliamP的沙龍 的其他內容
前一天我們實作了第一個測試,我們學到了第一個 Assert 函數 assertEquals。 今天讓我們來了解其他常用的 Assert 函數吧! 通用型 Assertion 函數 assertEmpty 函數簽名:assertEmpty(mixed $actual[, string $mess
今天我們來寫第一個單元測試吧! 不過在那之前,先讓我們了解單元測試的「3個A」 單元測試3A 所謂的「3個A」,是指以下三個英文單字: Arrange:初始化工作,如準備假資料 Act:執行測試對象 Assert:驗證結果 一個良好的單元測試案例,應該包含以上的結構, 依序執行 Arra
下載與設定 Laradock 首先,讓我們在Home資料夾下,將 Laradock 下載下來: cd ~ && git clone <https://github.com/Laradock/laradock.git> Laradock 將 Laradock 下載回來後,切換到 Laradock
初遇自動化測試 在數年前,我剛從第一份工作離職,轉職到第二份工作, 新工作是在一個大集團的IT部門,職位是後端工程師。 當時集團正準備導入一個由子公司開發的微服務系統, 使用的技術是PHP 8 及 Laravel 9 因為該系 統在子公司運作得不錯, 因此集團高層想將它擴展成,全集團都可使用的規模
前一天我們實作了第一個測試,我們學到了第一個 Assert 函數 assertEquals。 今天讓我們來了解其他常用的 Assert 函數吧! 通用型 Assertion 函數 assertEmpty 函數簽名:assertEmpty(mixed $actual[, string $mess
今天我們來寫第一個單元測試吧! 不過在那之前,先讓我們了解單元測試的「3個A」 單元測試3A 所謂的「3個A」,是指以下三個英文單字: Arrange:初始化工作,如準備假資料 Act:執行測試對象 Assert:驗證結果 一個良好的單元測試案例,應該包含以上的結構, 依序執行 Arra
下載與設定 Laradock 首先,讓我們在Home資料夾下,將 Laradock 下載下來: cd ~ && git clone <https://github.com/Laradock/laradock.git> Laradock 將 Laradock 下載回來後,切換到 Laradock
初遇自動化測試 在數年前,我剛從第一份工作離職,轉職到第二份工作, 新工作是在一個大集團的IT部門,職位是後端工程師。 當時集團正準備導入一個由子公司開發的微服務系統, 使用的技術是PHP 8 及 Laravel 9 因為該系 統在子公司運作得不錯, 因此集團高層想將它擴展成,全集團都可使用的規模
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
練習 PHPUnit 測試的撰寫,依序創建Controller、Service,並針對計算邏輯進行單元測試的練習。
Thumbnail
在 Laravel 中的測試中,PHPUnit 和 Mockery 都可以用來創建測試替身(test double),但它們有不同的方式和功能,以下簡單介紹兩種寫法方式。
前言 基本準備差不多了,也能跑自己的測試,再來就是關於測試腳本的核心:元素定位跟動作,本篇會著重介紹 XPATH 定位的部分
Thumbnail
前言 上篇我們成功執行第一個測試案例,從 Python 腳本透過 Appium 控制模擬器點選設定中的電池,下個問題就是怎麼找元件,這時候就要請出 Appium Inspector 了
前言 經過五個小單元的準備,終於可以開始跑第一個測試了,Appium 本身是個工具,可以搭配各種語言,這邊選擇 Python 作為測試腳本語言,以便之後跟 Robot Framework 串接。
前言 前四篇,把主機作業系統跟待測物準備交代完畢,有需要請自行跳轉取用,接下來就是測試工具的部分,這次測試套件使用大名鼎鼎 Appium 2。 選擇 Appium 2 的理由 歷史悠久:Appium 2012 年公開之後,就廣受測試社群愛戴 站在巨人的肩榜上:架構類似 Selenium的主從式架構,
前言 前幾篇聊到作業系統、Docker 跟 Android 容器的準備,再來就是替 Android 容器開啟 Google Play 套件並安裝待測 App 供後續手動或者自動測試使用。
前言 前兩篇把作業系統跟 Docker 安裝講完了,接下來就是 Android 容器的安裝了,這裡選用 ReDroid ,因為它是開源、高效、又便於管理的方案。
Thumbnail
前言 前篇把 Ubuntu 作業系統的安裝跟準備談完了,有需要可以跳回去看。接下來聊容器服務 Docker 的安裝與使用。 Docker 可以應用的場合很多,這次是會用它來模擬 Android 受測裝置
前言 本 App 自動化測試專題,用來記錄自動化 App 測試的各環節,包含環境準備、套件安裝、腳本編寫、執行測試與整合。
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
練習 PHPUnit 測試的撰寫,依序創建Controller、Service,並針對計算邏輯進行單元測試的練習。
Thumbnail
在 Laravel 中的測試中,PHPUnit 和 Mockery 都可以用來創建測試替身(test double),但它們有不同的方式和功能,以下簡單介紹兩種寫法方式。
前言 基本準備差不多了,也能跑自己的測試,再來就是關於測試腳本的核心:元素定位跟動作,本篇會著重介紹 XPATH 定位的部分
Thumbnail
前言 上篇我們成功執行第一個測試案例,從 Python 腳本透過 Appium 控制模擬器點選設定中的電池,下個問題就是怎麼找元件,這時候就要請出 Appium Inspector 了
前言 經過五個小單元的準備,終於可以開始跑第一個測試了,Appium 本身是個工具,可以搭配各種語言,這邊選擇 Python 作為測試腳本語言,以便之後跟 Robot Framework 串接。
前言 前四篇,把主機作業系統跟待測物準備交代完畢,有需要請自行跳轉取用,接下來就是測試工具的部分,這次測試套件使用大名鼎鼎 Appium 2。 選擇 Appium 2 的理由 歷史悠久:Appium 2012 年公開之後,就廣受測試社群愛戴 站在巨人的肩榜上:架構類似 Selenium的主從式架構,
前言 前幾篇聊到作業系統、Docker 跟 Android 容器的準備,再來就是替 Android 容器開啟 Google Play 套件並安裝待測 App 供後續手動或者自動測試使用。
前言 前兩篇把作業系統跟 Docker 安裝講完了,接下來就是 Android 容器的安裝了,這裡選用 ReDroid ,因為它是開源、高效、又便於管理的方案。
Thumbnail
前言 前篇把 Ubuntu 作業系統的安裝跟準備談完了,有需要可以跳回去看。接下來聊容器服務 Docker 的安裝與使用。 Docker 可以應用的場合很多,這次是會用它來模擬 Android 受測裝置
前言 本 App 自動化測試專題,用來記錄自動化 App 測試的各環節,包含環境準備、套件安裝、腳本編寫、執行測試與整合。