2023-12-18|閱讀時間 ‧ 約 39 分鐘

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

前一天我們實作了第一個測試,我們學到了第一個 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 函數。

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

參考資料

本系列文章目錄

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.