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

閱讀時間約 18 分鐘

前一天我們實作了第一個測試,我們學到了第一個 Assert 函數 assertEquals。 今天讓我們來了解其他常用的 Assert 函數吧!

通用型 Assertion 函數

assertEmpty

  • 函數簽名assertEmpty(mixed $actual[, string $message = ''])
  • 函數說明: 從字面上來解釋,這個函數是用來判斷第1個輸入參數 $actual 是否為 Empty,PHP常見空值可參考PHP官方函數 empty() 的說明。
  • 實作範例
/**  * Example for assertEmpty()  * @return void  */ 

public function testAssertEmpty() {

// 七種「空」值

$emptyArray = [];

$emptyString = '';

$null = null;

$zeroInt = 0;

$zeroFloat = 0.0;

$zeroIntString = '0';

$false = FALSE;
  // 以下各 Assertion 皆會通過測試

$this->assertEmpty($emptyArray); $this->assertEmpty($emptyString); $this->assertEmpty($null); $this->assertEmpty($zeroInt); $this->assertEmpty($zeroFloat); $this->assertEmpty($zeroIntString); $this->assertEmpty($false); }

要特別注意的是, "0" 會被認定為空值,但 "0.0" 卻不會,這點要小心。

assertEquals

  • 函數簽名: assertEquals(mixed $expected, mixed $actual[, string $message = ''])
  • 函數說明: 此函數可用以判斷,第1個參數 $expected 與第2個參數 $actual,兩者之值是否相等。
  • 實作範例
/**  * Example for assertEquals()  * @return void  */ 

public function testAssertEquals() {

// 範例值

$string = 'string';

$intOne = 1;

$intZero = 0;

$floatOne = 1.0;

$floatZero = 0.0;

$array1 = [];

$array2 = ['string'];

$stdClass1 = new \\stdClass();

$stdClass1->a_field = 'a';

$stdClass2 = new \\stdClass();

$stdClass2->a_field = 'a';
  // 以下各 Assertion 皆會通過測試     

$this->assertEquals('string', $string); $this->assertEquals(1, $intOne); $this->assertEquals(0, $intZero); $this->assertEquals(1.0, $floatOne); $this->assertEquals(0.0, $floatZero); $this->assertEquals([], $array1); $this->assertEquals(['string'], $array2); $this->assertEquals($stdClass1, $stdClass2); // 以下為非相同資料型態,但會判定為相等的情況

$this->assertEquals($intOne, $floatOne); $this->assertEquals($intZero, $floatZero); }

要特別注意的是,$intOne 會被認定為與 $floatOne 相等,$intZero 與 $floatZero 也是。

assertSame

  • 函數簽名assertSame(mixed $expected, mixed $actual[, string $message = ''])
  • 函數說明: 此函數可用以判斷,第1個參數 $expected 與第2個參數 $actual,兩者之資料型態與值是否相等。
  • 實作範例
/**  * Example for assertSame()  * @return void  */ 

public function testAssertSame() {

// 範例值

$string = 'string';

$intOne = 1;

$intZero = 0;

$floatOne = 1.0;

$floatZero = 0.0;

$array1 = [];

$array2 = ['string'];
  // 範例物件     

$stdClass1 = new \\stdClass(); $stdClass1->a_field = 'a'; $stdClass2 = new \\stdClass(); $stdClass2->a_field = 'a'; $stdClass3 = $stdClass2; // 以下各 Assertion 皆會通過測試

$this->assertSame('string', $string); $this->assertSame(1, $intOne); $this->assertSame(0, $intZero); $this->assertSame(1.0, $floatOne); $this->assertSame(0.0, $floatZero); $this->assertSame([], $array1); $this->assertSame(['string'], $array2); // 以下 Assertion 會通過測試,因兩者指向相同的物件參考位置

$this->assertSame($stdClass3, $stdClass2); // 以下為非相同資料型態,但會判定為相等的情況 $this->assertSame($intOne, $floatOne); $this->assertSame($intZero, $floatZero); // 以下 Assertion 將會不通過測試,因兩者所指向之物件參考位置不同

$this->assertSame($stdClass1, $stdClass2); }

值得一提的是,與 assertEquals() 相同的是,$intOne 會被認定為與 $floatOne 相等,$intZero 與 $floatZero 也是;與 assertEquals() 不同的是,它會認定2個擁有相同屬性結構的類別變數是 不同的。

assertTrue

  • 函數簽名: assertTrue(bool $condition[, string $message = ''])
  • 函數說明: 此函數可用以判斷,第1個參數是否為 TRUE 。
  • 實作範例
/**  * Example for assertTrue()  * @return void  */ 

public function testAssertTrue() {

$notEmptyString = 'a';

$notZeroInt = 1;

$notZeroFloat = 0.1;

$stdClass = new \\stdClass();

$true = TRUE;
  // 以下各 Assertion 皆會通過測試     

$this->assertTrue(true); $this->assertTrue($true); $this->assertTrue(1 == 1); $this->assertTrue(1 === 1); $this->assertTrue($true); // 以下 Assertion 將會不通過測試

$this->assertTrue($notEmptyString); $this->assertTrue($notZeroInt); $this->assertTrue($notZeroFloat); $this->assertTrue($stdClass); }

特別注意,assertTrue的第1個參數之資料型態必須是bool,代入字串或其他資料型態都會不通過。

assertFalse

  • 函數簽名assertFalse(bool $condition[, string $message = ''])
  • 函數說明: 與 assertTrue 相對,此函數可用以判斷,第1個參數是否為 FALSE 。
  • 實作範例
/**  * Example for assertFalse()  * @return void  */ 

public function testAssertFalse() {

$notEmptyString = 'a';

$notZeroInt = 1;

$zeroInt = 0;

$notZeroFloat = 0.1;

$zeroFloat = 0.0;

$stdClass = new \\stdClass();

$false = FALSE;
  // 以下各 Assertion 皆會通過測試     

$this->assertFalse(false); $this->assertFalse($false); $this->assertFalse(1 > 1); $this->assertFalse(1 < 1); $this->assertFalse(1 != 1); // 以下 Assertion 將會不通過測試

$this->assertFalse($notEmptyString); $this->assertFalse($notZeroInt); $this->assertFalse($zeroInt); $this->assertFalse($notZeroFloat); $this->assertFalse($zeroFloat); $this->assertFalse($stdClass);}

同樣要注意,assertFalse的第1個參數之資料型態必須是bool,代入字串或其他資料型態都會不通過。

assertIsArray

  • 函數簽名assertIsArray($actual[, $message = ''])
  • 函數說明: 顧名思義,此函數可用來判斷第1個參數是否為 Array 型態。
  • 實作範例
/**  * Example for assertIsArraye()  * @return void  */ 

public function testAssertIsArray() {

$array1 = [];

$array2 = ['2'];

$array3 = ['key' => 'value'];

$collection = collect([]);

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

$this->assertIsArray($array1);

$this->assertIsArray($array2);

$this->assertIsArray($array3);

$this->assertIsArray($collection->toArray());
  // 以下 Assertion 將會不通過測試     

$this->assertIsArray($collection); }

特別注意的是,當你想判定的對象可能是 Collection 時,直接代入 assertIsArray() 將導致判定不通過。

assertIsInt

  • 函數簽名assertIsInt($actual[, $message = ''])
  • 函數說明: 此函數可用來判斷第1個參數是否為 Int 型態。
  • 實作範例
/**  * Example for assertIsInt()  * @return void  */ 

public function testAssertIsInt() {

$int1 = 0;

$int2 = 1;

$float1 = 0.0;

$float2 = 1.0;

$string1 = '0';

$string2 = '1';
  // 以下各 Assertion 皆會通過測試     

$this->assertIsInt($int1); $this->assertIsInt($int2); // 以下 Assertion 將會不通過測試 $this->assertIsInt($float1); $this->assertIsInt($float2); $this->assertIsInt($string1); $this->assertIsInt($string2); }

assertIsFloat

  • 函數簽名assertIsFloat($actual[, $message = ''])
  • 函數說明: 此函數可用來判斷第1個參數是否為 Float 型態。
  • 實作範例
/**  * Example for assertIsFloat()  * @return void  */ 

public function testAssertIsFloat() {

$float1 = 0.0;

$float2 = 1.0;

$float3 = -1.0;
  // 以下各 Assertion 皆會通過測試     

$this->assertIsInt($float1); $this->assertIsInt($float2); $this->assertIsInt($float3); }

以上是幾個通用型 Assertion 函數,有興趣的讀者,可參考範例練習看看。

下一篇來介紹 Cookie、Session、HTTP 相關的 Assertion 函數。

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

參考資料

本系列文章目錄

8會員
224內容數
歡迎來到 WilliamP 的沙龍天地,在這裡將與各位讀者探討各種主題,包刮高中數學題庫、PHP開發經驗、LINE聊天機器人開發經驗、書摘筆記等,歡迎交流!
留言0
查看全部
發表第一個留言支持創作者!
WilliamP的沙龍 的其他內容
今天我們來寫第一個單元測試吧! 不過在那之前,先讓我們了解單元測試的「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 因為該系 統在子公司運作得不錯, 因此集團高層想將它擴展成,全集團都可使用的規模
今天我們來寫第一個單元測試吧! 不過在那之前,先讓我們了解單元測試的「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
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
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
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
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 測試的各環節,包含環境準備、套件安裝、腳本編寫、執行測試與整合。